一个有意思的程序(疯狂java:突破程序员基本功的16课)

本文通过一个Java示例程序详细解释了继承与多态的概念。程序演示了如何在子类构造器中调用父类构造器,并展示了在构造器中使用this关键字时的特殊行为,以及多态如何影响方法调用。
class Base{
  private int i = 2;
  public Base(){
    this.display();
  }
  public void display(){
    System.out.println(i);
  }
}
class Derived extends Base{
  private int i = 22;
  public Derived(){
    i = 222;
  }
  public void display()
  {
    System.out.println(i);
  }
}
public class test{
  public static void main(String[]args){
    new Derived();
  }
}

上面的程序输出为:0;

原因:new Derived()时,系统为其分配内存,Derived()拥有两个i的值,其中一个是父类Base的。

    在Java中,如果一个this出现在构造器中时,这个this表示正在初始化的java对象。从上面的源代码看,this是在Base的构造器类的,可是这些代码实际是放在Derived()构造器内的---是Derived()构造器隐式的调用Base()构造器。所以this应该是Derived的对象。

    虽然这个this是Derived对象,但当在Base()构造器里时,实际的编译类型时Base,指向一个Derived对象。所以由于多态的原因,this调用了Derived的方法,但又由于Drived的i还没初始化,所以输出的是0。如果稍微修改上面的Base对象,如下:

class Base{
  private int i = 2;
  public Base(){
    System.out.print(this.i); //调用的是Base的i,已经初始化为2.
    this.display();
  }
  public void display(){
    System.out.println(i);
  }
}
那么输出的结果将会是:20

    在这个例子,实现了父类访问子类的实例变量。也从另外一方面说明了,动态绑定的只有普通成员方法。

转载于:https://my.oschina.net/StevensBlog/blog/95637

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值