第四章+java+中的对象、类、包和接口.ppt_第1页
第四章+java+中的对象、类、包和接口.ppt_第2页
第四章+java+中的对象、类、包和接口.ppt_第3页
第四章+java+中的对象、类、包和接口.ppt_第4页
第四章+java+中的对象、类、包和接口.ppt_第5页
已阅读5页,还剩145页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,第四章 java 中的对象、类、包和接口,4.1 初识对象和类 4.2 对象的生命周期 4.3 创建类 4.4 包的创建和使用 4.5 类成员的访问控制 4.6 类成员与实例成员 4.7 继承 4.8 嵌入类 Inner Classes 4.9 接口,2,4.1 初识对象和类,例1. 定义了一个名为SimplePoint 的类 public class SimplePoint public int x = 0; /x为成员变量 public int y = 0; /y为成员变量 ,第四章 java 中的对象、类、包和接口,3,4.1 初识对象和类,当创建一个新的对象时(对该类实例化), 就

2、会为该对象及其成员分配空间,同时对成员变量进行初始化。,第四章 java 中的对象、类、包和接口,4,4.1 初识对象和类,例2 定义一个名为SimpleRectangle类 public class SimpleRectangle public int width = 0; public int height = 0; public SimplePoint origin = new SimplePoint(); ,第四章 java 中的对象、类、包和接口,5,4.1 初识对象和类,当初始化origin成员时将调用代码new SimplePoint()创建一个SimplePoint对象。,第四

3、章 java 中的对象、类、包和接口,6,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; ,new Point(44, 78),第四章 java 中的对象、类、包和接口,7,4.3 创建类,4.3.1 类声明 4.3.2 类体 (Class Body),第四章 java 中的对象、类、包和接口,8,4.3 创建类,一个类包括两部分: 类声明 类体 见图:13parts,第

4、四章 java 中的对象、类、包和接口,9,4.3 创建类 4.3.1 类声明,在类的声明里,说明了类的名字及其它属性。下图说明了类声明中包含的各部分:,第四章 java 中的对象、类、包和接口,10,4.3 创建类 4.3.1 类声明,说明: 在类声明中, public、abstract、final为类的修饰符,是可选的,缺省时说明所定义的类是非public、非abstract、非final的类。,第四章 java 中的对象、类、包和接口,11,4.3 创建类 4.3.2 类体,类体为该类的对象提供了在生存期内需要的所有代码。包括以下几部分: 构造方法( constructor ) 成员变量

5、( member variable )的声明 方法(Method)的实现,第四章 java 中的对象、类、包和接口,12,4.3 创建类 4.3.2 类体,1.构造方法 定义:类中用来初始化新建的对象的方法称构造方法。 特点: 无返回类型, 方法名与类名相同,第四章 java 中的对象、类、包和接口,13,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

6、 中的对象、类、包和接口,14,4.3 创建类 4.3.2 类体,1.构造方法 说明: 其中变量和方法称为类的成员(成员变量和成员方法),而构造方法不是类的成员。 每个类中至少有一个构造方法。 定义类时如未定义构造方法,运行时系统会为该类自动定义缺省的构造方法。 没有任何参数 没有body 不做任何事情,第四章 java 中的对象、类、包和接口,15,4.3 创建类 4.3.2 类体,1.构造方法 说明: 构造方法只能由new运算符调用 构造方法同样也有访问权限的限制 public protected private package,第四章 java 中的对象、类、包和接口,16,4.3 创建

7、类 4.3.2 类体,2.成员变量的声明 成员变量在类体中声明,但在构造方法和方法之外 。 classDeclaration member variable declarations constructor declarations method declarations ,第四章 java 中的对象、类、包和接口,17,4.3 创建类 4.3.2 类体,2.成员变量的声明 声明格式:,第四章 java 中的对象、类、包和接口,18,4.3 创建类 4.3.2 类体,2.成员变量的声明 说明: accessLevel: 对成员变量的访问控制,有四级访问控制:public, protected,

8、 package, private。缺省时为package。 static: 说明该变量为类变量,缺省时为实例变量。 final: 指明该变量的值不能被改变,既该变量为常量。 例 final double AVOGADRO = 6.023e23;,第四章 java 中的对象、类、包和接口,19,4.3 创建类 4.3.2 类体,2.成员变量的声明 说明: type: 用于说明成员变量的类型。可以是基本数据类型,如int,float,boolean 等,也可以是引用类型,如数组名,类或接口名。 在同一个类中不允许有同名的成员变量,但允许成员变量名和方法名相同。,第四章 java 中的对象、类、包

