1、广东工业大学计算机学院,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第,3,章,Java,与面向对象技术,广东工业大学计算机学院,本章内容,3.1,面向对象编程基础,3.2,类的编程实现,3.3,对象的构造与使用,3.4,包,3.5,文档注释,3.6,类设计技巧,3.7,类的继承实例,3.8,多态,2,广东工业大学计算机学院,面向对象程序设计基础,面向对象程序设计,(OOP),围绕的几个主要概念,:,抽象数据类型,类,类层次(子类),继承性,多态性,3,广东工业大学计算机学院,3.1,面向对象的概念,class,Car,int color_numbe
2、r;,int door_number;,int speed;,void brake();,void,speedUp,();,void,slowDown,();,计算机中对象的原型,现实生活中的对象,数据抽象类型,4,广东工业大学计算机学院,什么是类,类是描述对象的,“,基本原型,”,,它定义一种对象所拥有的数据和能完成的操作,,,在面向对象的程序设计中,,,类是程序的基本单元。,variables,methods,程序中的对象是类的一个实例,是一个软件单元,它由一组结构化的,数据,和在其上的一组,操作,构成,。,面向对象的概念,(,续,),5,广东工业大学计算机学院,变量,:对象所知道的状态,
3、方法,:对象的功能单元,消息:,软件对象通过相互间传递,消息,来相互作用和通信。,一个,消息,由三部分组成,:,1.,接受消息的对象,2.,要完成方法的名字,3.,方法需要的参数,在,java.lang.awt.event,包中详细定义了各种常用的事件。,对象,B,对象,A,message,面向对象的概念,(,续,),6,广东工业大学计算机学院,一个例子,在程序中操作的对象是类的一个实例,即:,创建一个对象,Hello,hobj,=new Hello();,调用方法,hobj.showString(“Hello,World!”),public class Hello,private Strin
4、g s,;,public void,showString,(,),System.out.println(s,);,public void,changeString(String,str,),s=,str,;return s;,面向对象的概念 举例,操作,(Operation),属性,(Attribute),7,广东工业大学计算机学院,封装,封装把对象的所有组成部分组合在一起。,实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。,封装定义程序如何引用对象的数据,?,方法,数据,对象,B,私有数据,方法,对象,A,公有数据,面向对象的概念,封装,8,广东工业大学计算机学院,子类
5、对,另一个类的扩充或修正而得到的类,与父类之间是一种,特殊与一般,的关系。,bicycle,(,super class,),Mountain bikes,Racing bikes,Tandem bikes,subclass,面向对象的概念,子类,9,广东工业大学计算机学院,继承,:即“,is-a,”,关系。,子类利用父类中定义的方法和变量就像它们属于子类本身一样,.,public class Car,int color_number;,int door_number;,int speed;,push_break,();,add_oil,();,public class,Trash_Car,
6、extends,Car,double amount;,void,fill_trash,(),;,面向对象的概念,继承,10,广东工业大学计算机学院,面向对象的概念,继承(续),方法的覆盖:,在子类中重新定义父类中已有的方法,class Car,int color_number;,int door_number;,int speed;,void,push_break,(),speed=0;,class Trash_Car,extends,Car,double amount;,void fill_trash(),void,push_break,(),speed=,speed,-10;,11,广东工
7、业大学计算机学院,面向对象的概念,多态性,方法的重载,(,多态性,),在同一个类中有可能出现两个或多个方法同一称的情况,但它们有不同的参数。,类,void show(int int_num),void show(double double_num),void,show(int,int,_ um,float float_um),123,1.23,123,1.23,注意:,如果两个方法仅仅是返回类型不同,而参数完全相同的话,将不能通过编译。,12,广东工业大学计算机学院,类之间的关系,在类之间,最常见的关系有:,依赖,(dependency),:,uses,a,聚合,/,关联,(associati
8、on),:,has,a,继承,/,泛化,(generalization),:,is,a,实现关系,(implement),13,广东工业大学计算机学院,类之间的关系,(,续,),依赖,:,描述了一个事物的规格说明的变化可能会,影响到使用它的另一个事物,(反之不一定)。,例如,赛车手与赛车的关系,。,聚合:,也叫关联,描述的是,一个整体和组成部分,的关系,即“,has a”,关系,意思是整体对象拥有部分对象,,例如,学校和学生的关系,。,继承:,即“,is a”,关系。,例如,Car,与,Trash_car,的关系,。,实现:,指的是一个类元描述了另一个类元保证实现的契约。对类来说,就是一个类实
9、现了一个接口。,#,14,广东工业大学计算机学院,本章内容,3.1,面向对象编程基础,3.2,类的编程实现,3.3,对象的构造与使用,3.4,包,3.5,文档注释,3.6,类设计技巧,3.7,类的继承实例,3.8,多态,15,广东工业大学计算机学院,类定义,Java,中,类定义的基本语法如下:,Specifier,class,ClassName,extends,SuperClassName,implements,InterfaceName,/,类的成员变量定义,/,类的方法定义,例如,:,public Class,School,private,ArrayList,students;,priva
10、te void,addStudent(Person,person),students.add(person,);,16,广东工业大学计算机学院,域的定义,域,(,属性,/,字段,),定义的方式如下:,Specifier,type,variableName,;,例如:,int,x=3,y;,/,定义了整型变量,x,和,y,Date today,;,/,定义了,Date,型类变量,today,Char m,;,/,定义了字符型数组变量,x,和,y,17,广东工业大学计算机学院,方法的定义,方法由方法头和方法体构成,方法定义的语法如下:,Specifier,returnType,methodName
11、parameterList,),/,方法体,例如:,private void,addStudent,(Person,person),students.add(person,);,18,广东工业大学计算机学院,public class Person ,/,方法定义,public String,getName,(),return name;,public void,setName(String,s),name=s;,public double,getIncome,(),return salary;,public void,setIncome(double,d),salary=d;,/,域定义
12、private String name;/,姓名,private,int,sex;/,性别,private double salary;/,薪水,private,int,age;/,年龄,类定义举例,一种时髦的编程风格是:,1.,方法,位于,字段,的前面,2.,公有,(,public,),方法,位于所有,方法,的最前面,3.,一般情况下,将字段定义为,private,19,广东工业大学计算机学院,方法的参数,参数名可以与,类的域名,相同,如果相同,那么参数名将在方法体内隐藏同名的成员变量。例如:,public class Rectangle,double x;,double y;,doubl
13、e,computeArea(double,x,double,y,),double s=0;,s=,x,*,y,;,return s;,当需要同时使用同名的方法参数和类的域名时,可以使用,this,关键字:,double,computeArea(double,x,double,y,),double s=0;,if(,this,.x,x,),s=,x,*,y,;,return s;,20,广东工业大学计算机学院,封装的注意事项,注意:,不要编写返,回引用可变对象,的访问器方法。,public class Employee,public,Date,getHireDay,(),return,hireD
14、ay,;,private,Date,hireDay,;,当遇到下面的代码,就能使,hireDay,字段的封装性被破坏:,Employee,harry,=new Employee();,Date,date,=,harry,.getHireDay,();,double,tenYearsInMilliSeconds,=10*365.25*24*,60*,60,*1000;,date,.,setTime,(date.getTime,(),(,long)tenYearsInMilliSeconds,);,21,广东工业大学计算机学院,破坏封装的过程,原因:,上面的代码,提供了另一条直接更改可变对象的状态
15、的途径。,harry,=,d=,Employee,name=,salary=,hireDay,=,Date,years/months/days,解决办法:,对于可变对象,仅由访问器方法提供一个对象副本。,public class Employee,public Date,getHireDay,(),return(,Date)hireDay.,clone,();,private Date,hireDay,;,经验:,如果需要返回一个可变数据域的拷贝,就应该实现克隆。,22,广东工业大学计算机学院,final,实例域,被定义为,final,的实例域在对象初始化之后,不会再被修改。,例如:,publ
16、ic class Employee,private,final,String name;,注意:,final,修饰符大多应用于基本数据,(primitive),,或者不可变,(immutable),类的域。如果类中每个方法都不会改变对象的状态,这种类就是,不可变类,。,23,广东工业大学计算机学院,final,应用于可变对象有可能造成混乱,对于可变的类,使用,final,修饰符有可能对读者造成混乱。,例如,:,public class Employee,private,final,Date,hireDate,;,此语句仅仅意味着定义了一个,Date,类型的引用,hireDate,,该引用在,E
17、mployee,对象初始化之后不能改变;,但不是指该引用指向的,hireDate,对象的状态不能发生改变。,24,广东工业大学计算机学院,静态,(static),域,如果将某个类中的,域,定义为,static,,那么该类的对象都会有一份这个,域,的拷贝。,例如:,假定需要给每一个雇员赋予一个唯一的标识码,所以对,Employee,类添加一个实例域,id,和一个静态域,nextId,。,public class Employee,private,int,id;,private,static,int,nextId,=1;,25,广东工业大学计算机学院,静态,(static),域,(,续,),现在,
18、每个雇员对象都有一个自己的,Id,域,但这个类的所有实例却共享一个,nextId,域。,nextId,域有何用途?,public void,setId,(),id=,nextId,;,nextId,+;,假定为,harry,雇员设定标识码:,harry.setId,();,那么,harry,对象的,Id,域将被设置,并且静态域,nextId,的值加,1.,nextId,的用途是:,指示下一个雇员应当分配的,ID,。,26,广东工业大学计算机学院,静态域的注意事项,1.,静态,(static),域不同于,final,域。静态不等于不变,静态域在程序运行过程中,可以改变值,。,2.,静态域不属于任
19、何对象,仅,属于类,。即使没有对象被建立,该静态域仍然存在;即使存在,100,个对象,也只有一个静态域被这些对象共享。,3.,静态域在,JVM,中的存在形式,以及各对象对静态域的存取方式与非静态域不同。,27,广东工业大学计算机学院,常量,静态常量,(,类常量,),:,public class Math,public static final double PI=;,在程序中,可以通过,Math.PI,来访问该常量。,实例常量:,如果,static,被省略,则,PI,成了一个实例域。即需要用,Math,类的对象来访问,PI,,并且每个对象都会有一份各自的,PI,域拷贝。,28,广东工业大学计算
20、机学院,静态方法,静态方法是不能向对象实施操作的方法。,例如:,public static,int,getNextId,(),return,nextId,;,注意:,1.,静态方法,没有,this,参数。,2.,静态方法,不能,操作任何实例对象。,3.,静态方法,不能,访问任何实例域。,4.,静态方法,不属,于任何对象。,29,广东工业大学计算机学院,方法的参数,在程序设计语言中,有两种常见的参数传递方式:,1.,值调用,(call by value),:,表示方法接收的是调用者提供的值。,2.,引用调用,(call by reference),:,表示方法接收的是调用者特供的变量位置。,Ja
21、va,采用的是,值调用,。即方法得到的是所有参数值的一个拷贝,方法并不能改变实参的值。,30,广东工业大学计算机学院,方法参数的类型,一个方法不能修改一个基本数据类型的参数。,例如:,public static,doubleValue,(double,x),x=2*x;,double,percent,=10;,doubleValue,(percent,);,这样的调用语句并不能改变,percent,变量的值。,31,广东工业大学计算机学院,方法参数的类型,(,续,),然而,方法参数有两种类型:,基本数类型(数字、布尔值),对象引用,下列方法能够改变,引用,所指向的对象的状态:,public s
22、tatic,doubleValue,(Employee,e),e.raiseSalary(200);,/,将,e,对象的薪金提高,2,倍,Employee,harry,=new Employee();,doubleValue,(harry,);,但,Java,对,“对象引用”,这种参数仍然是使用,值传递,的方式。,32,广东工业大学计算机学院,Java,对“对象引用”类型参数的传递,在,C+,中,对,对象引用,(,即,指针,),参数是采用引用传递的方式;在,Java,中,对,对象引用,参数是采用值传递的方式。,public static void,swap,(Employee x,Employ
23、ee y),Employee temp=x;x=y;y=temp;,Employee,alice,=new Employee(“Alice”,);,Employee bob=new Employee(“Bob”,);,swap,(a,b);,在执行了,swap,(,alice,bob),后,,alice,仍然是“,Alice”,,,bob,仍然是“,Bob”,。,Why,?,原因是:,Java,采用值传递方式,将,alice,和,bob,的,副本,传给了,swap,方法作参数。,33,广东工业大学计算机学院,Java,中引用的值传递图示,在,swap(x,y),中,引用,x,和引用,y,的值已
24、经被交换;,但在,swap(x,y),执行完毕后,,x,和,y,都被丢弃,原来的实参,alice,和,bob,的值不变。,34,广东工业大学计算机学院,方法的隐式与显式参数,public class Person ,/,方法定义,public void,setIncome(double,d),salary=d;,/,域定义,private double salary;,private,int,age;,如果新建一个对象:,Person menber007=new Person();,并调用,setIncome,方法:,menber007.setIncome(8888.88);,setIncom
25、e,方法有两个参数:,隐式参数,this,显式参数,double,d,35,广东工业大学计算机学院,构建器,(constructor),构造器也称作构造方法,用来初始化新创建的对象。,类可以,包含一个或者多个构造方法,,不同的构造方法根据参数的不同来决定要初始化的新对象的状态。,所有的,Java,类都有构造方法,它用来对新的对象进行初始化。构造方法与类的名字是相同的。比如:,Stack,类的构造方法的名字为,Stack,Rectangle,类的构造方法的名字为,Rectangle,Thread,类的构造方法的名字为,Thread,36,广东工业大学计算机学院,构建器,举例,Stack,类的构造
26、器:,public Stack(),items=new Vector(10);,Java,支持对,构造方法的重载,,这样一个类就可以有多个构造方法,,所有的构造方法的名字都是相同,的,但所带,参数的个数和类型,不同。,下面是类,Stack,的另一个构造方法。这个构造方法是根据它的参数来初始化堆栈的大小。,public,Stack(int,initialSize,),items=new,Vector(initial,Size);,37,广东工业大学计算机学院,构建器,小结,class Employee ,public,Employee,(String,n,double s,int,year,in
27、t,month,int,day),name=n;,salary=s;,GregorianCalendar,calendar=new,GregorianCalendar(year,month-1,day);,hireDay,=,calendar.getTime,();,注意:,1.,构造器与类同名,没有返回值。,2.,每个类可以有,1,个或以上的构造器。,3.,构造器可以有,0,个、,1,个或以上的参数,4.,不要在构造器中定义与实例域重名的变量。,38,广东工业大学计算机学院,变量和方法的访问控制,变量和方法的访问控制符,有:,private,、默认、,protected,及,public,。
28、它们的具体访问范围如下:,访问指示,类,子类,包,所有,private,默认,(,无修饰符,),protected,public,39,广东工业大学计算机学院,其它修饰符,volatile,:异步控制修饰符,表示,多个并发线程共享的变量,,这使得各线程对该变量的访问保持一致。,transient,:存储控制临时变量修饰符,因为在缺省的情况下,,类中所有变量都是对象永久状态的一部分,,将对象存档时,必须同时保存这些变量。,用该限定词修饰的变量指示,Java,虚拟机:该变量并不属于对象的永久状态。它主要用于实现不同对象的存档功能。,#,40,广东工业大学计算机学院,本章内容,3.1,面向对象编程基
29、础,3.2,类的编程实现,3.3,对象的构造与使用,3.4,包,3.5,文档注释,3.6,类设计技巧,3.7,类的继承实例,3.8,多态,41,广东工业大学计算机学院,对象的构造,对象的构造有几种方式:,1.,构造器,2.,在域的声明中赋值,3.,初始化块,构造器又可以分为,重载方式的构造器,和,默认构造器,。,42,广东工业大学计算机学院,1.,重载,重载构造器即一个类中有,多个,构造器,是一种很常见的对象构造方法。,public class Employee,public,Employee,(String,aName,double,aSalary,),this,.name,=,aName,
30、this,.salary,=,aSalary,;,public,Employee,(double,aSalary,),this,(“Emplyoee,#”+,this.nextId,aSalary,);,public,Employee,(),注意:,this,的使用。,43,广东工业大学计算机学院,2.,默认构造器,默认构造器:,指没有参数的构造器。,例如:,Employee,类的构造器:,public Employee(),name=“”;,salary=0;,hireDay,=new Date();,在编写一个类的时候,如果没有编写构造器,则系统会自动提供一个默认的构造器。,在默认的构
31、造器中,会将各个字段初始化成,Java,规定的对应默认值。,44,广东工业大学计算机学院,3.,初始化块,在一个类的声明中,可以有,多个代码块,,只要构造类的对象,这些块就会被执行。例如:,class Employee ,public Employee(),private static,int,nextId,;,private,int,id;,id=,nextId,;,nextId,+;,注意:,在构造对象的过程中,首先会运行,初始化块,,然后才运行,构造器方法的主体部分,。,45,广东工业大学计算机学院,Java,的内存管理机制,当一个对象没有任何引用指向它的时候,该对象就会被,Java,虚
32、拟机认为是可回收的“,垃圾,”。,Java,有自动的垃圾回收机制,它实际上是一条虚拟机线程,周期性地把不再被引用的对象从内存中清除。,这个垃圾收集器是自动执行的,我们也可以通过调用系统类的,System.gc,(),方法来显式地运行垃圾收集程序,(,比如在创建大量垃圾代码之后或者在需要大量内存代码之前运行垃圾收集器,),。,在一个对象被系统垃圾收集器处理之前,对象也可调用自己的,finalize(),方法进行,析构处理,,这个过程就是所说的最后处理,也有的参考资料称之为,结束方法,。,46,广东工业大学计算机学院,构造器和析构器,Java,中构造方法和结束方法在类中均是可选的。,尤其是结束方法
33、在一般情况下是不需要的,而提供结束方法,finalize(),的目的是让程序员有机会释放掉不能被自动内存管理器直接使用的资源或是不能自动释放掉的资源。,但调用系统类的,System.gc,(),方法,显式调用,finalize(),方法并不能保证垃圾回收线程立即被唤醒,实际情况与操作系统有关。,47,广东工业大学计算机学院,对象的使用,1,可以用点,“,.,”,操作符来调用对象实例的成员变量和方法。,1.,域的引用,成员变量引用的形式如下:,objectreference,.,variablename,例如可以通过赋值语句修改,firstPerson.name,的值。,firstPerson,
34、name,=“Henry”;,48,广东工业大学计算机学院,对象的使用,2,2.,方法的调用,对象的方法调用的一般形式如下:,objectreference,.,methodname,(parameter,-list),例如:,Person,firstPerson,=new Person();,firstPerson,.,setName,(“Harry,”);,49,广东工业大学计算机学院,类成员的可见性,Java,有四种类成员(包括域和方法)的保护方式,分别为,#,:,缺省的,public,(公有的),protected,(保护的),private,(私有的),限访问修饰符关键字,同一个
35、类中,同一个包中,派生类中,其它包中,public,protected,无访问修饰符关键字,private,50,广东工业大学计算机学院,本章内容,3.1,面向对象编程基础,3.2,类的编程实现,3.3,对象的构造与使用,3.4,包,3.5,文档注释,3.6,类设计技巧,3.7,类的继承实例,3.8,多态,51,广东工业大学计算机学院,包的作用,Java,中的包,(Package),其实指的就是目录,它是将类,(Class),或者接口,(Interface),分类按照一定的规则存放在不同的文件夹中。,标准的,Java,类库分布在多个包中,如,java.lang,、,java.util,、,ja
36、vax,等。,标准的,Java,包具有一个层次结构,如同硬盘中的目录嵌套一样,包也可以嵌套。,sun,公司建议以公司,域名的逆序,作为包名。,52,广东工业大学计算机学院,类的导入,一个类可以使用它所在的包中的所有类,以及其它包中的公有类,(,声明为,public,的类,),。,对于其它包中的公有类,有两种方法:,1.,每个类名之前添加完整的包名,java.util.Date,today=new,java.util.Date,(),2.,使用,import,语句导入,import,java.util,.*;,import,java.util.Date,;,53,广东工业大学计算机学院,类冲突的
37、情况,在不同的包中,有可能存在名字相同的类。例如:,java.util,和,java.sql,包中都有日期,(Date),类。,如果要同时使用到这两个包,又要用到,java.sql,包中,Date,类时,需要明确导入:,import,java.util,.*;,import,java.sql,.*;,import,java.sql.Date,;,如果两个,Date,类都要使用到,那只能将完整的包名写出来:,java.util.Date,today=new,java.util.Date,(),54,广东工业大学计算机学院,静态导入,从,JDK5.0,开始,,import,语句增加了导入,静态方法
38、和,静态域,的功能。例如,如果在源文件的顶部添加一条指令:,import,static,java.lang.System,.*;,那么就可以使用,System,类的,静态方法,和,静态域,,而不必加类名前缀,例如:,out,.println(”Goodbye,”);,另外还可以将特定的,方法,或者,域,导入:,import,static,java.lang.System.,out,;,55,广东工业大学计算机学院,将类放入包中,要想将一个类放入包中,就必须将包的名字放在源文件的开头、包中定义类的代码之前。例如:,package,cn.edu.gdut,;,public class Emplo
39、yee,如图所示:,类存储在文件系,统的子目录中,,类的路径,必须,与,包名,匹配。,NB,演示,PackegeTest,56,广东工业大学计算机学院,虚拟机如何定位类,在前面已经看到,类,(,指,.class,文件,不是,.java,文件,),存储在文件系统的子目录中。另外还可以打包成,JAR,格式压缩存储。在一个,JAR,包中可以包含多个类文件和子目录。,例如:,在运行时库的数千个类都包含在运行时库文件,rt.jar,中。在,JDK,的,jre,/lib,子目录可以找到这个文件。,有可能出现多个程序访问包文件的情况,就如,Java API,库会被多个程序访问。,57,广东工业大学计算机学院
40、如何共享包,如何共享包?步骤如下:,1.,将类放到一个或者多个指定目录下。,这个目录是包的树状结构的基目录,例如:,/home/user/,classdir,如果希望将,cn.edu.gdut.MyClass,类添加到基目录中,则这个类文件必须放置在:,.,/home/user/,classdir/cn/edu/gdut,目录下。,2.,设置类路径。,类路径是所有基目录的集合,基目录中的子目录可以用于包含类文件。,如何设置类路径取决于编译环境。如果是,NetBeans,,则可以在,项目的“属性”对话框,中设置。,58,广东工业大学计算机学院,包的安全性,在默认情况下,包,不是,一个密封的实体
41、任何人都可以向包中添加更多的类,所有,黑客,也可以这样做。,为了提高安全性,从,JDK1.2,开始,,JDK,修改了类加载器,,明确禁止,加载用户自定义的、包名以“,java,”,开头的类。,另外,可以使用,包密封,(package sealing),机制,将包密封起来,这样包就不能再添加任何类。具体请参考,JAR,文件制作方法方面的资料。,#,59,广东工业大学计算机学院,本章内容,3.1,面向对象编程基础,3.2,类的编程实现,3.3,对象的构造与使用,3.4,包,3.5,文档注释,3.6,类设计技巧,3.7,类的继承实例,3.8,多态,60,广东工业大学计算机学院,文档注释,文档注释非
42、常重要,,Java,也提供了,javadoc,实用程序帮助程序员由注释生成文档。,javadoc,从下面几个地方抽取注释生成文档:,包,公有类与接口,公有的和受保护的,(protected),方法,公有的和受保护的域,所以应当为这几部分编写注释。注释应当放在上述特性的前面。,以,/*,开始,,*,/,结束。,61,广东工业大学计算机学院,在,NetBeans,中生成文档,打开需要生成文档的项目,然后在项目的“属性”窗口中选择 ,如图所示。,需要查看文档时,将光标定位在,类名,上,然后使用快捷键“,Ctrl+shift+space,”,62,广东工业大学计算机学院,1.,类的注释,类注释必须放在
43、import,语句之后,、,类定义之前,:,63,广东工业大学计算机学院,2.,方法的注释,每个方法注释必须放在所描述的方法之前。除了通用标记之外,还可以使用一下标记:,param,variable description,:向当前方法的“,param,”,(参数)部分增加一个条目。,return description,:向当前方法添加“,return”,(返回)部分。,throws class description,:表示该方法有可能抛出异常。,64,广东工业大学计算机学院,域注释,只需要对公有域,(,通常指,静态常量,),,建立文档。,此外还有一些通用注释标记,如:,author n
44、ame,version,since,deprecated text,see reference,此外,还可以为包建立一个注释;,也可以为整个工程添加一个“,OverView,”,注释。,65,广东工业大学计算机学院,本章内容,3.1,面向对象编程基础,3.2,类的编程实现,3.3,对象的构造与使用,3.4,包,3.5,文档注释,3.6,类设计技巧,3.7,类的继承实例,3.8,多态,66,广东工业大学计算机学院,类设计技巧,简单介绍几点类设计的技巧:,1.,尽量要将数据设计为私有,private,。,目的是为了保持严密的封装性。,2.,一定要对数据进行初始化。,一些,Java IDE,会对,对
45、象的实例域,进行初始化,但程序员应当显式地初始化所有的数据。,Java,不会对局部变量进行初始化。,67,广东工业大学计算机学院,类设计技巧(续),3.,不要在类中使用过多的基本数据类型。可以使用其它类替换多个相关的基本数据类型的使用,以易于理解及修改。例如:,private String street;,private String city;,private String state;,priivate,int,zip;,上面几个数据类型实际上构成了一个“,Address,”,类。所以可以先建立一个“,Address,”,类,然后用该类的引用替换上面几个基本数据类型的定义:,priavte
46、Address,address,;,68,广东工业大学计算机学院,类设计技巧(续),4.,不是所有的域都需要独立的域访问器方法和修改器方法。,例如,“雇员的雇用日期”,域,,,它只需要在初始化时确定,之后不应再被修改,所以不应当为这个域设立修改器方法。,5.,类名和方法名要能体现它们的职责,尽量做到“望文知义”。,69,广东工业大学计算机学院,本章内容,3.1,面向对象编程基础,3.2,类的编程实现,3.3,对象的构造与使用,3.4,包,3.5,文档注释,3.6,类设计技巧,3.7,类的继承实例,3.8,多态,70,广东工业大学计算机学院,类的继承实例,下面通过一个编写子类的例子,说明类的继
47、承的设计过程。,假设存在一个,Employee,类,现在因为存在,Manager,工种,所以可以将,Manager,设计为,Employee,的子类。,Manager,和,Employee,之间存在的“,is,a,”关系。,class,Manager,extends,Employee,/,添加方法和域,注意:,在,Java,中,所有的继承都是公有继承,没有,C+,中的私有继承和保护继承。,71,广东工业大学计算机学院,增加域,/,方法,子类可以比父类拥有更多的,域,(,字段,/,属性,/,变量,),和,方,法,。,例如:,在,Manager,类中增加一个用于存储奖金信息的域,以及一个用于设置这
48、个域的方法:,class,Manager,extends,Employee,.,public void,setBonus,(double b),bonus=b;,private double bonus;,如果有一个,Manager,对象,就可以是使用,setBonus,方法,:,Manager,boss=,;,boss.,setBonus,(8888);,setBonus,方法没有在,Employee,中定义,所以,Employee,对象不能使用它。,72,广东工业大学计算机学院,Employee,类的定义,public class,Employee,public,Employee,(Str
49、ing,n,double s,int,year,int,month,int,day),public String,getName,(),public double,getSalary,(),public Date,getHireDay,(),public void,raiseSalary,(double,byPercent,),private String,name,;,private double,salary,;,private Date,hireDay,;,73,广东工业大学计算机学院,Manager,类继承了什么?,Manager,类自动继承了超类中的方法和域。,1.Manager,类
50、继承的方法包括:,getName,、,getSalary,、,getHireDay,、,raiseSalary,。,2.,Manager,类继承的域包括:,name,、,salary,、,hireDay,。?,但在,Manager,类中“看不见”这些域。,在通过扩展类定义子类的时候,仅需要指出子类域超类的不同之处。因此类的设计原则之一是:,尽量将通用的方法放置于超类之中;,将具有特殊用途的方法放置在子类中。,74,广东工业大学计算机学院,方法的覆盖,(override),有些方法在子类,Manager,中并不适用。例如,,Manager,类中增加了一个,bonus,(,奖金,),域,所以,Ma






