Java程序设计第6章对象和类2/138学习目标•1.理解对象和类的基本概念,能定义类并能创建类的对象;理解构造方法的作用,能使用构造方法创建类的对象。•2.掌握使用Java类库中类的方法。•3.理解类的封装。•4.初步掌握面向对象程序设计。3/138内容摘要•6.1引言•6.2对象和类•6.3使用构造方法创建对象•6.4通过引用变量来访问对象•6.5使用Java类库中的类•6.6可见性修饰符、访问器和修改器•6.7数据域的封装4/138内容摘要•6.8永久对象和类•6.9给方法传递对象参数•6.10静态变量、常量和静态方法•6.11变量的作用域•6.12关键字this•6.13对象数组5/138内容摘要•6.1引言•6.2对象和类•6.3使用构造方法创建对象•6.4通过引用变量来访问对象•6.5使用Java类库中的类•6.6可见性修饰符、访问器和修改器•6.7数据域的封装6/1386.1引言•以往我们学过C语言程序设计,它需要选择数据结构、设计算法,然后再把算法用C语言编写出来。这种编程方法就是所谓的面向过程程序设计,支持这种方法的语言如C语言则称为面向过程语言。•像Java等所谓的面向对象语言不仅仍然具有面向过程语言的特点,而且通过类的封装、继承和多态性增加了灵活性、模块性、清晰性和可重用性等有益特性。7/1386.1引言•在面向过程程序设计中,数据和对数据的操作是分离的,因而这种作法需要把数据传递到函数和过程中。•而在面向对象程序设计中,把数据和属于它的操作放入一个所谓的对象(object)的整体中,这样做解决了面向过程程序设计中不可避免的许多问题。•面向对象程序设计是一种更贴近真实世界的模型组织程序;使用对象可以改进软件的可重用性,使程序更易于开发和维护。8/1386.1引言•Java程序可以看作是相互合作的对象所构成的集中。•本章介绍面向对象程序设计的基本知识:•声明类、创建对象、处理对象以及组织对象协调工作。9/138内容摘要•6.1引言•6.2对象和类•6.3使用构造方法创建对象•6.4通过引用变量来访问对象•6.5使用Java类库中的类•6.6可见性修饰符、访问器和修改器•6.7数据域的封装10/1386.2对象和类•对象(object)代表现实世界中可以明确标识的一个事物。例如,一个学生,一张桌子,一个圆,一个铵钮甚至一笔贷款都可以看作一个对象。•对象有自己独有的特性、状态和行为。对象的状态是由具有当前值的数据域的集合构成;对象的行为是由方法的集合定义的。图6-1(a)描述了一个一般对象与它的数据域和方法。调用对象的一个方法就是要求对象执行一项任务。•例如,Circle对象具有数据域radius,它是11/1386.2对象和类•圆的特征属性。圆的一个行为是使用findArea()方法计算它的面积。如图6-1(b)所示12/1386.2对象和类•类(class)是定义同一类型对象的结构。在Java的类中,数据用来描述属性,方法用来定义行为。此外,还提供一个特殊的方法,称为构造方法(constructor),调用它可以创建类的对象。构造方法很象一般的方法,可以执行任何操作,但是设计构造方法是为了进行初始化操作。例如,初始化对象的数据域。图6-2显示了Circle对象的类的例子。13/1386.2对象和类14/1386.2对象和类•注意1:Circle类与目前所见过的所有其他类不同。它没有main方法,因此,不能运行,它仅仅是一个用于声明和创建Circle对象的定义。•注意2:Circle类中定义了2个构造方法,第一个没有参数,这种没有参数的构造方法称为无参构造方法。15/138内容摘要•6.1引言•6.2对象和类•6.3使用构造方法创建对象•6.4通过引用变量来访问对象•6.5使用Java类库中的类•6.6可见性修饰符、访问器和修改器•6.7数据域的封装16/1386.3使用构造方法创建对象•构造方法必须与定义它的类有完全的名字。•和所有方法一样,构造方法可以被重载,从而更易于用不同的初始数据值来构造对象。•在类中创建一个对象,使用new操作符调用构造方法,如:•nesw类名(参数);•例如,newCircle()调Circle类中第一个构造方法,创建一个Circle对象;•newCircle(5)调Circle类中第二个构造方法,创建一个Circle对象,该对象半径为5。17/1386.3使用构造方法创建对象•一个类不声明构造方法,在这种情况下,类中隐含地声明了一个方法体为空的无参构造方法。•注意,构造方法是一种特殊方法,与一般方法有三点不同:•1)构造方法必须与所在类具有相同的名字;•2)构造方法没有返回类型,甚至连void也没有;•3)构造方法的调用是在创建一个对象时使用new操作符进行的;构造方法的作用是初始化对象。18/138内容摘要•6.1引言•6.2对象和类•6.3使用构造方法创建对象•6.4通过引用变量来访问对象•6.5使用Java类库中的类•6.6可见性修饰符、访问器和修改器•6.7数据域的封装19/1386.4通过引用变量来访问对象•新创建的对象在内存中占用空间,那么它们是如何被访问呢?20/1386.4.1引用变量和引用类型•对象通过引用变量来访问,该变量包含对象的引用地址,使用如下语法格式不说明:•类名对象引用变量名;•一个类所定义的类型被称为引用类型。任何类型为类的变量都能引用该类的一个实例。例:•CirclemyCircle;•myCircle=newCircle();21/1386.4.1引用变量和引用类型•定义引用变量和创建一个对象并使用引用变量指向该对象可以合并为一句来完成,其格式为:•类名对象引用变量名=new类名(参数表);•例如:•CirclemyCircle=newCircle();22/1386.4.2访问对象的数据和方法•当一个对象被创建后,可以通过它的引用变量来访问,其语法格式为:•对象引用变量名.数据名;•对象引用变量名.方法名(参数表);•例如:•CirclemyCircle=newCircle();•myCircle.radius=9;•myCircle.findArea();23/1386.4.2访问对象的数据和方法•例6.1声明类并创建对象。•问题:编写程序,构造半径为5和为半径为1的圆对象,并显示这两个圆的半径和面积;再将第2个对象的半径改为100,显示其新的半径和面积。•解答:24/1386.4.2访问对象的数据和方法•classSimpleCircle{•doubleradius;•/**构造一个其半径为1的圆对象*/•SimpleCircle(){•radius=1.0;•}•/**构造一个由参数指定半径的圆对象*/25/1386.4.2访问对象的数据和方法•SimpleCircle(doublenewRadius){•radius=newRadius;•}•doublefindArea(){•returnradius*radius*3.14159;•}•}/**类定义结束*/26/1386.4.2访问对象的数据和方法•这个类不是主类,不能运行,那么如何使用呢?回答是:在主类中使用。•使用上述类的主类如下:•publicclassTestSimpleCircle{•publicstaticvoidmain(String[]args){•//创建一个半径为5的圆对象•SimpleCirclemyCircle;•myCircle=newSimpleCircle(5);27/1386.4.2访问对象的数据和方法•//创建一个半径为1的圆对象•SimpleCircleyourCircle;•yourCircle=newSimpleCircle();•System.out.println(“其半径为”+myCircle.radius+“的圆面积为”+myCircle.findArea());•System.out.println(“其半径为”+yourCircle.radius+“的圆面积为”+yourCircle.findArea());28/1386.4.2访问对象的数据和方法•//修改圆半径•yourCircle.radius=100;•System.out.println(“其半径为”+yourCircle.radius+“的圆面积为”+yourCircle.findArea());•}•}29/1386.4.2访问对象的数据和方法•这两个类可以放在同一个文件中。•下面我们来运行这个例子。•(运行)30/1386.4.2访问对象的数据和方法•注意1:可以把两个类放在同一个文件中,但一个文件中只能有一个public类,并且public类必须与文件名相同。•注意2:上述两个类可以合并为一个:•publicclassSimpleCircle{•publicstaticvoidmain(String[]args){•//创建一个半径为5的圆对象•SimpleCirclemyCircle;•myCircle=newSimpleCircle(5);•//创建一个半径为1的圆对象31/1386.4.2访问对象的数据和方法•SimpleCircleyourCircle;•yourCircle=newSimpleCircle();•System.out.println(其半径为+myCircle.radius+的圆面积为+myCircle.findArea());•System.out.println(其半径为+yourCircle.radius+的圆面积为+yourCircle.findArea());•//修改圆半径•yourCircle.radius=100;32/1386.4.2访问对象的数据和方法•System.out.println(其半径为+yourCircle.radius+的圆面积为+yourCircle.findArea());•}•doubleradius;•/**构造一个其半径为1的圆对象*/•SimpleCircle(){•radius=1.0;•}33/1386.4.2访问对象的数据和方法•/**构造一个由参数指定半径的圆对象*/•SimpleCircle(doublenewRadius){•radius=newRadius;•}•doublefindArea(){•returnradius*radius*3.14159;•}•}34/1386.4.3空值null•如果一个引用型变量没有引用任何对象,这个对象就有一个特别的Java值null。null与true和false一样是一个直接量。true和false用于boolean型变量,而null用于引用型变量。•引用型数据的默认值是null,数值型的默认值是0,boolean型的默认值是false,char型的默认值为’\u0000’。•然而,Java没有给方法中的局部变量赋予默认值,下面代码显示Student对象中数据域name、age、isScienceMajor和gender35/1386.4.3空值null•的缺省值:•classStudent{•Stringname;//默认值为null•intage;//默认值为0•booleanisScienceMajor;//默认值为false•chargender;//默认值为’\u0000’•publicstaticvoidmain(String[]args){•Studentstudent=newStudent();•System.out.println(“name=”+student.name);•System.out.println(“age=”+student.age);36/1386.4.3空值null•System.out.println(“isScienceMajor=”+student.isScienceMajor);•System.out.println(