9、和接口,20,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 中的对象、类、包和接口,21,4.3 创建类 4.3.2 类体,3.方法的实现 与类相似,方法的声明也包括两部分:方法声明和方法

10、体:如下图所示:,第四章 java 中的对象、类、包和接口,22,4.3 创建类 4.3.2 类体,3.方法的实现 方法声明: 定义方法的属性,如访问控制级,返回值的类型,方法名字,参数等,第四章 java 中的对象、类、包和接口,23,4.3 创建类 4.3.2 类体,3.方法的实现 返回值:返回值的数据类型必须和声明中的返回类型一致,或者完全相同,或者是它的一个子类 。 当一个方法不需要返回值时,返回类型为void。,第四章 java 中的对象、类、包和接口,public Number returnANumber() . . . ,24,4.3 创建类 4.3.2 类体,3.方法的实现 参

11、数传递: 1)参数的类型可以是: 简单数据类型:值传送。方法接收参数的值,但并不能改变这些参数的值 引用数据类型(数组类型、类或接口): 地址传递。传递给方法的是数据在内存中的地址, 见例题:ArgumentTest.java,第四章 java 中的对象、类、包和接口,25,4.3 创建类 4.3.2 类体,3.方法的实现 参数传递: 2)参数的命名: 参数名字可以与类的成员变量 相同,但参数名会隐藏成员。变量为了区别参数与类的成员变量,我们必须使用this class Circle int x, y, radius; public Circle(int x, int y, int radiu

12、s) this.x = x; this.y = y; this.radius = radius; ,第四章 java 中的对象、类、包和接口,26,4.3 创建类 4.3.2 类体,3.方法的实现 方法体: 定义:方法的实现部分,包括局部变量的声明和所有合法的java语句。 局部变量:在方法体内定义的变量称局部变量,局部变量的作用域限于方法内。如果局部变量的名字和类的成员变量的名字相同,则类的成员变量被隐藏 可以使用this 调用当前类的成员变量。,第四章 java 中的对象、类、包和接口,27,4.3 创建类 4.3.2 类体,3.方法的实现 例题: class Variable int x

13、=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 中的对象、类、包和接口,28,4. 变量的作用域 变量的作用域指明可访问该变量的一段代码 按作用域来分,变量可以有下面几种: 局部变量 Local variable 类变量 Member variable

14、方法参数 Method parameter 例外处理参数 Exception-handler parameter,第四章 java 中的对象、类、包和接口,4.3 创建类 4.3.2 类体,29,4. 变量的作用域,第四章 java 中的对象、类、包和接口,4.3 创建类 4.3.2 类体,30,4.2 对象的生命周期,创建对象 对象的使用 清除对象,第四章 java 中的对象、类、包和接口,31,4.2 对象的生命周期,创建对象 通过创建一个对象可创建类的一个实例, 也称实例化此类。 例Rectangle rect = new Rectangle(); 创建一个对象包括三部分: 声名部分 实

15、例化部分 初始化部分,第四章 java 中的对象、类、包和接口,32,4.2 对象的生命周期1. 创建对象,声名对象 声明对象的名字和类型,用类名来说明对象的类型。 格式:type name 说明: 声明对象的规则与变量声明规则相同,但对象变量是引用类型; 在java里类和接口都可以作为数据类型来使用; 对象声明通知编译器name将用来引用type类型的变量 对象声明并不创建新的对象。 例: Rectangle rect;,第四章 java 中的对象、类、包和接口,33,4.2 对象的生命周期1. 创建对象,实例化对象 操作符new通过为新对象分配存储空间来实例化类 格式: new 类的构造方

