java实用教程第9讲继承和多态

上传人:tian****1990 文档编号:81710228 上传时间:2019-02-22 格式:PPT 页数:36 大小:269KB
返回 下载 相关 举报
java实用教程第9讲继承和多态_第1页
第1页 / 共36页
java实用教程第9讲继承和多态_第2页
第2页 / 共36页
java实用教程第9讲继承和多态_第3页
第3页 / 共36页
java实用教程第9讲继承和多态_第4页
第4页 / 共36页
java实用教程第9讲继承和多态_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《java实用教程第9讲继承和多态》由会员分享,可在线阅读,更多相关《java实用教程第9讲继承和多态(36页珍藏版)》请在金锄头文库上搜索。

1、第9讲 继承和多态,9.1 组合 9.2 继承 9.3 final关键字 9.4 多态 9.5 本讲小结,Java通过两种方式来实现代码的复用,即组合和继承。组合是指创建新类时,新类中的成员是由现有类的对象组成,这种方式比较直观。而继承是指在现有类的基础上添加新的代码。这两种方式都不会破坏原有代码。,9.1 组合,在创建新类时,可以使用已有类的对象作为新类的成员,当然也可以创建基本数据类型的成员。下面的程序代码展示了组合技术: / CompositionDemo.java class Wheel int count; Wheel(int count) this.count = count; c

2、lass Door int count; Door(int count) this.count = count; class Engine double displacement; Engine(double displacement) this.displacement = displacement; ,9.1 组合,class Car String name; Wheel wheel = new Wheel(4); Door carDoor =new Door(4); Engine carEngine = new Engine(3.0); Car(String name) this.nam

3、e = name; public class CompositionDemo public static void main(String args) Car car = new Car(“宝马X6“); System.out.println(“车名:“ + car.name); System.out.println(“排量:“ + car.carEngine.displacement); System.out.println(“门:“ + car.carDoor.count); System.out.println(“轮子:“ + car.wheel.count); 上述代码中,类Car是由

4、类String、类Wheel、类Door和类Engine组合而成的。,9.2 继承,继承是面向对象程序设计中不可缺少的部分,Java是单根继承,不支持类似C+中的多继承。所以在Java中有一个“祖先”类,名为Object,所有类都直接或间接的继承它,所有对象(包括数组)都实现这个类的方法。,9.2.1 继承的语法,表明“继承”时,使用关键字extends,如: class Person class Student extends Person 上面程序中类Student继承于Person类,Person类称为父类或基类,Student类称为子类或派生类。而在定义Person类时,并没有为其指定

5、父类,它默认的继承Object类,只不过“extends Object”可以省略: wclass Person extends Object 子类继承父类时,将得到父类中的所有成员,只是有的成员能够直接使用,有的成员只能间接使用。,9.2.2 父类的初始化,当创建一个子类的对象时,该对象中包含了一个父类的对象。这个存在于子类对象中的父类对象同单独使用父类创建的对象一模一样。而且父类对象要先被初始化,这个初始化的动作是由构造方法来完成的。下面程序代码证明了这一点: / PortableComputer.java class ElectricalEquipment ElectricalEquipm

6、ent() System.out.println(“ElectricalEquipment()“); class Computer extends ElectricalEquipment Computer() System.out.println(“Computer()“); ,9.2.2 父类的初始化,public class PortableComputer extends Computer PortableComputer() System.out.println(“PortableComputer()“); public static void main(String args) Po

7、rtableComputer myPc = new PortableComputer(); 上面程序的输出结果为: ElectricalEquipment() Computer() PortableComputer() 从上面程序的运行结果可以看出,创建子类的对象时,父类的构造方法先被调用,用来初始化包含在子类对象中的父类对象。 ElectricalEquipment类和Computer类中只定义了无参构造方法,即创建子类对象中的父类对象时,使用的是父类的无参构造方法。那么能不能使用父类的有参构造方 法呢?答案是肯定的.,9.2.2 父类的初始化,关于子类构造方法中调用父类的构造方法的规则,现

