您的位置:首页 > 其它

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

2018-03-22 15:20 381 查看
如下实例提出问题:
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