第4章类和对象基础内容提要•Java语言是面向对象的语言,类和对象是Java语言最基本的要素。本章要点•本章首先介绍面向对象的基本概念,然后介绍如何定义类、如何定义类的成员变量和成员方法;如何创建和使用对象;如何定义重载方法和构造方法、方法参数的传递;static变量和方法的使用;包的概念和import语句的使用等。4.1面向对象基础•4.1.1面向对象的基本概念•4.1.2面向对象的基本特征4.1.1面向对象的基本概念1.对象在现实世界中,对象(object)无处不在。我们身边存在的一切事物都是对象,例如一个人、一辆汽车、一台电视机、一所学校甚至一个地球,这些都是对象。除了这些可以触及的事物是对象外,还有一些抽象的概念,例如一次会议、一场足球比赛、一次账户等也都可以抽象为一个对象。一个对象一般具有两方面的特征:状态和行为。状态用来描述对象的静态特征,行为用来描述对象的动态特征。4.1.1面向对象的基本概念•例如,一辆汽车可以用下面的特征描述:生产厂家、颜色、最高时速、出厂年份、价格等。汽车可以启动、加速、转弯和停止等,这些是汽车所具有的行为或者说施加在汽车上的操作。•再比如,一场足球比赛可以通过比赛时间、比赛地点、参加的球队和比赛结果等特性来描述。软件对象也是对现实世界对象的状态和行为的模拟,如软件中的窗口就是一个对象,它可以有自己的状态和行为。4.1.1面向对象的基本概念•通过上面的说明,可以给“对象”下一个定义,即对象是现实世界中的一个实体,它具有如下特征:–有一个状态用来描述它的某些特征。–有一组操作,每个操作决定对象的一种功能或行为。4.1.1面向对象的基本概念2.类(class)•类是面向对象系统中最重要的概念。在日常生活中经常提到类这个词,如人类、鱼类、鸟类等。类可以定义为具有相似特征和行为的对象的集合,如人类共同具有的区别于其他动物的特征有直立行走、使用工具、使用语言交流等。所有的事物都可以归到某类中。例如,家用电器是一类电子产品。•属于某个类的一个具体的对象称为该类的一个实例(instance)。例如,我的汽车是汽车类的一个实例。实例与对象是同一个概念。4.1.1面向对象的基本概念•类与实例的关系是抽象与具体的关系。类是多个实例的综合抽象,实例是某个类的个体实物。在Java语言中,类是一种数据类型。对于汽车类(Car)可以通过下面方式定义。publicclassCar{privateStringmodel;//品牌privatedoubleprice;//价格privateintyear;//生产年份publicvoidstart(){}//启动方法publicvoidspeedUp(doublespeed){}//加速方法4.1.1面向对象的基本概念publicvoidspeedDown(doublespeed){}//减速方法publicvoidstop(){}//停止方法}要创建一个汽车类的实例,可以使用new运算符,例如:CarmyCar=newCar();4.1.1面向对象的基本概念3.消息•对象与对象之间不是孤立的,它们之间存在着某种联系,这种联系是通过消息传递的。例如,开汽车就是人向汽车传递消息。•一个对象发送的消息包含3个方面的内容:接收消息的对象;接收对象采用的方法;方法所需要的参数。请看下面下面两行代码。myCar.start();//启动汽车myCar.speedUp(50);//加速到50公里/小时•这里,myCar是接收消息的对象,start()和speedUp()是接收对象采用的方法,50为speedUp()方法的参数。一般发送消息的对象不用指定。4.1.2面向对象的基本特征•为支持面向对象的设计原理,所有OOP语言,包括Java在内,都有三个特性:封装性、继承性和多态性。1.封装性•封装(encapsulation)就是把对象的状态(属性)和行为(方法)结合成一个独立的系统单位,并尽可能地隐藏对象的内部细节。例如,一辆汽车就是一个封装体,它封装了汽车的状态和操作。•封装使一个对象形成两个部分:接口部分和实现部分。对用户来说,接口部分是可见的,而实现部分是不可见的。4.1.2面向对象的基本特征•封装提供了两种保护。首先封装可以保护对象,防止用户直接存取对象的内部细节;其次封装也保护了客户端,防止对象实现部分的改变可能产生的副作用,即实现部分的改变不会影响到客户端的改变。•在对象中,代码或数据对该对象来说都可以是私有的(private)或公有的(public)。私有代码和数据仅能被对象本身的其他部分访问,不能被该对象外的任何程序部分所访问。当代码或数据是公有的时,虽然它们是定义在对象中的,但程序的其他部分也可以访问。4.1.2面向对象的基本特征•类是Java的基本封装单位。类定义了对象的形式,指定了数据和操作数据的代码。Java使用一个类规范来构造对象。对象是类的实例。因此,类在本质上是指定如何构建对象的一系列规定。•组成类的代码或数据称为类的成员(member)。具体来说,类定义的数据称为成员变量(membervariable)或实例变量(instancevariable)。•处理这些数据的代码称为成员方法(membermethod)或简称为方法(method)。方法是子例程在Java中的术语。4.1.2面向对象的基本特征2.继承性•继承(inheritance)的概念普遍存在于现实世界中。它是一个对象获得另一个对象的属性的过程。继承之所以重要,是因为它支持层次结构类的概念。我们发现,在现实世界中,许多知识都是通过层次结构方式进行管理的。•例如,一个富士苹果是苹果类的一部分,而苹果又是水果类的一部分,水果类则是食物类的一部分。食物类具有的某些特性(可食用,有营养)也适用于它的子类水果。除了这些特性以外,水果类还具有与其他食物不同的特性(多汁、味甜等)。苹果类则定义了属于苹果的特性(长在树上、非热带植物)。4.1.2面向对象的基本特征•如果不使用层次结构,那么对象就不得不明确定义出自己的特征。•如果使用继承,对象就只需定义使自己在类中不同的属性就可以了,至于基本的属性则可以从自己的父类继承。•继承性体现了类之间的是一种(IS-A)关系。•类之间的关系还有组合、关联等。食物米饭水果蔬菜橘子苹果图4.1食物类及子类层次4.1.2面向对象的基本特征3.多态性•多态性(polymorphism)是面向对象编程语言的一个重要特性。所谓多态,是指一个程序中相同的名字表示不同含义的情况。面向对象的程序中的多态有多种情况。•在简单的情况下,在同一个类中定义了多个名称相同的方法,即方法重载,另一种情况是子类中定义的与父类中的方法同名的方法,即方法覆盖。这两种情况都称为多态,且前者称为静态多态,后者称为动态多态。有关Java语言的多态性请参考7.6节的介绍。4.2Java类与对象•4.2.1类的定义•4.2.2对象的使用•4.2.3用UML图表示类•4.2.4理解栈与堆4.2Java类与对象•本节讨论使用Java语言定义类和创建对象。类和对象这两个术语在Java语言中非常重要。Java程序的所有代码都存放在类中,程序的运行就是各种对象的相互作用。•类是组成Java程序的基本要素,它封装了一类对象的状态和行为,是这一类对象的原形。定义一个新的类,就创建了一种新的数据类型,实例化一个类,就得到一个对象。4.2.1类的定义•可以说Java程序一切都是对象。要想得到对象,首先必须定义类(也可以使用事先定义好的类),然后创建对象。先看下面的程序代码。程序4.1Circle.java4.2.1类的定义•程序定义了一个Circle类表示圆,编译该程序可得到一个Circle.class类文件。在该类中定义了一个变量radius表示圆的半径,另外定义了4个方法,分别是设置和返回圆的半径、求圆的周长和面积。其中圆周率使用了java.lang.Math.PI常量。有了Circle类,就可以创建该类的对象,然后调用对象的方法完成有关操作,如求一个圆的面积等。4.2.1类的定义一个类的定义包括两个部分:类声明和类体的定义。•1.类声明类声明的一般格式为:[public][abstract|final]classClassName[extendsSuperClass][implementsInterfaceNameList]{//成员变量声明//成员方法声明}4.2.1类的定义说明:•(1)类的修饰符类的访问修饰符可以是public或者缺省。若类用public修饰,则该类称为公共类,公共类可被任何包中的类使用。若不加public修饰符,类只能被同一包中的其他类使用。如果类使用abstract修饰符,则该类为抽象类,抽象类不能被实例化,即不能创建该类的对象。若用final修饰则该类为最终类,最终类不能被继承。•(2)classClassName类的定义使用class关键字,ClassName为类名,类名是由类的定义者确定的。一般类名以大写字母开头,如Circle、Employee、MyPoint、ComplexNumber等,这是Java类命名的约定(不是必须的)。4.2.1类的定义•(3)extendsSuperClass如果一个类要继承某个类需使用extends指明该类的超类,SuperClass为超类名,即定义该类继承了哪个类。如果定义类的时候没有指明所继承的超类,那么它自动继承Object类,Object类是Java的根类。因为Java只支持单继承,所以一个类至多只能有一个超类。有关继承的概念将在7.1节讲述。•(4)implementsInterfaceNameList该选项定义该类实现哪个或哪些接口。一个类可以实现多个接口,若实现多个接口,接口名中间用逗号分开。有关接口的概念将在7.6节讲述。4.2.1类的定义•2.成员变量的定义类声明结束后是一对大括号,大括号括起来的部分称为类体。类体中通常定义两部分内容:成员变量(membervariable)和成员方法(membermethod)。成员变量和成员方法称为成员(members)。成员变量提供类及对象的状态,成员方法实现类及对象的行为。成员变量的声明格式为:[public|protected|private][static][final][transient][volatile]typevariableName[=value];4.2.1类的定义说明:•(1)变量的访问修饰符public|protected|private为变量的访问修饰符。用public修饰的变量为公共变量,公共变量可以被任何方法访问;用protected修饰的变量称为保护变量,保护变量可以被同一个包中的类或子类访问;没有使用访问修饰符,该变量只能被同一个包中的类访问;用private修饰的变量称为私有变量,私有变量只能被同一个类的方法访问。•(2)实例变量和类变量如果变量用static修饰,则该变量称为类变量,类变量又称为静态变量。没有用static修饰的变量称为实例变量。关于实例变量和类变量的使用,请参阅4.4节。4.2.1类的定义•(3)变量类型和变量名typevariableName用来指定成员变量的类型和变量名。成员变量的类型可以是任何Java数据类型,包括基本数据类型和引用数据类型。•(4)使用final修饰的变量叫作最终变量,也称为标识符常量。常量可以在声明时赋初值,也可以在后面赋初值,一旦为其赋值,就不能再改变了。•(5)用transient修饰的变量称为临时变量。临时变量在对象序列化时不被作为持久状态的一部分存储。•(6)用volatile修饰的变量称为共享变量。在多线程的程序中,共享变量可以被异步修改。4.2.1类的定义•3.成员方法的定义类体中另一个重要的成份是成员方法。方法用来实现对象的动态特征,也是在类的对象上可完成的操作。•成员方法的定义包括方法的声明和方法体的定义,一般格式如下:[public|protected|private][static][fin