Java 类的初始化——多态

P96)总结一下对象的创建过程,假设有个名为Dog的类:

  1. 即使没有显式的使用static关键字,构造器实际上也是静态方法。因此,当首次创建类型为Dog的对象时(构造器可以看成静态方法),或者Dog类的静态方法/静态域首次被访问时,Java解释器必须查找类路径,以定位Dog.class文件。
  2. 然后载入Dog.class,有关静态初始化的所有动作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。
  3. 当用new Dog()创建对象的时候,首先将在堆上为Dog对象分配足够的存储空间。
  4. 这块存储空间会被清零,这就自动的将Dog对象中的所有基本类型数据都设置成了默认值(对数字来说就是0,对布尔型和字符型也相同),而引用则被设置成了null。
  5. 执行构造器:
    • 在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制。
    • 调用基类构造器。这个步骤会不断的反复递归下去,首先是构造这种层次结构的根,然后是下一层导出类,等等,直到最低层的导出类。
    • 按声明顺序调用成员的初始化方法。
    • 调用导出类构造器的主体。

编写构造器时有一条有效的准则:用尽可能简单的方法使对象进入正常的状态;如果可以的话,避免调用其他方法。在构造器内唯一能安全调用的那些方法是基类中的final方法(也适用于private方法,它们自动属于final方法),因为这些方法不会被覆盖。

P97)非静态实例初始化

类似于类中一段用打括号扩起来的代码快:

 1 public class Mugs{
 2      Mug mug1;
 3      Mug mug2;
 4      {
 5          mug1 = new Mug(1);
 6          mug2 = new Mug(2);
 7          System.out.println("mug1 & mug2 initialized");
 8      }
 9     //...
10  }

 

 看起来它与静态初始化子句一模一样,只不过少了static关键字。这种语法对于支持“匿名内部类”的初始化是必须的,它使得你可以保证无论调用了哪个显示构造器,某些操作都会发生,而且它们是在构造器之前执行的。 

P142)空白final

Java允许生成"空白final",所谓空白final是指被声明为final但又未给定初值的域。

必须在域的定义处或者每个构造器中用表达式对final进行赋值。

P150)方法调用绑定

将一个方法调用同一个方法主体关联起来叫绑定。若在程序执行前进行绑定(如果有的话,由编译器和连接程序实现),叫做前期绑定。例如,c语言中的方法调用就是前期绑定。

多态的实现就依赖于后期绑定,它的含义就是在运行时根据对象的类型进行绑定。后期绑定也叫做动态绑定或者运行时绑定。如果一种语言想实现后期绑定,就必须具有某种机制,以便在运行时能判断对象的类型,从而调用恰当的方法。

Java中除了static方法和final方法之外,其他所有方法都是后期绑定。

任何域访问操作都将由编译器解析,因此不是多态的。

posted @ 2017-06-20 22:17  TooLateToLearn!  阅读(370)  评论(0编辑  收藏  举报