12月 042015
 

5.1 类、超类和子类
Java中,所有继承都是公有继承,没有C++中的私有继承、保护继承。
子类不能直接访问超类的私有域,应该用super.getXXX()的方式来获取。
子类中可以增加域、方法或是覆盖超类的方法,但绝不能删除继承的任何域与方法。
如果子类的构造器没有显式地调用超类的构造器,则将自动地调用超类默认(没有参数)的构造器。如果超类没有不带参数的构造器,并在子类的构造器中又没有显式地调用超类的其他构造器,则Java编译器将报告错误。
关键字this有2个用途:引用隐式参数、调用该类其他的构造器。
关键字super有2个用途:调用超类的方法、调用超类的构造器。
一个对象变量可以引用多种实际类型的现象被称为多态(polymorphism),在运行时那个自动选择调用哪个方法的现象称为动态绑定(dynamic binding)。
5.1.1 继承层次
由一个公共超类派生出来的所有类的集合被称为继承层次(inheritance hierarchy)。
5.1.2 多态
在Java程序设计语言中,对象变量是多态的。一个Employee变量既可以引用一个Employee类对象,也可以引用一个Employee类的任何一个子类的对象(例如,Manager, Executive等等)。
在Java中,子类数组的引用可以转换成超类数组的引用,而不需要采用强制类型转换。
5.1.3 动态绑定
调用对象方法的执行过程:
1)编译器查看对象的声明类型和方法名。
2)接下来,编译器将查看调用方法时提供的参数类型。如果在所有名为f的方法中存在一个与提供的参数类型完全匹配,就选择这个方法。这个过程被称为重载解析(overloading resolution)。

  • 两个具有相同名字,不同签名的方法。如果在子类中定义了一个与超类签名相同的方法,那么子类中的这个方法就度盖了超类中的这个相同签名的方法。不过,返回类型不是签名的一部分,因此,在覆盖方法时,一定要保证返回类型的兼容性。在Java SE 5.0以前的版本中,要求返回类型必须是一样的。现在允许子类将及盖方法的返回类型定义为原返回类型的子类型。

3)如果是private方法、static方法、final方法或者构造器,那么编译器将可以准确地知道应该调用哪个方法,我们将这种调用方式称为静态绑定(static binding)。与此对应的是,调用的方法依赖于隐式参数的实际类型,并且在运行时实现动态绑定。在我们列举的示例中,编译器采用动态绑定的方式生成一条调用f (String)的指令。
4)当程序运行,并且采用动态绑定调用方法时,虚拟机一定调用与x所引用对象的实际类型最合适的那个类的方法。
动态绑定有一个非常重要的特性:无需对现存的代码进行修改,就可以对程序进行扩展。
警告:在度盖一个方法的时候,子类方法不能低于超类方法的可见性。特别是,如果超一类方法是public,子类方法一定要声明为public。经常会发生这类错误:在声明子类方法的时候,遗漏了public修饰符。此时,编译器将会把它解释为试图降低访问权限。
5.1.4阻止继承:final类和方法
有时候,可能希望阻止人们利用某个类定义子类。不允许扩展的类被称为final类。
类中的方法也可以被声明为final。如果这样做,子类就不能覆盖这个方法(final类中的所有方法自动地成为final方法)。
5.1.5强制类型转换
进行类型转换的惟一原因是:在暂时忽视对象的实际类型之后,使用对象的全部功能。
将一个值存入变量时,编译器将检查是否允许该操作。将一个子类的引用赋给一个超类变量,编译器是允许的。但将一个超类的引用赋给一个子类变量,必须进行类型转换,这样才能够通过运行时的检查。
应该养成这样一个良好的程序设计习惯:在进行类型转换之前,先查看一下是否能够成功地转换。这个过程简单地使用instanceo运算符就可以实现。
综上所述:
·只能在继承层次内进行类型转换。
·在将超类转换成子类之前,应该使用instanceof进行检查。
如果x为null,进行下列测试
x instanceof C
不会产生异常,只足返回false。之所以这样处理足因为null没有引用任何对象,当然也不会引用C类型的对象。
5.1.6抽象类
为了提高程序的清晰度,包含一个或多个抽象方法的类本身必须被声明为抽象的。除了抽象方法之外,抽象类还可以包含具体数据和具体方法。


 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)