资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,第四章,java,中的对象、类、包和接口,4.1,初,识,对象和类,4.2,对象的生命周期,4.3,创建类,4.4,包的创建和使用,4.5,类成员的访问控制,4.6,类成员与实例成员,4.7,继承,4.8,嵌入类,Inner Classes,4.9,接口,1,4.1,初识对象和类,例,1.,定义了一个名为,SimplePoint,的类,public class,SimplePoint,public,int,x=0;/x,为成员变量,public,int,y=0;/y,为成员变量,第四章,java,中的对象、类、包和接口,2,4.1,初识对象和类,当创建一个新的对象时(对该类实例化),就会为该对象及其成员分配空间,同时对成员变量进行初始化。,第四章,java,中的对象、类、包和接口,3,4.1,初识对象和类,例,2,定义一个名为,SimpleRectangle,类,public class,SimpleRectangle,public,int,width=0;,public,int,height=0;,public,SimplePoint,origin=new,SimplePoint,();,第四章,java,中的对象、类、包和接口,4,4.1,初识对象和类,当初始化,origin,成员时将调用代码,new,SimplePoint,(),创建一个,SimplePoint,对象。,第四章,java,中的对象、类、包和接口,5,4.1,初识对象和类,例,3,public class Point,public,int,x=0;,public,int,y=0;,/a constructor!,public,Point(int,x,int,y),this.x=x;this.y=y;,见例题:,Rectangle.java,new Point(44,78),第四章,java,中的对象、类、包和接口,6,4.2,对象的生命周期,创建对象,对象的使用,清除对象,第四章,java,中的对象、类、包和接口,7,4.2,对象的生命周期,创建对象,通过创建一个对象可创建类的一个实例,也称实例化此类。,例,Rectangle,rect,=new Rectangle();,创建一个对象包括三部分:,声名部分,实例化部分,初始化部分,第四章,java,中的对象、类、包和接口,8,4.2,对象的生命周期,1.,创建对象,声名对象,声明对象的名字和类型,用类名来说明对象的类型。,格式:,type name,说明:,声明对象的规则与变量声明规则相同,但对象变量是引用类型;,在,java,里类和接口都可以作为数据类型来使用;,对象声明通知编译器,name,将用来引用,type,类型的变量,对象声明并不创建新的对象。,例,:,Rectangle,rect,;,第四章,java,中的对象、类、包和接口,9,4.2,对象的生命周期,1.,创建对象,实例化对象,操作符,new,通过为新对象分配存储空间来实例化类,格式:,new,类的构造方法,例,new Rectangle(100,200);,Rectangle,rect,=new Rectangle(100,200);,第四章,java,中的对象、类、包和接口,10,4.2,对象的生命周期,1.,创建对象,初始化对象,每个类都至少有一个构造函数,当创建对象时调用指定的构造函数来初始化对象,例,Rectangle,rect,=new Rectangle();,Rectangle,rect,=new Rectangle(100,200);,Rectangle,rect,=new Rectangle(new Point(44,78);,注:在定义类时如未定义构造函数系统,,java,会自动构造一个没有参数的构造函数。,第四章,java,中的对象、类、包和接口,11,4.2,对象的生命周期,2.,对象的使用,使用对象包括:,从对象中获得信息,改变对象的状态,使对象执行某些操作,实现途径,:,引用对象的变量,调用对象的方法,第四章,java,中的对象、类、包和接口,12,4.2,对象的生命周期,2.,对象的使用,引用对象的变量,引用对象变量的格式,:,对象引用,.,对象的变量,例:,rect.origin=new Point(15,37);,area=rect.height*rect.width;,height=new Rectangle().height;,说明,:,可以像使用其它变量一样来使用对象的变量。,例如:,area=rect1.height*rect1.width,第四章,java,中的对象、类、包和接口,13,4.2,对象的生命周期,2.,对象的使用,调用对象的方法,格式:对象引用,.,对象方法名,();,或 对象引用,.,对象方法名,(,参数表,);,例,rect.move(15,37);,new Rectangle(100,50).area(),说明,:,对于返回值的方法,方法调用可以用于表达式中,调用一个对象的方法即是向该对象发送一个消息,.,第四章,java,中的对象、类、包和接口,14,4.2,对象的生命周期,3.,清除对象,java,运行使系统有一个垃圾回收进程负责清除不再使用的对象。,垃圾回收器,垃圾回收器定期扫描内存,对于被应用的对象加上标记,按可能的路径扫描结束后清除未加标记的对象。,被回收的对象是:,不再被任何引用变量引用的对象,引用变量自动放弃,人为地将引用变量置为,null,第四章,java,中的对象、类、包和接口,15,4.2,对象的生命周期,3.,清除对象,垃圾回收器,当系统的内存用尽或程序中调用,System.gc,(),要求进行垃圾收集时,垃圾收集线程与系统同步运行。否则垃圾收集器在系统空闲时异步地执行。,第四章,java,中的对象、类、包和接口,16,4.2,对象的生命周期,3.,清除对象,finialize,(),方法,在一个对象被垃圾回收器回收之前,,java,解释器会自动调用对象的,finalize,(),方法。通常在该方法内包括了释放系统资源的代码段。,finalize(),方法在类,java.lang.Object,中实现,如:,protected void finalize()throws,throwable,/clean up code for this class,super.finalize();/,清除对象使用的所有资源,包括由于继,/,承关系而获得的资源,第四章,java,中的对象、类、包和接口,17,4.3,创建类,4.3.1,类声明,4.3.2,类体,(Class Body),第四章,java,中的对象、类、包和接口,18,4.3,创建类,一个类包括两部分:,类声明,类体,见右图:,第四章,java,中的对象、类、包和接口,19,4.3,创建类,4.3.1,类声明,在类的声明里,说明了类的名字及其它属性。下图说明了类声明中包含的各部分,:,第四章,java,中的对象、类、包和接口,20,4.3,创建类,4.3.1,类声明,说明:,在类声明中,public,、,abstract,、,final,为类的修饰符,是可选的,,缺省时说明所定义的类是非,public,、非,abstract,、非,final,的类,。,第四章,java,中的对象、类、包和接口,21,4.3,创建类,4.3.2,类体,类体为该类的对象提供了在生存期内需要的所有代码。包括以下几部分:,构造方法,(constructor),成员变量,(member variable),的声明,方法,(Method,),的实现,第四章,java,中的对象、类、包和接口,22,4.3,创建类,4.3.2,类体,1.,构造方法,定义,:类中用来初始化新建的对象的方法称构造方法。,特点,:,无返回类型,,方法名与类名相同,第四章,java,中的对象、类、包和接口,23,4.3,创建类,4.3.2,类体,1.,构造方法,说明:,构造方法可被重载。例如:,public class Thing,private,int,x;,public Thing(),x=47;,public Thing(,int,new_ x),x=new_ x;,第四章,java,中的对象、类、包和接口,24,4.3,创建类,4.3.2,类体,1.,构造方法,说明:,其中变量和方法称为类的成员(成员变量和成员方法),而构造方法不是类的成员。,每个类中至少有一个构造方法。,定义类时如未定义构造方法,运行时系统会为该类自动定义缺省的构造方法。,没有任何参数,没有,body,不做任何事情,第四章,java,中的对象、类、包和接口,25,4.3,创建类,4.3.2,类体,1.,构造方法,说明:,构造方法只能,由,new,运算符调用,构造方法同样也有访问权限的限制,public,protected,private,package,第四章,java,中的对象、类、包和接口,26,4.3,创建类,4.3.2,类体,2.,成员变量的声明,成员变量在类体中声明,但在构造方法和方法之外,。,classDeclaration,member variable declarations,constructor declarations,method declarations,第四章,java,中的对象、类、包和接口,27,4.3,创建类,4.3.2,类体,2.,成员变量的声明,声明格式:,第四章,java,中的对象、类、包和接口,28,4.3,创建类,4.3.2,类体,2.,成员变量的声明,说明:,accessLevel,:,对成员变量的访问控制,有四级访问控制:,public,protected,package,private,。,缺省时为,package,。,static:,说明该变量为类变量,缺省时为实例变量。,final:,指明该变量的值不能被改变,既该变量为,常量,。,例,final double AVOGADRO=6.023e23;,第四章,java,中的对象、类、包和接口,29,4.3,创建类,4.3.2,类体,2.,成员变量的声明,说明:,type:,用于说明成员变量的类型。可以是,基本数据类型,,如,int,float,boolean,等,也可以是,引用类型,,如数组名,类或接口名。,在同一个类中不允许有同名的成员变量,但允许成员变量名和方法名相同。,第四章,java,中的对象、类、包和接口,30,4.3,创建类,4.3.2,类体,2.,成员变量的声明,例子:,public class,SliderDemo,public static final,int,FPS_INIT=15;,private,int,frameNumber,=0;,protected,int,delay;,boolean,frozen=false,Timer timer;,private,String name=Fred Flintstone;,第四章,java,中的对象、类、包和接口,31,4.3,创建类,4.3.2,类体,3.,方法的实现,与类相似,方法的声明也包括两部分:方法声明和方法体:如下图所示,:,第四章,java,中的对象、类、包和接口,32,4.3,创建类,4.3.2,类体,3.,方法的实现,方法声明,:,定义方法的属性,如访问控制级,返回值的类型,方法名字,参数等,第四章,java,中的对象、类、包和接口,33,4.3,创建类,4.3.2,类体,3.,方法的实现,返回值:,返回值的数据类型必须和声明中的返回类型一致,或者完全相同,或者是它的一个子类。,当一个方法不需要返回值时,返回类型为,void,。,第四章,java,中的对象、类、包和接口,public Number,returnANumber,(),.,34,4.3,创建类,4.3.2,类体,3.,方法的实现,参数传递,:,1,)参数的类型,可以是:,简单数据类型,:值传送。方法接收参数的值,但并不能改变这些参数的值,引用数据类型,(数组类型、类或接口):,地址传递。传递给方法的是数据在内存中的地址,,见例题:,ArgumentTest.java,第四章,java,中的对象、类、包和接口,35,4.3,创建类,4.3.2,类体,3.,方法的实现,参数传递,:,2,)参数的命名:,参数名字可以与类的成员变量 相同,但参数名会隐藏成员。变量为了区别参数与类的成员变量,我们必须使用,this,class Circle,int,x,y,radius;,public,Circle(int,x,int,y,int,radius),this.,x=x;,this.,y=y;,this.,radius=radius;,第四章,java,中的对象、类、包和接口,36,4.3,创建类,4.3.2,类体,3.,方法的实现,方法体,:,定义:,方法的实现部分,包括局部变量的声明和所有合法的,java,语句。,局部变量:,在方法体内定义的变量称局部变量,局部变量的作用域限于方法内。如果局部变量的名字和类的成员变量的名字相同,则类的成员变量被隐藏,可以使用,this,调用当前类的成员变量。,第四章,java,中的对象、类、包和接口,37,4.3,创建类,4.3.2,类体,3.,方法的实现,例题:,class Variable,int,x=0,y=0,z=0;/class member variables,void init(,int,x,int,y),this.x=x;,this.y=y;,int,z=5;/local variable,System.out.println,(*in init*);,System.out.println(x,=+x+y=+y+z=+z);,第四章,java,中的对象、类、包和接口,38,4.4,包的创建和使用,第四章,java,中的对象、类、包和接口,定义,:,包是一组相关的类或接口的集合,它提供了访问保护和名字空间管理。,Java,编译器使用文件系统目录来保存包。,39,4.4,包的创建和使用,第四章,java,中的对象、类、包和接口,使用包的好处:,程序员能很容易确定同一包中的类是相互关联的。,程序员能很方便地了解到在哪里可以找到能完成特定功能的类,由于每个包都创建了一个名字空间,个人创建的类名不会和其它包中的类名名发生冲突,可以使同一包中的类彼此不加限制地访问,而同时对其它包中的类提供访问控制。,40,4.4,包的创建和使用,第四章,java,中的对象、类、包和接口,1.,创建包,格式:,package pkg1.pkg2.pkg3,;,package,语句必须放在原文件的开始处。,例如:,java.io,java.util,java.lang,java.applet,javax.swing,package graphics;,public class Circle ,.,41,4.4,包的创建和使用,第四章,java,中的对象、类、包和接口,1.,创建包,说明:,package,的作用域是整个源文件,如果在同一个源文件中定义了多个类,最多仅可以有一个类用,public,修饰,且源文件名必须与该类名相同,当未使用,package,语句时,类和接口放在无名缺省包里,包的命名习惯,:,将,Internet,域名作为包名,例如:,pany.region.package,.,42,4.4,包的创建和使用,第四章,java,中的对象、类、包和接口,2.,包的使用,包中的所有类中只有,public,类能被包外部的类访问。,有,三种方法,访问包中的类:,1),使用长名字引用包中的公共成员 即在类名前注明包名,例,graphics.Rectangle,graphics.Rectangle,myRect,=new graphics.Rectangle();,43,4.4,包的创建和使用,第四章,java,中的对象、类、包和接口,2.,包的使用,引进包的公共成员,在文件的开始处使用,import,语句将指定的成员引进到当前文件中,.,格式:,import pkg1.pkg2.,类名,例,import graphics.Circle;,Circle,myCircle,=new Circle();,44,4.4,包的创建和使用,第四章,java,中的对象、类、包和接口,2.,包的使用,3),引进整个包,使用,import,语句引进包中的所有类和接口,格式,:,import pkg1.pkg2.*,例,import graphics.*;,现在可以使用短名字来引用类,graphics,包中的所有类,.,Circle,myCircle,=new Circle();,Rectangle,myRectangle,=new Rectangle();,45,4.4,包的创建和使用,第四章,java,中的对象、类、包和接口,3.,源文件和类文件的管理,JDK,利用文件系统的层次结构来管理源文件和类文件。源文件和类文件所在的目录名应与其中的类所在的包名对应,编译器和解释器按此机制来查找类。如:,46,4.4,包的创建和使用,第四章,java,中的对象、类、包和接口,3.,源文件和类文件的管理,47,4.4,包的创建和使用,第四章,java,中的对象、类、包和接口,3.,源文件和类文件的管理,当源文件中有多个类定义时,,,编译后将产生多个类文件。,48,4.4,包的创建和使用,第四章,java,中的对象、类、包和接口,3.,源文件和类文件的管理,虽然类文件所在的目录序列必须与包名对应,但不一定与源文件在相同的目录中。,javac,d d:classes Rectangle.java,49,4.4,包的创建和使用,第四章,java,中的对象、类、包和接口,3.,源文件和类文件的管理,说明:,包对应于文件系统的目录管理方式可以帮助编译器和解释器找到程序中的类和接口存放的地方。,CLASSPATH,指出用户的,类库所在目录,在类路径,(,CLASSPATH,),中只需指出包路径之上的顶层路径,CLASSPATH=.;d,:classes,50,4.4,包的创建和使用,第四章,java,中的对象、类、包和接口,3.,源文件和类文件的管理,设置类路径的方法,设置环境变量,CLASSPATH,(,不推荐),set,classpath,=.;d:classes,在调用编译器或解释器时使用,-,classpath,选项,例,java-,classpath,d:classes,com.taranis.grathpics.Test,见例子:,包的使用,.txt,51,4.5,类成员的访问控制,在,java,语言中对类的成员有四种级别的访问控制,:,private,protected,public,package.,如定义类时未指定访问控制说明符,则其访问控制级别为,package,。,第四章,java,中的对象、类、包和接口,问范围说明符,当前类,所有子类,包内所有类,所有包中的类,private,X,protected,X,X,X,public,X,X,X,X,package,X,X,52,4.5,类成员的访问控制,第四章,java,中的对象、类、包和接口,例题见:,访问权限,.txt,53,4.6,类成员与实例成员,第四章,java,中的对象、类、包和接口,在类中声明一个变量或方法时,还可以指定它为实例成员或类成员。如下的格式:,static type,classVar,;,static,returnType,classMethod,(,paramlist,),54,4.6,类成员与实例成员,第四章,java,中的对象、类、包和接口,类变量与实例变量,二者区别:,运行时系统在首次遇到类变量时就为类变量存储空间;而当创建类的实例对象时才为实例变量分配存储空间。,不管有多少类的实例,类变量只有一份拷贝,即所有实例共享相同的类变量;而每个实例对象都有自己的实例变量。,实例变量只能通过对象来访,而类变量既可以通过类名来访问,也可以通过实例对象来访问。,55,4.6,类成员与实例成员,第四章,java,中的对象、类、包和接口,类方法与实例方法,二者区别:,实例方法即能访问当前对象的实例变量也能访问类变量;类方法只能访问类变量而不能访问实例变量。,实例方法只能由实例对象来调用而类方法即可以由实例对象调用也可以由类名直接调用。,见例题:,MemberTest.java,56,4.6,类成员与实例成员,第四章,java,中的对象、类、包和接口,说明:,可用,static,来定义全局变量和全局方法,这时由于类成员仍然封装在类中,与,C,、,C+,相比,可以限制全局变量和全局方法的使用范围而防止冲突。,一个类的,main(),方法必须要用,static,来修饰,也是因为,Java,运行时系统在开始执行一个程序前,并没有生成类的一个实例,它只能通过类名来调用,main(),方法作为程序的入口。,通常,,static,与,final,一起使用来指定一个常量,如:,protected static final String DISABLE=disable;,57,4.6,类成员与实例成员,第四章,java,中的对象、类、包和接口,初始化类变量和实例变量,(,Instance and Class Members,),可以在类中声明的时候初始化,class,BedAndBreakfast,static final,int,MAX_CAPACITY=10;/,类变量,boolean,full=false;,float f=3.14f;,Depth o=new Depth();,/,引用类型,int,i=f();/,通过调用一个方法来提供初始值,58,4.6,类成员与实例成员,第四章,java,中的对象、类、包和接口,初始化类变量和实例变量,实例变量:在构造方法中进行初始化。,class Counter,int,i;Counter(j)i=j;/.,59,4.6,类成员与实例成员,第四章,java,中的对象、类、包和接口,初始化类变量和实例变量,类变量:类初始块中进行初始化。,class Spoon,static,int,i;,static,i=47;,/.,这段代码仅执行一次,首次生成那个类的一个对象时,或者首次访问属于那个类的一个,static,成员时(即便从未生成过那个类的对象)。,见例题:,ExplicitStatic.java,60,4.6,类成员与实例成员,第四章,java,中的对象、类、包和接口,初始化类变量和实例变量,说明:,类初始块不能在任何方法内。,类初始块只执行一次,61,4.7,继 承,第四章,java,中的对象、类、包和接口,4.7.1,理解继承,4.7.2,类,jave.lang.Object,4.7.3 final,类和方法,4.7.4 abstract,类和方法,62,4.7,继 承,4.7.1,理解继承,父类、子类和继承,成员变量的隐藏和方法的重写,super,关键字,方法的重载,运行时多态,instanceof,操作符,第四章,java,中的对象、类、包和接口,63,4.7,继 承,4.7.1,理解继承,第四章,java,中的对象、类、包和接口,父类、子类和继承,例子:,64,4.7,继 承,4.7.1,理解继承,第四章,java,中的对象、类、包和接口,父类、子类和继承,定义:,子类,:,继承而得到的类为子类。子类继承父类的状态和行为,同时也可以修改父类的状态或重写父类的行为,并添加新的状态和行为,父类,:,被继承的类为父类,父类包括所有直接或间接被继承的类,65,4.7,继 承,4.7.1,理解继承,父类、子类和继承,Java,语言是单继承机制,,不支持多重继承,单继承是代码更加可靠。,接口可以提供多继承功能。,第四章,java,中的对象、类、包和接口,66,4.7,继 承,4.7.1,理解继承,第四章,java,中的对象、类、包和接口,交通工具,汽车,卡车,旅行车,小汽车,轿车,跑车,面包车,父类、子类和继承,67,4.7,继 承,4.7.1,理解继承,父类、子类和继承,Java,中,所有的类都是通过直接或间接地继承,java.lang.Object,得到的,第四章,java,中的对象、类、包和接口,68,4.7,继 承,4.7.1,理解继承,父类、子类和继承,创建子类,通过在类的声明中加入,extends,子句来创建一个类的子类,其格式如下:,class,SubClass,extends,SuperClass,说明:,如果缺,省,extends,子句,则该类为,java.lang.Object,的子类,第四章,java,中的对象、类、包和接口,69,4.7,继 承,4.7.1,理解继承,父类、子类和继承,子类能够继承什么?,子类能够继承父类中,public,和,protected,的成员。,子类能够继承父类中没有访问控制的成员,只要子类和父类在同一个包内。,子类不能继承父类隐藏的成员变量和重写的父类方法,子类不能继承父类中,private,成员。,子类不能继承父类中构造方法。因为,构造方法不是类的成员,第四章,java,中的对象、类、包和接口,70,4.7,继 承,4.7.1,理解继承,第四章,java,中的对象、类、包和接口,成员变量的隐藏和方法的重,写,变量的隐藏,:,子类中声明了和父类同名的变量,,,父类的成员变量被隐藏,。,方法的重,写:,子类中定义了与,父类,相同的方法,则,父类的方法被重,写,。,71,4.7,继 承,4.7.1,理解继承,第四章,java,中的对象、类、包和接口,成员变量的隐藏和方法的重,写,例题:,class,SuperClass,int,x;,void,setX,(),x=0;,class,SubClass,extends,SuperClass,int,x;/hide x in,SuperClass,void,setX,()/overload,x=5;,72,4.7,继 承,4.7.1,理解继承,第四章,java,中的对象、类、包和接口,成员变量的隐藏和方法的重,写,说明:,重写的方法和父类中被重写的方法要具有相同的名字,相同的参数表和相同的返回类型,子类通过成员变量的隐藏和方法的重写可以把父类的状态和行为改变为自身的状态和行为,73,4.7,继 承,4.7.1,理解继承,例题:,方法的重,写,第四章,java,中的对象、类、包和接口,74,4.7,继 承,4.7.1,理解继承,第四章,java,中的对象、类、包和接口,成员变量的隐藏和方法的重,写,说明:,子类中不能重写父类中的,final method,子类中必须重写父类中的,abstract method,,,否则子类也为抽象类。,75,4.7,继 承,4.7.1,理解继承,3.super,关键字,super,用来引用当前对象的父类,super,来实现对父类成员的访问。,应用:,子类在隐藏了父类的成员变量或重写了父类的方法后,常常还要用到父类的成员,在重写的方法中使用父类中被重写的方法以简化代码的编写,第四章,java,中的对象、类、包和接口,76,4.7,继 承,4.7.1,理解继承,3.super,关键字,super,的使用有三种情况:,用来访问父类被隐藏的成员变量,如:,super.variable,用来调用父类中被重,写,的方法,如:,super.Method(,paramlist,),;,用来调用父类的构造函数,如,super(,paramlist,),;,例题:,inheritance.java,,,Manager.java,第四章,java,中的对象、类、包和接口,77,4.7,继 承,4.7.1,理解继承,3.super,关键字,说明:,用来调用父类的构造函数,super(,paramlist,),必须放在子类构造方法的句首。,如果子类没有明确的调用,父类的构造函数,,编译器会自动的调用,super(),语句,它调用父类的默认构造函数。,如果父类没有默认构造函数则编译出错。,例题:,Manager1.java,第四章,java,中的对象、类、包和接口,78,4.7,继 承,4.7.1,理解继承,4.,方法的重载,(,overloading,),在同一个类中名字相同但参数个数或类型不同的方法。返回值可以不同。,例如:,public void,println,(,int,i),public void,println,(float f),public void,println,(String s),见例题,MethodOverloadingTest.java,第四章,java,中的对象、类、包和接口,79,4.7,继 承,4.7.1,理解继承,4.,方法的重载,(,overloading,),构造方法也可以重载。可以在构造方法的第一条语句使用,this,来调用其他的构造方法。,见例题,Employee.java,第四章,java,中的对象、类、包和接口,80,4.7,继 承,4.7.1,理解继承,5.,运行时多态,对于重写或继承的方法,,Java,运行时系统根据调用该方法的实例的类型来决定选择哪个方法调用。,第四章,java,中的对象、类、包和接口,81,4.7,继 承,4.7.1,理解继承,说明:,对子类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法,,如果子类继承了父类的方法,(,未重写,),,则运行时系统调用父类的方法。,第四章,java,中的对象、类、包和接口,82,4.7,继 承,4.7.1,理解继承,5.,运行时多态,class A,void,callme,(),System.out.println(Inside,As,callme,()method);,class B extends A,void,callme,(),System.out.println(Inside,Bs,callme,()method);,public class Dispatch,public static void main(String,args,),A a=new B();,a.callme,();,第四章,java,中的对象、类、包和接口,运行结果为:,C:java Dispatch,Inside Bs,callme,()method,例题:,83,4.7,继 承,4.7.1,理解继承,5.,运行时多态,第四章,java,中的对象、类、包和接口,例题:,class Student,public:,/,float,calcTuition,(),/,;,class,GraduateStudent,extends Student,public:,/,float,calcTuition,(),/,;,void fn(,Student x,),x.calcTuition,();,void main(),Student s;,GraduateStudent,gs,;,fn(s);,fn(gs,);,84,4.7,继 承,4.7.1,理解继承,例题:,Shapes.java,为什么要上溯到父类呢?,我们可以从以下例题中找到答案:,例题:,music.java,例题:,music1.java,第四章,java,中的对象、类、包和接口,85,4.7,继 承,4.7.1,理解继承,6.,instanceof,操作符,用来判断对象属于哪个类,第四章,java,中的对象、类、包和接口,public class Employee extends Object,public class Manager extends Employee,public class Engineer extends Employee,-,public void,doSomething,(Employee e),if(e,instanceof,Manager),/Process a Manager,else if(e,instanceof,Engineer),/Process an Engineer,else,/Process any other type of Employee,例如:,86,4.7,继 承,4.7.2,类,jave.lang.Object,第四章,java,中的对象、类、包和接口,类,java.lang.Object,处于,Java,开发环境的类层次树的根部,其他所有的类都直接或间接地为它的子类,一个类如果没有声明继承某个类,则默认继承,Object,类。,public class Employee,.,等价于:,public class Employee extends Object,.,87,4.7,继 承,4.7.2,类,jave.lang.Object,第四章,java,中的对象、类、包和接口,该类定义了一些所有对象最基本的状态和行为常用的有:,equals(),getClass,toString,finalize,notify,notifyAll,wait,88,4.7,继 承,4.7.2,类,jave.lang.Object,第四章,java,中的对象、类、包和接口,equals(),一般情况下需要覆盖,Object,中的,equals(),方法,例如:,Integer one=new Integer(1),anotherOne,=new Integer(1);,if(one.equals(,anotherOne,),System.out.println,(“objects are equal”);,if(one=,anotherOne,),System.out.println,(“objects are equal”);,else,System.out.println,(“objects are equal”);,89,4.7,继 承,4.7.2,类,jave.lang.Object,第四章,java,中的对象、类、包和接口,2.,getClass,(),getClass,(),方法是,final,方法,它不能被重写,。,它返回一个对象在运行时所对应的类的表示,例如下面的方法得到并显示对象的类名:,void,PrintClassName,(Object,obj,),System.out.println,(“The objects class is“+,obj.getClass,().,getName,();,90,4.7,继 承,4.7.2,类,jave.lang.Object,第四章,java,中的对象、类、包和接口,2.,getClass,(),可以,用,getClass,创建一个类的实例,而不必在编译时即知道到底是哪个类。,下例创建了一个与对象,obj,具有相同类型的一个实例,,所创建的对象可以是任何类。,Object,creatNewInstanceOf,(object,obj,),return,obj.getClass,().,newInstance,();,91,4.7,继 承,4.7.2,类,jave.lang.Object,第四章,java,中的对象、类、包和接口,3.,toString,(),toString,(),方法用来返回对象的字符串表示,.,不同的对象显示的形式也不一样。,例如:,System.out.println(Thread.currentThread().toString,();,显示结果为:,Threadmain,5,main,int,pInt,=500;,Integer,wInt,=new Integer(,pInt,);,System.out.println(wInt.toString,();,显示结果为:,500,92,4.7,继 承,4.7.3,final,数据、,方法,和类,第四章,java,中的对象、类、包和接
展开阅读全文