继承性与多态性
2010 年 5 月 10 日
10:05
类具有继承性,子类对父类的继承关系体现了现实世界中特殊和一般的关系。和类的继承性相联系的对象的动态绑定使对象的方法具有多态性。抽象类和最终类是两种特殊的类。接口和抽象类非常类似, Java 只支持单继承,但接口使 Java 实际上实现了多继承。
继承性
继承是通过 extends 关键字实现的。在定义类时使用 extends 关键字指明新定义类的父类,新定义的类称为子类或派生类。子类可以继承父类 的所有非 private 的属性和方法。
super 关键字
- 数据成员的隐藏
子类中重新定义一个与父类中已定义的数据成员名完全相同的数据成员。引用时,默认是自己定义的数据成员,把父类的数据成员隐藏。要操作父类中的同名数据成员时,可使用 super 关键字引导。
- 成员方法 的覆盖
子类可以重新定义与父类格式完全相同的成员方法,实现对父类方法的覆盖。
静态方法(类方法)能被继承,但 不能被覆盖 。如果在派生类中重新定义了父类 中的静态方法,则在派生类中 隐藏 了父类的静态方法。
实现方法覆盖:一定与父类方法名、返回值类型和参数列表完全相同。
- super 关键字
super 表示的是当前对象的直接父类对象,是当前对象的直接父类对象的引用。
三种用法:
- 访问直接父类的隐藏的数据成员
Super. 数据成员
- 调用直接父类中被覆盖的成员方法
Super. 成员方法(参数)
- 调用直接父类的构造方法,其使用形式如下:
super (参数)
protected 和 final 关键字
protected 关键字
用 protected 修饰的成员变量可以被三种类所引用:该类自身、与它在同一个包中的其他类及在其他包中的该类的子类。使用 protected 修饰符的主要作用是允许其他包中的它的子类来访问父类 的特定属性。
final 关键字
使用 final 关键字定义常量,除此之外,还可以使用 final 关键字修饰类和成员方法。 定义类时,在 class 关键字前加 final 关键字,表示此类为最终类 ,不能被其它类所继承,不能做父类。也可以用 final 修饰成员方法,表示此方法不能被它的子类覆盖。
native 关键字
native 关键字修饰的方法称为本地方法,此方法使用的目的是为了 将其他语言嵌入到 Java 语言中。
java 修饰符总结
修饰符 |
类 |
方法 |
数据 |
解释 |
( default ) |
∨ |
∨ |
∨ |
类、成员方法和数据成员在所在的包中可见 |
Public |
∨ |
∨ |
∨ |
类、成员方法和数据成员在任何包的任何类中可见 |
private |
|
∨ |
∨ |
成员方法和数据成员只在本类中可见 |
protected |
|
∨ |
∨ |
成员方法和数据成员在所属包中可见,或在其他包中该类的子类中可见 |
Static |
|
∨ |
∨ |
定义类方法或类变量 |
Final |
∨ |
∨ |
∨ |
最终类不能被继承,最终方法不能在子类中修改,终极数据成员是常量 |
Abstract |
∨ |
∨ |
|
抽象类必须被继承,抽象方法必须在具体的子类中实现 |
Native |
|
∨ |
|
表明这种方法是用非 Java 的语言实现的 |
Synchronized |
|
∨ |
|
同一时间只有一个线程可以执行这个方法 |
多态性
多态是面向对象程序设计语言的一个重要特性,在 Java 中,可以在同一类或者不同类中定义名称相同但是操作不同的方法, 多态性指的是运行时判断应该执行哪个方法代码的能力,这种能力也叫动态绑定。 Java 中,多态性分为编译时多态性和运行时多态性。 编译时的多态性 是通过方法重载实现的, Java 虚拟机根据传递给方法的参数类型以及个数来判断到底决定调用哪个重载方法。
运行时的多态性是 Java 多态性的一个重要体现,在 Java 的继承关系中,子类对象与父类对象之间有一个重要特性 :在任何需要父类对象的地方,都可以使用子类对象来代替,即子类对象可以使用父类对象来使用。 一个对象可以通过引用子类的实例来调用子类的方法,通常,方法在父类中定义,在子类中覆盖,子类中调用哪个方法是在运行时决定的,取决于对象的类型,称为运行时的多态性。
抽象类和接口
抽象类
在 java 程序中抽象类用于实现自然界的的抽象概念。抽象类的 作用 在于将许多有关的类组织在一起,提供一个公共的类,即抽象的类,即抽象类,而那些被它组织在一起的具体的类作为它的子类由它派生出来。抽象类刻画了公有行为的特征,并通过继承机制传送给它的派生类。
在抽象类中定义的方法称为抽象方法,这些方法只有方法头的声明,用分号来代替方法体的定义,即只定义成员方法的接口形式,而没有具体操作,只有派生类对抽象类方法的重新定义才能真正实现派生类相关的操作。
各个子类继承了父类的抽象方法后,再分别用不同的语句和方法体来重新定义它,形成若干个名字、返回值、参数列表完全相同,目的也一致但是具体实现有一定差别的方法。
抽象类中定义抽象方法的目的是实现一个接口,多种方法的原理,即所有子类对外都呈现一个相同名字的方法。
对于抽象类与抽象方法的限制如下:
- 凡是用 abstract 修饰符修饰的类被称为抽象类,凡是用 abstract 修饰符修饰的成员方法被称为抽象方法;
- 抽象类中可以有零个或多个抽象方法,也可以包含非抽象的方法;
- 抽象类中可以没有抽象方法,但是有抽象方法 的类必须是抽象类;
- 对于抽象方法来说,在抽象类中只定义其方法名和类型,而不书写其实现代码;
- 抽象类可以派生子类、在抽象类派生的子类中必须实现抽象类中定义的所有的抽象方法;
- 抽象类不能使用 new 运算符创建对象,但是仍可在抽象类中定义构造方法,可由派生类的构造方法调用;
- abstract 和 final 不能同时修饰一个类;
- abstract 不能与 private 、 Static 、 final 或 native 同时修饰一个方法;
- abstract 类中不能有 private 的数据成员或者成员方法;
- 父类不是抽象类(即具体类),则其子类仍可是抽象类;
- 虽然不能创建抽象类的对象,但抽象类可以当作数据类型使用,如作为方法形参类型、返回值类型、数组元素类型等。