16、法 例 new Rectangle(100, 200); Rectangle rect = new Rectangle(100, 200);,第四章 java 中的对象、类、包和接口,34,4.2 对象的生命周期1. 创建对象,初始化对象 每个类都至少有一个构造函数,当创建对象时调用指定的构造函数来初始化对象 例 Rectangle rect = new Rectangle(); Rectangle rect = new Rectangle(100, 200); Rectangle rect = new Rectangle(new Point(44,78); 见例题:Rectangle.jav

17、a 注:在定义类时如未定义构造函数系统,java会自动构造一个没有参数的构造函数。,第四章 java 中的对象、类、包和接口,35,第四章 java 中的对象、类、包和接口,小结: public class MyDate private int day = 1; private int month = 1; private int year = 2000; public MyDate( int day, int month, int year) . public void print() . public class TestMyDate public static void main( St

18、ring args) MyDate my_ birth = new MyDate( 22, 7, 1964); ,4.2 对象的生命周期1. 创建对象,36,创建一个类对象: MyDate my_ birth = new MyDate( 22, 7, 1964);,第四章 java 中的对象、类、包和接口,4.2 对象的生命周期1. 创建对象,37,两个引用变量的赋值将会产生如下结果: int x = 7; int y = x; MyDate s = new MyDate( 22, 7, 1964); MyDate t = s; t = new MyDate( 22, 12, 1964); 两

19、个变量指向一个对象:,第四章 java 中的对象、类、包和接口,4.2 对象的生命周期1. 创建对象,38,当t 变量赋予一个新值时: t = new MyDate(22, 12, 1964); 两个变量分别指向两个对象:,第四章 java 中的对象、类、包和接口,4.2 对象的生命周期1. 创建对象,39,见例题:Assignment.java 结果: 1: n1.i: 9, n2.i: 472: n1.i: 47, n2.i: 473: n1.i: 27, n2.i: 27 将一个对象传递到方法内部时,也会产生此现象 见例题:PassObject .java 输出结果如下:1: x.c:

20、a2: x.c: z,第四章 java 中的对象、类、包和接口,4.2 对象的生命周期1. 创建对象,40,4.2 对象的生命周期2. 对象的使用,使用对象包括: 从对象中获得信息 改变对象的状态 使对象执行某些操作 实现途径: 引用对象的变量 调用对象的方法,第四章 java 中的对象、类、包和接口,41,4.2 对象的生命周期 2. 对象的使用,引用对象的变量 引用对象变量的格式: 对象引用.对象的变量 例: rect.origin = new Point(15, 37); area = rect.height * rect.width; height = new Rectangle().

21、height; 说明: 可以像使用其它变量一样来使用对象的变量。 例如:area = rect1.height *rect1.width,第四章 java 中的对象、类、包和接口,42,4.2 对象的生命周期 2. 对象的使用,调用对象的方法 格式: 对象引用.对象方法名(); 或 对象引用.对象方法名(参数表); 例 rect.move(15, 37); new Rectangle(100, 50).area() 说明: 对于返回值的方法,方法调用可以用于表达式中 调用一个对象的方法即是向该对象发送一个消息.,第四章 java 中的对象、类、包和接口,43,4.2 对象的生命周期3. 清除对

22、象,java运行使系统有一个垃圾回收进程负责清除不再使用的对象。 垃圾回收器 垃圾回收器定期扫描内存,对于被应用的对象加上标记,按可能的路径扫描结束后清除未加标记的对象。 被回收的对象是: 不再被任何引用变量引用的对象 引用变量自动放弃 人为地将引用变量置为null,第四章 java 中的对象、类、包和接口,44,4.2 对象的生命周期3. 清除对象,垃圾回收器 当系统的内存用尽或程序中调用System.gc()要求进行垃圾收集时,垃圾收集线程与系统同步运行。否则垃圾收集器在系统空闲时异步地执行。,第四章 java 中的对象、类、包和接口,45,4.2 对象的生命周期3. 清除对象,finia

23、lize()方法 在一个对象被垃圾回收器回收之前,java解释器会自动调用对象的finalize()方法。通常在该方法内包括了释放系统资源的代码段。 finalize( )方法在类java.lang.Object中实现 如: protected void finalize ( ) throws throwable / clean up code for this class super. finalize( ); /清除对象使用的所有资源,包括由于继/承关系而获得的资源 ,第四章 java 中的对象、类、包和接口,46,4.4 包的创建和使用,第四章 java 中的对象、类、包和接口,定义:

24、包是一组相关的类或接口的集合, 它提供了访问保护和名字空间管理。Java编译器使用文件系统目录来保存包。,47,4.4 包的创建和使用,第四章 java 中的对象、类、包和接口,使用包的好处: 程序员能很容易确定同一包中的类是相互关联的。 程序员能很方便地了解到在哪里可以找到能完成特定功能的类 由于每个包都创建了一个名字空间,个人创建的类名不会和其它包中的类名名发生冲突 可以使同一包中的类彼此不加限制地访问,而同时对其它包中的类提供访问控制。,48,4.4 包的创建和使用,第四章 java 中的对象、类、包和接口,1. 创建包 格式:package pkg1.pkg2.pkg3; packag

25、e语句必须放在原文件的开始处。 例如: java.io java.util java.lang java.applet javax.swing package graphics; public class Circle . . . ,49,4.4 包的创建和使用,第四章 java 中的对象、类、包和接口,1. 创建包 说明: package的作用域是整个源文件 如果在同一个源文件中定义了多个类,最多仅可以有一个类用public修饰,且源文件名必须与该类名相同 当未使用package语句时, 类和接口放在无名缺省包里 包的命名习惯:将Internet域名作为包名 例如:pany.region.p

26、ackage.,50,4.4 包的创建和使用,第四章 java 中的对象、类、包和接口,2. 包的使用 包中的所有类中只有public类能被包外部的类访问。 有三种方法访问包中的类: 1) 使用长名字引用包中的公共成员 即在类名前注明包名 例 graphics.Rectangle graphics.Rectangle myRect = new graphics.Rectangle();,51,4.4 包的创建和使用,第四章 java 中的对象、类、包和接口,2. 包的使用 引进包的公共成员 在文件的开始处使用import语句将指定的成员引进到当前文件中. 格式: import pkg1.pkg

