黄阶低级 - 《 Java 核心》- 5.1 类、超类和子类(三) - 修改 1 次

来源:互联网 发布:vb点击按钮弹出输入框 编辑:程序博客网 时间:2024/04/30 17:52

1、继承层次

在继承层析中,从某个特定类到其祖先的路径成为该类的继承链

由于 Java 的单继承机制,我猜想一个类的继承链是唯一的,但这一点我还没有找到明确地答案,有大神可以告诉我。

2、多态

有一个用来判断是否应该设计为继承关系的简单原则,就是 is-a 原则

例如,每个经理都是雇员,将 Manager 类设计为 Employee 类的子类的显而易见的 。

Java实现多态有三个必要条件:

  1. 继承、重写、向上转型。
  2. 继承:在多态中必须存在有继承关系的子类和父类。
  3. 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。

3、动态绑定

了解调用对象方法的执行过程十分重要,下面是执行过程:

第一步:假设调用 x.f(param) ,且隐式参数 x 声明为 C 类的对象。编译器将会一一列举所有 C 类中名为 f 的方法和其超类中名为 f 的且访问属性为 public 的方法

第二步:编译器将进行参数类型匹配,这个过程就要重载解析,若有完全匹配的就选这个方法,没有的话匹配允许类型转换的方法,比如 int 可以转换成 double ,如果这样还是不能找到匹配项,编译器就会报错;同时如果找到多于一个匹配项,编译器也会报错。

静态绑定和动态绑定的区别:
如果是 private,static,final 方法或者构造器,那么编译器可以明确地知道该调用哪个方法,这种调用方式成为静态绑定;与此对应的是,调用依赖于隐式参数的实际类型,并且在运行中实现动态绑定。

深入:每次调用方法都要进行搜索,时间开销相当大,因此,虚拟机预先为每个类创建了一个方法表,里面列出了所有方法的签名和实际调用的方法。

注意:在覆盖一个方法时,子类方法不能低于父类方法的可见性。

4、阻止继承: final 类和方法

不允许扩展的类称为 final 类, final 类中的所有方法自动地成为 final 方法,但不包括域,域不会自动成为 final

深入:如果一个方法没有被覆盖并且很短,编译器就能够进行内联

5、抽象类

为什么要花力气进行高层次的抽象呢?可以使用共性,提取交集,减少重复,明确 is-a 关系等,不然要为每一个对象建立一套完整的体系。

注意:抽象类和 final 类不同,其中的方法不会自动定义为抽象方法,与之相反,有抽象方法的类一定要声明为抽象类。

个人记忆:抽象类,Person类,抽象方法,具体数据和具体方法,父类可以比子类更抽象,提出一个概念让子类去实现。

没有完全把父类的抽象方法实现的子类还是抽象类;当然如果为了不把当前类作为实例类,也大可声明为抽象类,这样别人就不能实例化该类了。

6、受保护访问

为了给子类使用父类的属性和方法而不给其他包的类用,可以使用 protected

这种方法一个最好的实例就是 Object 类的 clone 方法,后续再介绍。

0 0
原创粉丝点击