Java程序设计 教学课件 ppt 作者 刘慧宁 05 05

上传人:E**** 文档编号:89155806 上传时间:2019-05-19 格式:PPT 页数:86 大小:482.01KB
返回 下载 相关 举报
Java程序设计 教学课件 ppt 作者 刘慧宁 05 05_第1页
第1页 / 共86页
Java程序设计 教学课件 ppt 作者 刘慧宁 05 05_第2页
第2页 / 共86页
Java程序设计 教学课件 ppt 作者 刘慧宁 05 05_第3页
第3页 / 共86页
Java程序设计 教学课件 ppt 作者 刘慧宁 05 05_第4页
第4页 / 共86页
Java程序设计 教学课件 ppt 作者 刘慧宁 05 05_第5页
第5页 / 共86页
点击查看更多>>
资源描述

《Java程序设计 教学课件 ppt 作者 刘慧宁 05 05》由会员分享,可在线阅读,更多相关《Java程序设计 教学课件 ppt 作者 刘慧宁 05 05(86页珍藏版)》请在金锄头文库上搜索。

1、第5章 继承与多态,5.1 继承简介 5.2 继承与子类 5.3 覆盖与隐藏 5.4 关键字final 5.5 对象类型转换和运算符instanceof 5.6 多态与动态绑定,第5章 继承与多态(续),5.7 抽象类和抽象方法 5.8 接口 5.9 类Object 5.10 包装类和自动装箱与拆箱 5.11 内部类 5.12 习题,5.1 继承简介,最简单的代码重用是在方法中使用现有的类定义对象。此外,代码重用还表现为使用现有的类来定义新类,这种定义新类的方式主要有两种:组合和继承。 组合是指定义新类时,使用现有类的对象作为数据成员。它通常用于描述对象之间的“has-a”(拥有)关系。,5.

2、1 继承简介(续),5.1 继承简介(续),继承是从一个类派生出一个新类的过程。 通过继承,可以让一个类拥有另一个类的全部属性和行为特征,即让一个类继承另一个类的全部属性和行为特征。 派生出来的新类称作子类(也称派生类或次类);而被继承的类称作父类(也称作基类或超类)。 继承通常用于描述对象之间的“is-a”(是一个)或“is-like-a”(像是一个)关系。,5.1 继承简介(续),单继承是指从一个父类派生出一个子类的过程,而多继承是指从一个以上的父类派生出一个子类的过程。 Java语言仅支持单继承,其多继承只能通过接口等间接实现。,5.2 继承与子类,5.2.1 继承的语法 5.2.2 修

3、饰符protected 5.2.3 子类的构造方法 5.2.4 继承与初始化,5.2.1 继承的语法,Java程序中定义的每个类都继承于一个已存在的类,如果没有显式指定,就隐含继承于类java.lang.Object。 class 子类名 extends 父类名 定义子类新成员 例5-1 子类的定义,源代码,编译运行,5.2.2 修饰符protected,具有保护访问权限的成员可以在其所属类、其所属类的子类及其所属包中访问。 例5-2 修饰符protected,源代码,5.2.2 修饰符protected(续),派生时,子类自动获取父类的所有成员(构造方法除外,它不能被子类继承)。当子类和父类

4、在同一包中时,父类成员被子类继承后,除私有成员外,访问权限保持不变(私有成员不能在子类中访问,也不能通过子类对象或子类名访问)。因此,当一个具有包访问权限的类被公用类继承时,该具有包访问权限的类中的公用成员在另一包中可以通过子类对象访问(如果是静态公用成员,当然也可以通过子类名访问)。,举 例,5.2.2 修饰符protected(续),当子类和父类不在同一包中时,父类成员被子类继承后,公用成员访问权限保持不变,私有成员和具有包访问权限的成员不能在子类中访问,也不能通过子类对象或子类名访问,保护成员在子类中可以直接访问,也能通过子类对象或子类名访问,但不能通过父类对象访问(不过,如果是静态成员

5、,可以通过父类名访问)。此外,如果子类是公用类,保护成员在父类所属包中还可以通过子类对象或子类名访问。,举 例,5.2.2 修饰符protected(续),实际编程时,一般应该将数据成员声明为私有的,方法声明为公用的,只有确实希望某个方法具有包访问权限,但又能在其子类中访问,才将它声明为protected。,5.2.3 子类的构造方法,子类不能继承父类的构造方法。因此,创建子类对象时,为了初始化从父类中继承来的数据成员,系统需要调用其父类构造方法。 Java编译器会自动在子类构造方法中首先插入对其父类构造方法的调用,以初始化从父类中继承来的数据成员。 例5-3 调用父类的无参构造方法,源代码,

