1第二章类与对象的基本概念JAVA语言程序设计JAVA语言程序设计2目录2.1类与对象2.2对象初始化和回收2.3应用举例2.4本章小节JAVA语言程序设计3类与对象–在程序中,对象是通过一种抽象数据类型来描述的,这种抽象数据类型称为类(Class)–一个类是对一类对象的描述。类是构造对象的模板–对象是类的具体实例2.1类与对象JAVA语言程序设计42.1.1类的声明声明形式[public][abstract|final]class类名称[extends父类名称][implements接口名称列表]{变量成员声明及初始化;方法声明及方法体;}类与对象JAVA语言程序设计5关键字–class表明其后声明的是一个类。–extends如果所声明的类是从某一父类派生而来,那么,父类的名字应写在extends之后–implements如果所声明的类要实现某些接口,那么,接口的名字应写在implements之后2.1.1类的声明(续)类与对象JAVA语言程序设计6修饰符–可以有多个,用来限定类的使用方式–public表明此类为公有类–abstract指明此类为抽象类–final指明此类为终结类类声明体–变量成员声明及初始化可以有多个–方法声明及方法体可以有多个2.1.1类的声明(续)类与对象JAVA语言程序设计7钟表类publicclassClock{//成员变量inthour;intminute;intsecond;//成员方法publicvoidsetTime(intnewH,intnewM,intnewS){hour=newH;minute=newM;second=news;}publicvoidshowTime(){System.out.println(hour+:+minute+:+second);}}2.1.1类的声明(续)——例2_1类与对象JAVA语言程序设计8变量和对象–变量除了存储基本数据类型的数据,还能存储对象的引用,用来存储对象引用的变量称为引用变量–类的对象也称为类的实例2.1.2对象的声明与引用类与对象JAVA语言程序设计9对象的声明–格式类名变量名例如Clock是已经声明的类名,则下面语句声明的变量aclock将用于存储该类对象的引用:Clockaclock;–声明一个引用变量时并没有对象生成2.1.2对象的声明与引用(续)类与对象JAVA语言程序设计10对象的创建–生成实例的格式:new类名()例如:aclock=newClock()其作用是:在内存中为此对象分配内存空间返回对象的引用(reference,相当于对象的存储地址)–引用变量可以被赋以空值例如:aclock=null;2.1.2对象的声明与引用(续)类与对象JAVA语言程序设计112.1.3数据成员数据成员–表示Java类的状态–声明数据成员必须给出变量名及其所属的类型,同时还可以指定其他特性–在一个类中成员变量名是唯一的–数据成员的类型可以是Java中任意的数据类型(简单类型,类,接口,数组)–分为实例变量和类变量类与对象JAVA语言程序设计12–声明格式[public|protected|private][static][final][transient][volatile]变量数据类型变量名1[=变量初值],变量名2[=变量初值],…;–格式说明public、protected、private为访问控制符static指明这是一个静态成员变量final指明变量的值不能被修改transient指明变量是临时状态volatile指明变量是一个共享变量2.1.3数据成员(续)类与对象JAVA语言程序设计13实例变量–没有static修饰的变量称为实例变量(InstanceVariables)–用来存储所有实例都需要的属性信息,不同实例的属性值可能会不同–可通过下面的表达式访问实例属性的值实例名.实例变量名2.1.3数据成员(续)——实例变量类与对象JAVA语言程序设计14声明一个表示圆的类,保存在文件Circle.java中。然后编写测试类,保存在文件ShapeTester.java中,并与Circle.java放在相同的目录下publicclassCircle{intradius;}publicclassShapeTester{publicstaticvoidmain(Stringargs[]){Circlex;x=newCircle();System.out.println(x);System.out.println(radius=+x.radius);}}2.1.3数据成员(续)——例2_2类与对象JAVA语言程序设计15编译后运行结果如下:Circle@26b249radius=0解释–@之后的数值为x所指的对象的存储地址–x的值及对象的状态如图2.1.3数据成员(续)——例2_2运行结果类与对象JAVA语言程序设计16声明一个表示矩形的类,保存在Rectangle.java中;编写测试类,保存在ShapeTester.java中,二文件保存在相同的目录下publicclassRectangle{doublewidth=10.128;doubleheight=5.734;}publicclassShapeTester{publicstaticvoidmain(Stringargs[]){Circlex;Rectangley;x=newCircle();y=newRectangle();System.out.println(x++y);}}2.1.3数据成员(续)——例2_3类与对象JAVA语言程序设计17编译后运行结果如下:Circle@82f0dbRectangle@92d342解释–Circle及Rectangle类对象的状态如图2.1.3数据成员(续)——例2_3运行结果类与对象JAVA语言程序设计18对ShapeTester类进行修改,使两个实例具有不同的实例变量值publicclassShapeTester{publicstaticvoidmain(Stringargs[]){Circlex;Rectangley,z;x=newCircle();y=newRectangle();z=newRectangle();x.radius=50;z.width=68.94;z.height=47.54;System.out.println(x.radius++y.width++z.width);}}2.1.3数据成员(续)——例2_3修改类与对象JAVA语言程序设计19编译后运行结果如下:5010.12868.94解释–Circle及Rectangle类对象的状态如图2.1.3数据成员(续)——修改后运行结果类与对象JAVA语言程序设计20地址簿程序–一个人的地址通常包括以下信息:姓名,省份,城市,街道,门牌号,邮政编码–采用过程化的程序设计方法,使用简单变量存储,则存储两个人地址的代码如下2.1.3数据成员(续)——例2_4类与对象JAVA语言程序设计21–采用面向对象的程序设计方法,则需要首先声明Address类如下publicclassAddress{Stringname;intgateNumber;StringstreetName;Stringcity;Stringprovince;StringpostalCode;//方法成员略}2.1.3数据成员(续)——例2_4类与对象JAVA语言程序设计22–主方法改写如下publicstaticvoidmain(Stringargs[]){Addressaddress1=newAddress(),address2=newAddress();address1.name=“ZhangLi;address1.streetNumber=15;address1.streetName=“TsinghuaEastRoad;address1.city=“Beijing;address1.province=“Beijing;address1.postalCode=“100084;address2.name=“LiHong;address2.streetNumber=2;address2.streetName=“BeiNong;address2.city=“Beijing;address2.province=“Beijing;address2.postalCode=“102206;//...dosomethinginteresting}2.1.3数据成员(续)——例2_4类与对象JAVA语言程序设计23类变量–也称为静态变量,声明时需加static修饰符–不管类的对象有多少,类变量只存在一份,在整个类中只有一个值–类初始化的同时就被赋值–适用情况类中所有对象都相同的属性经常需要共享的数据系统中用到的一些常量值–引用格式类名|实例名.类变量名2.1.3数据成员(续)——类变量类与对象JAVA语言程序设计24对于一个圆类的所有对象,计算圆的面积时,都需用到π的值,可在Circle类的声明中增加一个类属性PIpublicclassCircle{staticdoublePI=3.14159265;intradius;}当我们生成Circle类的实例时,在每一个实例中并没有存储PI的值,PI的值存储在类中2.1.3数据成员(续)——例2_5类与对象JAVA语言程序设计25–对类变量进行测试publicclassClassVariableTester{publicstaticvoidmain(Stringargs[]){Circlex=newCircle();System.out.println(x.PI);System.out.println(Circle.PI);Circle.PI=3.14;System.out.println(x.PI);System.out.println(Circle.PI);}}–测试结果3.141592653.141592653.143.142.1.3数据成员(续)——例2_5运行结果类与对象JAVA语言程序设计26声明一个Point类,有两个私有变量保存点坐标,一个类变量保存已有点的个数publicclassPoint{privateintx;privateinty;publicstaticintpointCount=0;publicPoint(intx,inty){this.x=x;this.y=y;pointCount++;}}2.1.3数据成员(续)——Point.java类与对象JAVA语言程序设计27测试类ex2_4classex2_4{publicstaticvoidmain(String[]args){Pointp=newPoint(1,1);System.out.println(p.pointCount);Pointq=newPoint(2,2);System.out.println(q.pointCount);System.out.println(q.pointCount==Point.pointCount);System.out.println(Point.pointCount);}}2.1.3数据成员(续)——Point类测试类与对象JAVA语言程序设计28测试结果12true22.1.3数据成员(续)——Point类测试结果类与对象JAVA语言程序设计29实例变量和类变量都可被声明为finalfinal实例变量必须在每个构造方法结束之前赋初值,以保证使用之前会被初始化final类变量必须在声明的同时初始化2.1.3数据成员(续)——final修饰符类与对象JAVA语言程序设计302.1.4方法成员方法成员–定义类的行为一个对象能够做的事情我们能够从一个对象取得的信息–可以没有,也可以有多个;一旦在类中声明了方法,它就成为了类声