27、2.类名 例 import graphics.Circle; Circle myCircle = new Circle();,52,4.4 包的创建和使用,第四章 java 中的对象、类、包和接口,2. 包的使用 3) 引进整个包 使用import语句引进包中的所有类和接口 格式: import pkg1.pkg2.* 例 import graphics.*; 现在可以使用短名字来引用类graphics包中的所有类. Circle myCircle = new Circle(); Rectangle myRectangle = new Rectangle();,53,4.4 包的创建和使用,第

28、四章 java 中的对象、类、包和接口,3. 源文件和类文件的管理 JDK利用文件系统的层次结构来管理源文件和类文件。源文件和类文件所在的目录名应与其中的类所在的包名对应,编译器和解释器按此机制来查找类。如:,54,4.4 包的创建和使用,第四章 java 中的对象、类、包和接口,3. 源文件和类文件的管理,55,4.4 包的创建和使用,第四章 java 中的对象、类、包和接口,3. 源文件和类文件的管理 当源文件中有多个类定义时,编译后将产生多个类文件。,56,4.4 包的创建和使用,第四章 java 中的对象、类、包和接口,3. 源文件和类文件的管理 虽然类文件所在的目录序列必须与包名对应

29、,但不一定与源文件在相同的目录中。,javac d d:classes Rectangle.java,57,4.4 包的创建和使用,第四章 java 中的对象、类、包和接口,3. 源文件和类文件的管理 (简单模式) 说明: 将主文件放在一个目录下:d:testpackageLibTest.java 注意不是: d:testpackagec05LibTest.java 2)在d:testpackage下建立目录: D:testpackagecombruceeckelutilVector.java 注意:是Vector.java,不是vector.java.,58,简单模式,直接在d:testpa

30、ckage下编译:javac d . LibTest.java 注意:javac LibTest.java 可以编译通过,但不能运行。 直接在d:testpackage下运行:java c05.LibTest,59,简单模式(续),在c:下如何编译运行 Javac d d:temp sourcepath e:testpath e:testpathLibTest.java 注意:-sourcepath后的目录不是:e:testpathcombruceeckelutil 运行:java classpath d:temp c05.LibTest 注意:不是:java d:tempc05LibTest

31、,60,复杂模式,在d:test下放:D:testpackageLibTest.java 在e:testpath下放e:testpathcombruceeckelutilVector.java 在d:test目录下编译和运行: javac d . sourcepath e:testpath LibTest.java 运行: Java c05.LibTest 不是:java classpath e:testpath c05.LibTest 但在c:下运行就需要-classpath了。,61,最复杂的情况: LibTest.java在e:testpackage下,com在d:test目录下: 在c

