继承性和多态性

上传人:工**** 文档编号:569932297 上传时间:2024-07-31 格式:PPT 页数:25 大小:284KB
返回 下载 相关 举报
继承性和多态性_第1页
第1页 / 共25页
继承性和多态性_第2页
第2页 / 共25页
继承性和多态性_第3页
第3页 / 共25页
继承性和多态性_第4页
第4页 / 共25页
继承性和多态性_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《继承性和多态性》由会员分享,可在线阅读,更多相关《继承性和多态性(25页珍藏版)》请在金锄头文库上搜索。

1、下一页上一页返回开始继承性和多态性Stillwatersrundeep.流静水深流静水深,人静心深人静心深Wherethereislife,thereishope。有生命必有希望。有生命必有希望下一页上一页返回开始继承性和多态性2主要内容主要内容n4.1 继承性n派生类的定义nsuper关键字nprotected和final关键字n4.2 多态性n4.3 抽象类和接口n抽象类n接口n4.4 初始化块下一页上一页返回开始继承性和多态性34.1 继承性继承性类具有继承性,子子类对父父类的的继承关系承关系体现了特殊和一般的关系。通过继承可以更有效地组织程序结构,明确类间关系,并充分利用已有的类来完成

2、更复杂、深入的开发。 Java中的所有类都是java.lang.Object类的子类。4.1.1 派生派生类的定的定义nJava语言中派生类的定义格式如下:class class extendsextends 下一页上一页返回开始继承性和多态性4继承性继承性n示例:参看例4.1/ Cylinder1.javapublic class Cylinder1 extends Circle private double length = 1; / 新增的数据成员 public double getLength() return length; public void setLength(double

3、length) this.length = length; public double findVolume() / 返回圆柱体的体积 return findArea() * length; / findArea()是从基类Circle继承下来的方法 public String toString() / 覆盖Object类中的toString()方法 return (圆柱体的高为: + getLength() + 圆柱体的半径为: + super.getRadius();/ TestCylinder1.javapublic class TestCylinder1public static vo

4、id main(Stringargs)Cylinder1 cylinder1 = new Cylinder1();System.out.println(cylinder1.toString();System.out.println(圆柱体的体积为: + cylinder1.findVolume(); 下一页上一页返回开始继承性和多态性54.1.2 super关键字关键字1. 数据成员的隐藏n数据成员的隐藏是指在子类中重新定义一个与父类中已定义的数据成员名完全相同的数据成员,即子类拥有了两个相同名字的数据成员,一个是继承父类的,另一个是自己定义的。n当子类引用这个通明的数据成员时,默认操作时他自

5、己定义的数据成员,父类那里继承来的数据成员被隐藏隐藏。n当子类要操作继承自父类的同名数据成员时,可使用关键字super引导。 下一页上一页返回开始继承性和多态性6super关键字关键字2. 成员方法的覆盖n子类可以重新定义与父类格式完全相同(包括方法名、方法形参的个数和类型、方法返回值的类型)的成员方法,实现对父类方法的覆盖。n只有当实例方法能被访问时,才能进行方法覆盖。私有方法私有方法不能被覆盖.n静静态方法方法(类方法)能被继承,但不能被覆盖。 n子类在重新定义父类已有的方法时,应保持与父类完全相同相同的方法名、返回的方法名、返回值类型和参数列表型和参数列表,否则就不是方法的覆盖,而是子类

6、定义自己特有的方法,与父类的方法无关。 下一页上一页返回开始继承性和多态性7super关键字关键字3. super关键字super表示的是当前对象的直接父类对象,是当前对象的直接父类对象的引用。 super的使用方法有三种:(1) 访问直接父类隐藏的数据成员,其使用形式如下:super.数据成员(2) 调用直接父类中被覆盖的成员方法,其使用形式如下:super.成员方法(参数)(3) 调用直接父类的构造方法,其使用形式如下:super(参数) 下一页上一页返回开始继承性和多态性8super关键字关键字示例:参看例4.2public class Cylinder2 extends Circle

7、private double length; public Cylinder2() super(); length = 1.0; public Cylinder2(double radius, double length) super(radius); / 调用父类的构造方法 this.length = length; public double getLength() return length; public void setLength(double length) this.length = length; public double findArea() / 覆盖父类的方法,求圆柱体

8、的表面积 return 2 * super.findArea() + 2 * getRadius() * Math.PI * length; public double findVolume() return super.findArea() * length; / 此处的super不能省略 public String toString() / 覆盖Object类的toString()方法 return 圆柱体的高度为: + length + 半径为: + getRadius(); / TestCylinder2.javapublic class TestCylinder2public sta

9、tic void main(Stringargs)Cylinder2 cylinder2 = new Cylinder2(2,4); System.out.println(cylinder2.toString();System.out.println(圆柱体的表面积为: + cylinder2.findArea();System.out.println(圆柱体的体积为: + cylinder2.findVolume(); 下一页上一页返回开始继承性和多态性94.1.3 protected和和final关键字关键字1. protected关键字用protected修饰的成员变量可以被三种类所引:

10、n该类自身n与它在同一个包中的其它类及在n其它包中的该类的子类2. final关键字n使用final关键字可以定义常量。 n定义类时,在class关键字前加关键字final,表示此类是最终类,不能被其它类继承,不能做父类。n用final修饰成员方法,表示此方法不能被它的子类覆盖。3. native关键字(略)native修饰的方法称为本地方法,此方法使用的目的是为了将其它语言(例如,C、C+、FORTRAN、汇编等)嵌入到Java语言中。这样可以充分利用已经存在的其它语言的程序功能模块,避免重复编程。下一页上一页返回开始继承性和多态性104.2 多态性多态性n多态是面向对象程序设计语言的一个重

11、要特性,在Java中,可以在同一类或不同类中定义名称相同但是操作不同的多个方法,多态性指的是运行时判断应该执行哪个方法代码的能力,这种能力也叫动态绑定。 n在Java语言中,多态性分为编译时多多态性性和运行运行时多多态性性。n编译时的多的多态性性是通过方法重载实现的,Java虚拟机根据传递给方法的参数个数和类型决定调用哪个重载方法。n运行运行时的多的多态性性是Java多态性的最重要的体现,在Java语言的继承关系中,子类对象与父类对象之间有一个重要特性:在任何需要父类对象的地方,都可以使用子类对象来代替,即子类对象可以作为父类对象来使用。一个对象可以通过引用子类的实例来调用子类的方法,通常,方

12、法在父类中定义,在子类中覆盖,子类中调用哪个方法是在运行时决定的,取决于对象的类型,称为运行时的多态性。 【JAVA最重要的特性】下一页上一页返回开始继承性和多态性11多态性多态性/ ManagerTest.java 多态性应用举例import java.util.*;public class ManagerTest public static void main(String args) Manager boss = new Manager(王明, 8000); / 创建一个经理并设置他的奖金 boss.setBonus(500); Employee staff = new Employee

13、3; / 建立员工数组和经理一起填充 staff0 = boss; / 子类对象赋给父类对象 staff1 = new Employee(张鹏, 5000); staff2 = new Employee(李丽, 6000); for (int i = 0; i staff.length; i+) / 打印所有员工信息 Employee e = staffi; System.out.println(name= + e.getName() + ,salary= + e.getSalary(); class Employee public Employee(String n, double s) n

14、ame = n; salary = s; public String getName() return name; public double getSalary() return salary; private String name; private double salary;class Manager extends Employee public Manager(String n, double s) super(n, s); bonus = 0; public double getSalary() double baseSalary = super.getSalary(); ret

15、urn baseSalary + bonus; public void setBonus(double b) bonus = b; private double bonus;下一页上一页返回开始继承性和多态性124.3 抽象类和接口抽象类和接口 抽象类体现数据抽象的思想,是实现程序多态性的一种手段。接口则是Java中实现多重继承的唯一途径。4.3.1 抽象抽象类n抽象类的作用在于将许多有关的类组织在一起,提供一个公共的类,即抽象类,而那些被它组织在一起的具体的类做为它的子类由它派生出来。 n定义一个抽象类的格式如下:abstract class abstractClass /* 类定义体 */

16、 n抽象方法是指在返回值类型前加上abstract关键字,且没有方法体。格式如下:abstract();n示例:参看例4.4下一页上一页返回开始继承性和多态性13抽象类/ GeometricObject.java 抽象类几何图形类的定义abstract class GeometricObject public abstract double findArea(); / 抽象方法 public abstract double findPerimeter(); / 抽象方法/ Circle.java 定义抽象类的派生类Circle类class Circle extends GeometricObj

17、ect private double radius=1.0; public double findArea() / 具体类实现父类的所有抽象方法 return radius * radius * Math.PI; public double findPerimeter() / 具体类实现父类的所有抽象方法 return 2 * radius * Math.PI; / Rectangle.java 定义抽象类的派生类Rectangle类class Rectangle extends GeometricObject private double width=4.0; private double

18、height = 2.0; public double findArea() / 具体类实现父类的所有抽象方法 return width * height; public double findPerimeter() / 具体类实现父类的所有抽象方法 return 2 * (width + height); / TestAbstractClass.java 测试类public class TestAbstractClass public static void main(String args) GeometricObject go; / 子类对象可以赋给父类对象的引用 go = new Ci

19、rcle(); System.out.println(圆的面积为:+go.findArea(); System.out.println(圆的周长为:+go.findPerimeter(); / 子类对象可以赋给父类对象的引用 go = new Rectangle(); System.out.println(长方形的面积为:+go.findArea(); System.out.println(长方形的周长为:+go.findPerimeter(); 下一页上一页返回开始继承性和多态性14抽象类抽象类对于抽象于抽象类与抽象方法的限制与抽象方法的限制(1) 用abstract 修饰符修饰的类被称为抽

20、象类。用abstract 修饰符修饰的成员方法被称为抽象方法; (2) 抽象类中可以有零个或多个抽象方法,也可以包含非抽象的方法;(3) 抽象类中可以没有抽象方法,但是,有抽象方法的类必须是抽象类;(4) 对于抽象方法来说,在抽象类中只指定其方法名及其类型,而不书写其实现代码;(5) 抽象类可以派生子类,在抽象类派生的子类中必须实现抽象类中定义的所有抽象方法;(6) 抽象类不能使用new运算符创建对象,但仍可在抽象类中定义构造方法,可由派生类的构造方法调用;(7) abstract和final不能同时修饰一个类;(8) abstract 不能与private、static、final或nati

21、ve同时修饰一个方法;(9) abstract 类中不能有private的数据成员或成员方法; (10) 父类是非抽象类(即具体类),则其子类仍可是抽象类;(11) 虽然不能创建抽象类的对象,但抽象类可以当作数据类型使用,如作为方法形参类型、返回值类型、数组元素类型等等。下一页上一页返回开始继承性和多态性154.3.2接口接口与C+不同,Java不支持多重继承,而是用接口实现比多重继承更强的功能。接口就是方法定接口就是方法定义和常量和常量值的集合。的集合。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有方法的实现。 接口则把方法的定义和类的层次区分开来,通过它可以

22、在运行时动态地定位所调用的方法。同时,接口可以实现“多重继承”,且一个类可实现多个接口,正是这些机制使得接口提供了比多重继承更简单,更灵活,而且更强健的功能。下一页上一页返回开始继承性和多态性16接口接口1声明接口声明接口 修饰符 interface 接口名extends 父接口名列表 常量数据成员声明 抽象方法声明 (1) interface:声明接口的关键字,可将接口看成一个特殊类;(2) 接口名要符合Java标识符命名规则;(3) 修饰符有两种:public 和默认。public修饰的接口是公共接口,可以被所有的类和接口使用; 默认修饰符的接口只能被同一个包中的其它类和接口使用;(4)

23、父接口列表:接口也具有继承性。它将继承父接口的所有属性和方法。 与类的继承不同一个接口可以有一个以上的父接口,它们之间用逗号分隔;(5) 常量数据成员声明:常量数据成员前可以有也可省略修饰符。修饰符是public static 和 final;接口中的数据成员都是用 final修饰的常量,写法如下:n修饰符 数据成员类型 数据成员名=常量值n或 数据成员名 = 常量值n例: public final static double PI=3.14159; / 等价于double PI=3.14159; int SUM=100; / 等价于final static int SUM=100; (6)

24、接口中没有自身的构造方法,所有成员方法都是抽象方法;在接口中只能给出这些 抽象方法的方法名、返回值和参数列表,而不能定义方法体,即仅仅规定了一组 信息交换、传输和处理的“接口”。格式如下: 返回值类型 方法名(参数列表);下一页上一页返回开始继承性和多态性17接口接口2.接口的实现n接口定义仅仅是实现某一特定功能的一组功能的对外接口和规范,而不能真正地实现这个功能,这个功能的真正实现是在“继承”这个接口的各个类中完成的,要由这些类来具体定义接口中各抽象方法的方法体。 n一个类只能只能继承一个父承一个父类,但是可可实现多个接口多个接口。类定义的完整格式如下: class extends impl

25、ements, / 类定义体n示例:参看例4.5下一页上一页返回开始继承性和多态性18接口接口关于接口的关于接口的实现(1)在类中,用implements关键字就可以调用接口。一个类可以调用多个接口,这时,在implements后用逗号隔开多个接口的名字;(2)如果实现某接口的类不是抽象类,则在类的定义体部分必须实现指定接口的所有抽象方法,即为所有抽象方法定义方法体,而且方法头部分应该与接口中的定义完全一致,即有完全相同的返回值和参数列表;(3)如果实现某接口的类是抽象类,则它可以不实现该接口所有的方法;(4)接口的抽象方法的访问限制符都己指定为public,所以类在实现方法时,必须显式地使用

26、public修饰符,否则编译系统警告为缩小了接口中定义的方法的访问控制范围。 下一页上一页返回开始继承性和多态性19接口接口3.接口和抽象类的区别Java中所有的类有共同的父类java.lang.Object,但接口没有共同的根。接口可以当作抽象类使用。它们的区别如下:n接口中的每个方法,没有实现部分,都是抽象方法;抽象类中可以有具体的方法。n接口中的数据必须是常量;抽象类可以有各种类型的数据。n由于定义在接口中的所有方法都是抽象方法,接口中可以省略abstract修饰符;但是抽象类中的抽象方法必须用abstract修饰。下一页上一页返回开始继承性和多态性20接口接口4. 类型转换和insta

27、nceof运算符n基本数据类型可以进行强制或自动类型转换,也可以把一个类的对象转换为继承链中的另一个对象。n将子类的实例转换为父类的实例总是可行的,因为子类的实例也是父类的实例。例如例4.5中的语句Shapes0 = point; / 等价于Shapes0 = (Shape)point;n把父类对象转换为子类对象时,必须使用强制类型转换,为使转换成功,必须确保转换的对象是子类的一个实例。n进行转换时确保该对象是另一个类的实例,可以利用instanceof运算符来完成。如:Point point1 = new Point(); / Point是Circle的父类if(point1 instanc

28、eof Circle) Circle circle1 = (Circle)point1;下一页上一页返回开始继承性和多态性21接口接口父父类对象与和子象与和子类对象的象的转化需要注意如下的原化需要注意如下的原则:(1)子类对象可以被视为是其父类的一个对象;(2)父类对象不能当成是其某一个子类的对象;(3)如果一个方法的形式参数定义的是父类对象,那么调用这个方法时,可以使用子类对象作为形式参数;(4)如果父类对象引用指向的实际是一个子类对象,那么这个父类对象的引用可以用强制类型转换转化成子类对象的引用。 在转换之前要使用instanceof运算符进行判断。下一页上一页返回开始继承性和多态性225

29、Cloneable接口接口n接口包含常量和抽象方法,但是Cloneable接口例外,Cloneable接口定义如下:public interface CloneablenCloneable接口的定义体为空,体为空的接口称为标记接口接口。Java系统要求,可复制的类需要实现Cloneable接口,利用定义在Object类中的clone()方法,可以克隆可复制类的对象。 n示例:参看例4.6与4.7/ TestCloneable1.java 复制对象import java.util.*;public class TestCloneable1 public static void main(Stri

30、ng args) Calendar calendar = new GregorianCalendar(2003, 2, 1); Calendar calendarCopy = (Calendar)calendar.clone();calendar.clone(); System.out.println(calendar=calendarCopy is +(calendar=calendarCopy); System.out.println(calendar.equals(calendarCopy) is+calendar.equals(calendarCopy); 下一页上一页返回开始继承性和

31、多态性234.4 初始化块初始化块初始化块用来和构造方法一起初始化对象。初始化块是封装在一对大括号内的语句块,初始化块在类的定义体内,但不能包含在方法体内或构造方法体内。初始化块分为对象(象(实例)初始化例)初始化块和静静态(类)初始化)初始化块。 静态数据成员、初始化块和构造方法的执行顺序如下:(1)当第一次使用类时,首先装载类,初始化静态数据成员,然后执行类的静态初始化块。(2)当使用new运算符创建类的对象时,按下述三个步骤执行: 调用父类的构造方法(调用时,也按照这三个步骤) 初始化实例数据域,执行对象初始化块。 执行构造方法。下一页上一页返回开始继承性和多态性24初始化块初始化块cl

32、ass Apublic A()System.out.println( 父类的构造函数); System.out.println( 父类的动态初始化块); staticstatic System.out.println( System.out.println( 父类的静态初始化块父类的静态初始化块);); public class TestInitializationpublic static void main(String args) new TestInitialization(); public TestInitialization() System.out.println(第一次生成类

33、B的对象时输出:); new B(); System.out.println(第二次生成类B的对象时输出:); new B(); System.out.println(TestInitialization的对象初始化块1); static static System.out.println(TestInitializationSystem.out.println(TestInitialization的静态初始化块的静态初始化块);); System.out.println(TestInitialization的对象初始化块2); class B extends A public B() System.out.println( 子类的构造函数); System.out.println( 子类的动态初始化块); staticstatic System.out.println( System.out.println( 子类的静态初始化块子类的静态初始化块););下一页上一页返回开始继承性和多态性25作业作业设计一个长方形类,在通过继承长方形设计一个正方形类。(具体参见习题4-6)要求:能够设定及返回边长,计算周长,面积

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

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