6、编译运行,5.2.3 子类的构造方法(续),Java编译器虽然会自动在子类构造方法中插入对父类构造方法的调用,但它调用的是父类的无参构造方法。如果父类中没有可调用的无参构造方法(即父类中没有无参构造方法或者其无参构造方法不能在当前子类中访问)或者希望调用带参数的父类构造方法,这种自动插入的调用显然就不能满足需要,这时,就要使用关键字super来显式调用父类构造方法(该构造方法必须能在当前子类中访问)。,5.2.3 子类的构造方法(续),显式调用父类构造方法的语法形式如下: super(参数); 其中,参数必须与希望调用的父类构造方法匹配,如果参数为空,则表示调用父类的无参构造方法。注意,构造方

7、法不能直接使用其方法名调用,否则,会引起编译错误。 例5-4 显式调用父类的构造方法,源代码,编译运行,5.2.3 子类的构造方法(续),使用关键字super调用父类构造方法的语句必须是构造方法的方法体中的第1条语句,否则会引起编译错误。如果构造方法没有显式使用关键字super调用父类构造方法,编译器一般会在其中自动插入对父类无参构造方法的调用,此时,如果父类中没有可调用的无参构造方法,将会引起编译错误。,5.2.3 子类的构造方法(续),与关键字this相同,使用关键字super调用父类构造方法时传递的参数,不能是关键字this或当前对象的实例成员,因为此时当前的对象并没有创建完成。 使用关

8、键字this调用所属类的另一个构造方法的语句也必须是构造方法的方法体中的第1条语句。因此,在一个构造方法中不能同时调用所属类和其父类的构造方法,如果一个构造方法中调用了所属类的另一个构造方法,编译器就不会自动插入对其父类无参构造方法的调用。,5.2.3 子类的构造方法(续),class A protected int i = 10; public A(int a) i = a; class B extends A private int j = 20; public B() super(j); /错误,参数也不能是i ,5.2.4 继承与初始化,1) 首次使用某个类(创建该类的对象或访问该类的

9、静态成员)时,Java系统查找相应的类文件并载入。 2) 在载入当前类所在类文件的过程中,系统如果发现该类有一个父类,而且该父类所在类文件还没有加载,就会立即停止当前类文件的加载,转而加载该父类所在类文件,如果该父类还有自己的父类,那么父类的父类也会按同样的方式处理,依此类推,直至继承链中的某个父类所在类文件已经被加载或开始加载最终根类Object所在类文件。,5.2.4 继承与初始化(续),3) 在加载最终根类(或其父类所在类文件已经加载的类)所在的类文件过程中,其中的静态初始化动作会执行。根类所在类文件加载完毕后,就会继续加载其直接子类所在类文件,加载过程中,其中的静态初始化动作也会执行,

10、依次类推,直至当前类的类文件加载完毕。注意,静态初始化动作只会在其所属类所在的类文件加载时执行一次。 4) 如果是创建类的对象,继续执行下列初始化动作。,5.2.4 继承与初始化(续),5) 系统首先为所有实例变量分配足够的存储空间并将它们初始化为默认值。 6) 调用当前类中相应的构造方法,该构造方法会首先递归调用所属类的另一个构造方法(如果构造方法使用关键字this调用了所属类的另一个构造方法)或父类的构造方法,直至根类Object为止。,5.2.4 继承与初始化(续),7)开始执行类Object中构造方法的语句前,系统首先按声明实例变量时指定初值的初始化动作和实例初始化块中的语句在该类定义