32、:tools下进行调试。 javac -d c:setup sourcepath e:testpackage classpath c:setup e:testpackageLibTest.java,62,使用包时,javac必须使用“-d”且其源路径一定要使用绝对路径d:testsources(在任何目录下),或使用相对路径(在当前目录下)如果类文件和原文件在同一个目录下,则用”.”。格式为: javac d 类文件路径(或 “.”)(绝对或相对),愿文件路径(绝对 或相对),63,使用 import时,一定要加上”-classpath”(后跟路径),然后再加上”-d”(后跟类路径,再后源文件

33、的路径)。 使用包时,java 命令可以使用”-classpath”(不设置CLASSPATH)时,设置CLASSPATH时,就不使用。在“-classpath”指定的目录下,也不使用该选项。,64,使用包时,java 命令必须在”-classpath”指定的以上目录,以下无论如何也不执行。 包对应于文件系统的目录管理方式可以帮助编译器和解释器找到程序中的类和接口存放的地方。 CLASSPATH指出用户的类库所在目录,在类路径(CLASSPATH)中只需指出包路径之上的顶层路径 CLASSPATH= . ; d:classes,65,4.4 包的创建和使用,第四章 java 中的对象、类、包和

34、接口,3. 源文件和类文件的管理 设置类路径的方法 设置环境变量CLASSPATH(不推荐) set classpath=.;d:classes 在调用编译器或解释器时使用-classpath选项 例 java -classpath d:classes com.taranis.grathpics.Test 见例子:包的使用.txt,66,java classpath d:packagetest c05.LibTest d:packagetest 是Main函数所在的文件所在的目录(很多人都任为是Import指向的文件所放的目录) 在java命令中是不用指明Import所指向文件的路径,如果在所