8、总结如下: (1)父类没有定义任何构造方法,或只定义了无参构造法,在创建子类对象时,会先无条件的调用父类的无参构造方法来初始化一个父类对象。 (2)父类只定义了有参构造方法,在创建子类的对象时,在子类构造方法中必须使用关键字super来代替父类的构造方法,而且super必须是子类构造方法的第一条语句。 (3)父类既定义了无参构造方法,也定义了有参构造方法,在创建子类的对象时,可以使用super调用父类的有参构造方法,也可以不使用super,这时系统会自动调用父类的无参构造方法。,9.2.3 再论方法重载,在一个类中可以定义多个同名的方法,这些方法通过参数的不同(参数的个数不同或类型不同)来区分

9、,称为方法的重载。在父类中定义了某个方法,而在子类中也定义了名字相同的方法,但两个方法的参数不同,这是也构成了重载。下面程序代码展示了这种情况:,9.2.3 再论方法重载,/ OverloadInExtend.java class School void show(int i) System.out.println(“show(“ + i + “)“); void show(int i,int j) System.out.println(“show(“ + i + “,“ + j + “)“); class University extends School void show(char c)

10、 System.out.println(“show(“ + c + “)“); public class OverloadInExtend public static void main(String args) University u = new University(); u.show(1); u.show(2,3); u.show(a); 在University类中有三个show方法:show(char c)、show(int i)和show(int j),三个方 法构成重载方法,其中后两个show方法是从父类School中继承过来的。 ,9.2.4 变量的隐藏和方法的重写,因为子类可

11、继承父类中的方法,所以子类不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。 子类中也可以定义与父类中名字相同的成员变量,因为名字相同,在子类中,从父类继承过来的这个变量被隐藏。下面的程序代码展示了方法的重写和变量的隐藏:,9.2.4 变量的隐藏和方法的重写,/ Overriding.java class Tree double height = 10.2; void printHeight() System.out

12、.println(“Tree height:“ + height); void printName(String name) System.out.println(“Tree name:“ + name); class Pine extends Tree double height = 20.3; void printHeight() System.out.println(“Pine tree height:“ + height); void printName(String name) System.out.println(“Pine tree name:“ + name); public

13、class Overriding public static void main(String args) Pine p = new Pine(); p.printName(“MyTree“); p.printHeight(); ,9.2.5 super关键字,在“父类的初始化”一节中证明了:在创建子类的对象时,会先创建一个父类的对象。那么,怎么去引用里面的父类对象呢?答案是使用super,this指的是当前对象的引用,而super是当前对象里面的父类对象的引用。下面是super的用法: (1)在子类构造方法中调用父类构造方法。示例程序如Square.java; (2)在子类中访问被重写的父类

14、方法; (3)在子类中访问被隐藏的父类成员变量。,9.3 final关键字,被关键字final修饰的东西是不能被修改的,final可以修饰变量、方法和类。,9.3.1 final修饰的变量, 声明final字段有助于优化器作出更好的优化决定,因为如果编译器知道字段的值不会更改,那么它能安全地在寄存器中高速缓存该值。final字段还通过让编译器强制该字段为只读来提供额外的安全级别。 final修饰的变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于复合数据类型来说其引用不可再变。 关键字final修饰的变量也可以定义为static的,称为静态常量,在内存中占据一段不

15、能改变的存储区域,表示静态常量的名字全部用大写字母。,9.3.1 final修饰的变量,下面程序展示了final的用法: / FinalData.java public class FinalData final int a = 1; static final int B = 2; final int c = 1,2,3,4,5; public static void main(String args) FinalData f = new FinalData(); /* f.a = 10;/编译错误 FinalData.B = 20;/编译错误 f.c = new int10;/编译错误 */

16、 f.c0 = 10; for (int i = 0;i f.c.length;i+) System.out.print(f.ci + “ “); ,9.3.2 空白final, 在Java中,如果在声明变量时不给其赋值,系统可以对其进行自动初始化,基本类型变量自动初始化为0,其余类型变量自动初始化为空。但是final类型的变量必须显示初始化,且初始化只能在两个地方进行:一是在定义处,二是在构造方法中。且不能同时即在定时时赋值,又在构造方法中赋值。 如果在声明final的变量时没有给其赋值,则称为空白final,这个变量只有一次赋值机会,那就是在构造方法中。,9.3.2 空白final,下面程序展示了空白final的赋值: /

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

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

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