一道java题所揭示的原理

来源:互联网 发布:广数系统g76螺纹编程 编辑:程序博客网 时间:2024/06/03 18:34

看到一道java题,感觉很不错,我在原来的版本上增加了些代码,一起来看看下面的代码将输出什么

输出结果:

i=0;

j=22;

ci=22;

分析一下:这是一个继承结构,child继承了Father的 j 和 print ()。

抓住两个重点

1,在类被编译时作了些什么呢

    Father          Child
    -------           --------
┌──> i <──── @ i   
│    -------          --------    
│──> j <──── @ j        <─┐
│    -------          --------   │     
│    add()          add()     ──┤  
│    -------          -------    │  
└──print() <─ @ print()     │ 
      -------          -------   │ 
                    ┌── _print() │
                    │    --------  │ 
                    └──> i    <──┘

@var表示一个引用。

全局变量和局部变量的地址都已经确定好了。

2,对象被new时做了些什么

我们都知道,面向对象语言的多态,是由程序运行时去指定方法的入口地址实现的。

还原一下构造方法,

当new Child()时,Child将调用super()执行Father()的构造器,Father中this指向的是Child中的引用。那么在Father构造器中

调用了Object构造器后,将执行Child.add(1);

 

到此可以轻松的解决这个问题了,

在Child被创建时调用了2次Child.add()方法。Child中的i,@j内容被改变。Father中的add()从始至终没有被执行过。

c.print()调用Father中的print()打印Father中的i,j