关于子类创建对象调用父类方法时this的问题(以及方法重写)


如下实例提出问题:

class T{
    T(){
        System.out.println("T()");
    }
   void foo(){this.bar();}
   void bar(){
       System.out.println("T.bar");
   }
}
class B extends T{
    B(){
        System.out.println("B()");
    }
   void foo(){
       super.foo();
   }
   void bar(){
       System.out.println("B.bar");
   }
}
public  class test {


    public static void main(String[] args) {
        B b=new B();
        b.foo();
    }
}

结果输出如下:


其实我相信这样的结果可能大家都是惊讶的,b.foo()实际是调用了父类中的foo()方法,方法主体为this.bar

由结果可以得到this实际指的是子对象。

分析:

由输出结果可见,当创建子类对象时首先调用了父类的构造方法,再调用子类的构造方法,值得注意的是传给父类构造方法的this指针和传给子类构造方法的this指针完全相同,也就是说调用父类构造方法的并不是父类的对象,所以在创建子类对象时并没有创建父类对象。this指向的仍然是子对象,同时由于子类重写了父类的bar()方法,所以输出为B.barr

在原代码上做轻微改动如下:

class T{
    T(){
        System.out.println("T()");
    }
   void foo(){this.bar();}
   void bar(){
       System.out.println("T.bar");
   }
}
class B extends T{
    B(){
        System.out.println("B()");
    }
   void foo(){
       super.foo();
   }
 /*void bar(){
       System.out.println("B.bar");
   }*/
}
public  class test {
    public static void main(String[] args) {
        B b=new B();
        b.foo();
    }

}

输出结果如下:


由于此时子类并未重写父类方法,故输出为T.bar

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值