35、有的类文件基于同同一个根目录,否则用classpath. 在d:temp: java classpath e:testpackagesource(import 指向类文件根目录); e:lecture(main所在的类的跟目录) c05.LibTest 只有javac中才考虑import所指向的文件的路径.,67,但是javac也不考虑,因为它要求一定要把Import文件所指向的文件的根目录(import .*,com目录)放在main函数所在文件的同一个目录下. 而且编译的时候,一定要把目录放到main函数所在的目录,否则,找不到com. 否则要使用-sourcepath.(在d:temp目

36、录下. javac d d:classes sourcepath e:testpackagesource LibTest.java 只有在-d 后面加上-classpath 才能在-d 后的路径中创建import指向的路径的类文件.,68,4.5 类成员的访问控制,在java语言中对类的成员有四种级别的访问控制:private, protected, public, package. 如定义类时未指定访问控制说明符,则其访问控制级别为package。,第四章 java 中的对象、类、包和接口,69,4.5 类成员的访问控制,第四章 java 中的对象、类、包和接口,例题见:访问权限.txt,7

37、0,4.6 类成员与实例成员,第四章 java 中的对象、类、包和接口,在类中声明一个变量或方法时,还可以指定它为实例成员或类成员。如下的格式: static type classVar; static returnType classMethod ( paramlist ) ,71,4.6 类成员与实例成员,第四章 java 中的对象、类、包和接口,类变量与实例变量 二者区别: 运行时系统在首次遇到类变量时就为类变量存储空间;而当创建类的实例对象时才为实例变量分配存储空间。 不管有多少类的实例,类变量只有一份拷贝,即所有实例共享相同的类变量;而每个实例对象都有自己的实例变量。 实例变量只能通

38、过对象来访,而类变量既可以通过类名来访问,也可以通过实例对象来访问。,72,4.6 类成员与实例成员,第四章 java 中的对象、类、包和接口,类方法与实例方法 二者区别: 实例方法即能访问当前对象的实例变量也能访问类变量;类方法只能访问类变量而不能访问实例变量。 实例方法只能由实例对象来调用而类方法即可以由实例对象调用也可以由类名直接调用。 见例题:MemberTest.java,73,4.6 类成员与实例成员,第四章 java 中的对象、类、包和接口,说明: 可用static来定义全局变量和全局方法,这时由于类成员仍然封装在类中,与C、C+相比,可以限制全局变量和全局方法的使用范围而防止冲

39、突。 一个类的main( )方法必须要用static来修饰,也是因为Java运行时系统在开始执行一个程序前,并没有生成类的一个实例,它只能通过类名来调用main( )方法作为程序的入口。 通常,static与final一起使用来指定一个常量 如:protected static final String DISABLE = disable;,74,4.6 类成员与实例成员,第四章 java 中的对象、类、包和接口,初始化类变量和实例变量 (Instance and Class Members) 可以在类中声明的时候初始化 class BedAndBreakfast static final i

40、nt MAX_CAPACITY = 10; /类变量 boolean full = false; float f = 3.14f; Depth o = new Depth(); /引用类型 int i = f(); /通过调用一个方法来提供初始值 ,75,4.6 类成员与实例成员,第四章 java 中的对象、类、包和接口,初始化类变量和实例变量 实例变量:在构造方法中进行初始化。 class Counter int i;Counter(j) i = j; / . . .,76,4.6 类成员与实例成员,第四章 java 中的对象、类、包和接口,初始化类变量和实例变量 类变量:类初始块中进行初始

41、化。 class Spoon static int i; static i = 47; / . . . 这段代码仅执行一次首次生成那个类的一个对象时,或者首次访问属于那个类的一个static成员时(即便从未生成过那个类的对象)。 见例题:ExplicitStatic.java,77,4.6 类成员与实例成员,第四章 java 中的对象、类、包和接口,初始化类变量和实例变量 说明: 类初始块不能在任何方法内。 类初始块只执行一次,78,4.7 继 承,第四章 java 中的对象、类、包和接口,4.7.1 理解继承 4.7.2 类 jave.lang.Object 4.7.3 final类和方法

42、4.7.4 abstract类和方法,79,4.7 继 承4.7.1 理解继承,父类、子类和继承 成员变量的隐藏和方法的重写 super关键字 方法的重载 运行时多态 instanceof 操作符,第四章 java 中的对象、类、包和接口,80,4.7 继 承4.7.1 理解继承,第四章 java 中的对象、类、包和接口,父类、子类和继承 例子:,81,4.7 继 承4.7.1 理解继承,第四章 java 中的对象、类、包和接口,父类、子类和继承 定义: 子类:继承而得到的类为子类 。子类继承父类的状态和行为,同时也可以修改父类的状态或重写父类的行为,并添加新的状态和行为 父类:被继承的类为父

43、类,父类包括所有直接或间接被继承的类,82,4.7 继 承4.7.1 理解继承,父类、子类和继承 Java语言是单继承机制 ,不支持多重继承 单继承是代码更加可靠。 接口可以提供多继承功能。,第四章 java 中的对象、类、包和接口,83,4.7 继 承4.7.1 理解继承,第四章 java 中的对象、类、包和接口,交通工具,汽车,卡车,旅行车,小汽车,轿车,跑车,面包车,父类、子类和继承,84,4.7 继 承4.7.1 理解继承,父类、子类和继承 Java中,所有的类都是通过直接或间接地继承java.lang.Object得到的,第四章 java 中的对象、类、包和接口,85,4.7 继 承

44、4.7.1 理解继承,父类、子类和继承 创建子类 通过在类的声明中加入extends子句来创建一个类的子类,其格式如下: class SubClass extends SuperClass 说明:如果缺省extends子句,则该类为java.lang.Object的子类,第四章 java 中的对象、类、包和接口,86,4.7 继 承4.7.1 理解继承,父类、子类和继承 子类能够继承什么? 子类能够继承父类中public和protected的成员。 子类能够继承父类中没有访问控制的成员,只要子类和父类在同一个包内。 子类不能继承父类隐藏的成员变量和重写的父类方法 子类不能继承父类中privat

45、e成员。 子类不能继承父类中构造方法。因为构造方法不是类的成员,第四章 java 中的对象、类、包和接口,87,4.7 继 承4.7.1 理解继承,第四章 java 中的对象、类、包和接口,成员变量的隐藏和方法的重写 变量的隐藏:子类中声明了和父类同名的变量,父类的成员变量被隐藏。 方法的重写:子类中定义了与父类相同的方法, 则父类的方法被重写。,88,4.7 继 承4.7.1 理解继承,第四章 java 中的对象、类、包和接口,成员变量的隐藏和方法的重写 例题: class SuperClass int x; void setX( ) x = 0; ,class SubClass exten

46、ds SuperClass int x; /hide x in SuperClass void setX( ) /overload x = 5; ,89,4.7 继 承4.7.1 理解继承,第四章 java 中的对象、类、包和接口,成员变量的隐藏和方法的重写 说明: 重写的方法和父类中被重写的方法要具有相同的名字,相同的参数表和相同的返回类型 子类通过成员变量的隐藏和方法的重写可以把父类的状态和行为改变为自身的状态和行为,90,4.7 继 承4.7.1 理解继承,例题:方法的重写,第四章 java 中的对象、类、包和接口,91,4.7 继 承4.7.1 理解继承,第四章 java 中的对象、类

47、、包和接口,成员变量的隐藏和方法的重写 说明: 子类中不能重写父类中的final method 子类中必须重写父类中的abstract method, 否则子类也为抽象类。,92,4.7 继 承4.7.1 理解继承,3. super 关键字 super用来引用当前对象的父类, super来实现对父类成员的访问。 应用: 子类在隐藏了父类的成员变量或重写了父类的方法后,常常还要用到父类的成员 在重写的方法中使用父类中被重写的方法以简化代码的编写,第四章 java 中的对象、类、包和接口,93,4.7 继 承4.7.1 理解继承,3. super 关键字 super的使用有三种情况: 用来访问父类

48、被隐藏的成员变量,如:super.variable 用来调用父类中被重写的方法,如: super.Method ( paramlist ); 用来调用父类的构造函数,如 super( paramlist ); 例题:inheritance.java,Manager.java,第四章 java 中的对象、类、包和接口,94,4.7 继 承4.7.1 理解继承,3. super 关键字 说明: 用来调用父类的构造函数super( paramlist )必须放在子类构造方法的句首。 如果子类没有明确的调用父类的构造函数,编译器会自动的调用super()语句,它调用父类的默认构造函数。 如果父类没有默

49、认构造函数则编译出错。 例题:Manager1.java,第四章 java 中的对象、类、包和接口,95,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 中的对象、类、包和接口,96,4.7 继 承4.7.1 理解继承,4. 方法的重载

50、(overloading) 构造方法也可以重载。可以在构造方法的第一条语句使用this来调用其他的构造方法。 见例题 Employee.java,第四章 java 中的对象、类、包和接口,97,4.7 继 承4.7.1 理解继承,5. 运行时多态 对于重写或继承的方法,Java运行时系统根据调用该方法的实例的类型来决定选择哪个方法调用。,第四章 java 中的对象、类、包和接口,98,4.7 继 承4.7.1 理解继承,说明: 对子类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法, 如果子类继承了父类的方法(未重写),则运行时系统调用父类的方法。,第四章 java 中的对象、

51、类、包和接口,99,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 中的对象、类、包和接口

52、,运行结果为: C:java Dispatch Inside Bs callme( ) method,例题:,100,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=new Student

53、(); GraduateStudent gs=new GraduateStudent() ; fn(s); fn(gs); ,101,4.7 继 承4.7.1 理解继承,例题:Shapes.java 为什么要上溯到父类呢? 我们可以从以下例题中找到答案: 在程序中,如果一个类包含了自己,它就可以在任何地方代替自己 例题:music.java 例题:music1.java,第四章 java 中的对象、类、包和接口,102,4.7 继 承4.7.1 理解继承,6. instanceof 操作符 用来判断对象属于哪个类,第四章 java 中的对象、类、包和接口,public class Employ

54、ee 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 ,例如:,103,4.7 继 承4.7.2

55、类 jave.lang.Object,第四章 java 中的对象、类、包和接口,类java.lang.Object处于Java开发环境的类层次树的根部,其他所有的类都直接或间接地为它的子类 一个类如果没有声明继承某个类,则默认继承Object类。 public class Employee . 等价于: public class Employee extends Object . ,104,4.7 继 承4.7.2 类 jave.lang.Object,第四章 java 中的对象、类、包和接口,该类定义了一些所有对象最基本的状态和行为常用的有: equals() getClass toStri

56、ng finalize notify notifyAll wait,105,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.pr

57、intln (“objects are equal”); else System.out.println (“objects are equal”);,106,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.

58、getClass( ).getName( ) ); ,107,4.7 继 承4.7.2 类 jave.lang.Object,第四章 java 中的对象、类、包和接口,2. getClass() 可以用getClass创建一个类的实例,而不必在编译时即知道到底是哪个类。 下例创建了一个与对象obj具有相同类型的一个实例, 所创建的对象可以是任何类。 Object creatNewInstanceOf (object obj) return obj.getClass( ).newInstance( ); ,108,4.7 继 承4.7.2 类 jave.lang.Object,第四章 java

59、中的对象、类、包和接口,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,109,4.7 继 承4.7.2 类 jave.lang.Object,第四章 java 中的对象、类、包和接口,类java.lang.Object处于Java开发环境的类层次树的根部,其他所有的类都直接或间接地为它的子类 一个类如果没有声明继承某个类,则默认继承Object

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论