今天看effective java 第14条,其中父类调用了子类的方法,以前学过C++。针对这个例子一直理解不了,希望高手解释下
public class SuperTest {
public static void main(String[] args) {
Child c = new Child();
c.addAll();
}
}class Parent{
public void add(){
System.out.println("A add...");
}

public void addAll(){
System.out.println("A add ALL...");
this.add();
}
}class Child extends Parent{ @Override
public void add() {
// TODO Auto-generated method stub
System.out.println("B add...");
super.add();
} @Override
public void addAll() {
// TODO Auto-generated method stub
System.out.println("B add ALL...");
super.addAll();
}

}最后输出的结果是
B add ALL...
A add ALL...
B add...
A add...
按我的理解,super.addAll()方法调用来Parent中的addAll(),而Parent中的addAll()调用了add()。这里的add最后调用的是Child的add(),既然是super.addAll(),为何最后竟然调用的是子类的add()方法 当真迷糊了,忘高手解答下。。 谢谢java  父类 子类 覆盖 方法

解决方案 »

  1.   

    this.add();
    其中的this是指当前对象,也就是Child c = new Child();中的c.
    这样应该明白了吧!
      

  2.   

    this,用来表示一个对象。而只有Child被实例化了,所以this就是Child。
    另:
    当java实例化Child的时候,会寻找Parent的class文件,和Child合并之后一并加载到虚拟机中。
    这时,会保留父子类的关系,但是虚拟机认为这个合并的class文件就是一个完整的Child。
      

  3.   

    我的理解是:c.addAll()-->System.out.println("B add ALL..."); super.addAll();-->
            System.out.println("A add ALL...");        this.add();此时的this引用的是实例化的c,因此this.add() 等同于c.add() --> System.out.println("B add...");super.add();--> System.out.println("A add...");
         依次输出到控制台
            
      

  4.   

    super.addAll() 方法里面的 this.add() 是调用当前对象的 add() 方法,当前对象是 child 。父类调用了子类的方法有时候真的会晕头转向的,特别是基类和子类的构造方法不是默认改造方法的时候。
    记忆楼主去博客专栏看下父类调用了子类的方法的讲解吧。
      

  5.   


    public void addAll() {
            // TODO Auto-generated method stub
            System.out.println("B add ALL...");
            super.addAll();
    }
    相当于
    public void addAll() {
            // TODO Auto-generated method stub
            System.out.println("B add ALL...");
            System.out.println("A add ALL...");        
            this.add();
    }this指的是当前子类对象,没有变
      

  6.   

    this 是谁? 谁调用当前方法,this就是它
    Child c = new Child();
    c.addAll();1、new了一个child
    2、调用child中的addAll()
    3、syso "B add ALL..."
    4、跳到父类addAll()
    5、syso "A add ALL..."
    6、跳到子类add()              //因为子类调用了父类,所以this代表子类
    7、syso "B add..."
    8、跳到父类add()
    9、syso "A add..."
    End
      

  7.   

    this代表当前的对象,super代表父类的
      

  8.   

    java中 this代表当前的对象,super代表父类的
      

  9.   

    学过C++没学过virtual关键字?道理一样
      

  10.   


    public class SuperTest {
        public static void main(String[] args) {
            Child c = new Child();
            c.addAll();
        }
    }
     
    class Parent{
        public void add(){
            System.out.println("A add...");
        }
         
        public void addAll(){
            System.out.println("A add ALL...");
            //加上下面这句话 你的世界就变的清晰了  肯定就明白了
            System.out.println(this.getClass().getName()); // 打印出来Child 你难道还会不明白么?
            this.add();
        }
    }
     
    class Child extends Parent{
     
        @Override
        public void add() {
            // TODO Auto-generated method stub
            System.out.println("B add...");
            super.add();
        }
     
        @Override
        public void addAll() {
            // TODO Auto-generated method stub
            System.out.println("B add ALL...");
            super.addAll();
        }
         
    }
      

  11.   


    那如果我就像让super.addAll()方法调用自己的add方法呢?按这么分析,那父类中addAll方法的add方法就不是this.add而是super.add了 但是父类没有super.add() 请问有别的途径吗?
      

  12.   


    那如果我就像让super.addAll()方法调用自己的add方法呢?按这么分析,那父类中addAll方法的add方法就不是this.add而是super.add了 但是父类没有super.add() 请问有别的途径吗?你好像是被绕进去了,  你子类重写了父类的方法,创建子类的对象,能调用子类自己的方法和父类中非私有的方法,而现在你想要在父类中调用父类的方法,只能创建父类的对象去调用