11、中出现的顺序依次执行它们,再执行构造方法中的语句。,5.2.4 继承与初始化(续),8)回归执行其他构造方法,如果某个构造方法调用了父类的构造方法,在开始执行该构造方法中的后续语句前,系统会首先按声明实例变量时指定初值的初始化动作和实例初始化块中的语句在相应类定义中出现的顺序依次执行它们,再执行构造方法中的后续语句;否则(即该构造方法使用关键字this调用了所属类的另一个构造方法),直接执行该构造方法中的后续语句。 例5-5 继承与初始化,源代码,编译运行,5.3 覆盖与隐藏,5.3.1 方法覆盖 5.3.2 数据成员和静态方法隐藏,5.3.1 方法覆盖,只有实例方法可以覆盖(也称重写)。 方

12、法覆盖时,子类中的方法应该与父类中被覆盖的方法有相同的方法名、返回值类型和形参类型列表。如果对应形参类型或形参个数不同,则是对同名方法的重载。 例5-6 方法覆盖,源代码,编译运行,5.3.1 方法覆盖(续),关键字super引用的是当前子类对象中的父类子对象。 关键字super可用来调用父类构造方法。 关键字super可用来在子类中访问从父类继承来的数据成员和方法。 如果父类的某个方法没有被子类覆盖,就可以在子类中直接调用。 子类不能对父类私有方法进行覆盖或重载,如果尝试在子类中覆盖或重载它,实际上定义的是一个新的方法。,5.3.1 方法覆盖(续),静态上下文中没有相应的super引用。 方

13、法覆盖时,不能降低其访问权限。 例: class A public void f() void g() class B extends A void f() /错误,降低了访问权限 public void g() /正确,可以提高访问权限 ,5.3.2 数据成员和静态方法隐藏,子类中也可以改写父类的数据成员和静态方法。不过,它不支持多态。Java语言中,这种改写成员的方式通常称为成员隐藏。 当某个父类的成员被隐藏时,子类中直接访问的就是它自己定义的成员。 很少隐藏数据成员和静态方法。 例5-7 成员隐藏,源代码,编译运行,5.4 关键字final,5.4.1 final变量 5.4.2 fin

14、al方法 5.4.3 final类,5.4.1 final变量,使用关键字final修饰一个基本数据类型或String型变量,并且在声明的同时初始化,那么该变量就成为一个常量。 常量的值在程序运行过程中不可改变。 例: final double PI = 3.1415; PI = 3; /错误,5.4.1 final变量(续),使用关键字final修饰的变量并不一定需要在声明的同时初始化。 例: public static double area(double radius) final double PI; PI = 3.1415; return (PI * radius * radius)

15、; 注意:任何一个变量被关键字final 修饰后,一旦初始化,其值便不能改变。,5.4.1 final变量(续),关键字final修饰的变量用作类的数据成员时,系统并不会为它提供默认值。 对于final静态变量,必须在声明的同时初始化(即定义常量),或在静态初始化块中初始化。 对于final实例变量,必须在声明的同时初始化(即定义常量),或在实例初始化块中初始化,又或在构造方法中初始化。,5.4.1 final变量(续),class A public static final double PI = 3.14; private static final int num1; private fi

16、nal int NUM2=(int)(Math.random() * 100); private final int num3; / num1 = 1; /错误,final静态变量不能在实例初始化块中初始化 static num1 = 1; A(int i) num3 = i; ,5.4.1 final变量(续),一般来说,应该保持final常量的值在其所属类的所有对象中相同。对于一个final实例常量,这可以通过使用常量表达式给它赋值实现。不过,如果final常量的值在其所属类的所有对象中都相同,为了节约存储空间,最好应该将它同时声明为静态的。final静态常量的值在其所属类的每个对象中一定相同,因为它只初始化一次。此外,为了便于其他包中的类取用,final静态常量通常还声明为公用的。,5.4.1 final变量(续),当方法的某个形参被final修饰时,可以在方法中读取它的值,但不能改变。 例: class A public void f(fin

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号