Java构造器与多态

先上代码:(Think in java page 163)

package com.rui.example.count;

/**
 * @author rui
 * 
 */
class Glyph {
    void draw() {
        System.out.println("Glyph.draw()");
}

public Glyph() {
    System.out.println("Glyph before draw()");
    draw();
    System.out.println("Glyph after draw()");
}

}

class RoundGlyph extends Glyph {
private int radius = 1;

public RoundGlyph(int r) {
    radius = r;
    System.out.println("RoundGlyph.RoundGlyph(),radius=" + radius);
}

void draw() {
    System.out.println("RoundGlyph.draw(), radius=" + radius);
}
}

public class PolyConstructors {

public static void main(String[] args) {
    new RoundGlyph(5);
}
}

看java编程思想感觉听难懂的,里面分析的都是非常细致的,可能平时根本不会注意的,现在看多态这里就是感觉很奇怪。

前文有述:构造器本身并不具有多态性,原因是构造器都是隐式static方法的,原因在Java中的static关键字
分析的很具体,类在构造的过程中,还没有任何对象创建的。但是上述代码中提到了在构造方法内部调用正在构建的对象的某个动态绑定方法(在Glyph的构造器中乱入了一个draw()方法),这时候生成的结果会很奇怪:

Glyph before draw()
RoundGlyph.draw(), radius=0
Glyph after draw()
RoundGlyph.RoundGlyph(),radius=5

大家尝试一下看看能不能解释清楚,反正我是解释不清楚的,那我就好记性不如烂博客了

它的本质是:程序初始化的过程中到底都干了什么

1.在其他任何事物发生之前,将分配给对象的存储空间初始化为二进制的0,也就是说,此时radius=0;

2.调用基类构造器,反复递归,找到根最先构造,然后向下造。这里调用draw()方法的时候,因为动态绑定的原因,绑定的是RoundGlyph方法中的draw()方法,而这个时候RoundGlyph()方法还没有构造,所以输出radius=0;

ps: 因为画类图的时候,基类在上面,子类(导出类)在下面,所以叫向上转型或向下转型,不知道有多少人跟我一样不知道上下是什么意思的!!!

3.按照声明的顺序调用成员的初始化方法

4.调用导出类的构造器主体(这个时候才构造)

吐槽

怎么会有人写这么奇怪的代码呢~~~,这篇只是将来如果真的用到这种奇怪的代码,这里有一个解释,能明白是为什么!

说明

这个都是查资料加个人理解的,本人小菜鸟,可能会有错误的地方,请各位不吝赐教!

动态绑定方法的解释

将一个方法同一个方法主体关联起来被称为绑定,又分为前期绑定(由编译器和连接程序实现,面向过程的语言不需要选择就默认的绑定方式,如c)和后期绑定,后期绑定是在运行时根据对象的类型进行绑定的,java中除了static方法和final方法(private方法默认为final方法的),其他所有的方法都是动态绑定的,这是java存在多态的基础。

你可能感兴趣的:(JAVA)