java 父类可以调用子类方法?

果冻_果冻 2013-09-09 09:37:32
今天看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()方法。。。

当真迷糊了,忘高手解答下。。 谢谢
...全文
2209 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
夜影迷香 2013-09-13
  • 打赏
  • 举报
回复
引用 17 楼 djsaiofjasdfsa 的回复:
[quote=引用 1 楼 csdt_csdt 的回复:] this.add(); 其中的this是指当前对象,也就是Child c = new Child();中的c. 这样应该明白了吧!
那如果我就像让super.addAll()方法调用自己的add方法呢?按这么分析,那父类中addAll方法的add方法就不是this.add而是super.add了。。。 但是父类没有super.add() 请问有别的途径吗?[/quote] 你好像是被绕进去了, 你子类重写了父类的方法,创建子类的对象,能调用子类自己的方法和父类中非私有的方法,而现在你想要在父类中调用父类的方法,只能创建父类的对象去调用
果冻_果冻 2013-09-12
  • 打赏
  • 举报
回复
引用 1 楼 csdt_csdt 的回复:
this.add(); 其中的this是指当前对象,也就是Child c = new Child();中的c. 这样应该明白了吧!
那如果我就像让super.addAll()方法调用自己的add方法呢?按这么分析,那父类中addAll方法的add方法就不是this.add而是super.add了。。。 但是父类没有super.add() 请问有别的途径吗?
lcf 2013-09-10
  • 打赏
  • 举报
回复
学过C++没学过virtual关键字?道理一样
lihao1129 2013-09-10
  • 打赏
  • 举报
回复
不能用this 要用super
lihao1129 2013-09-10
  • 打赏
  • 举报
回复
方法被覆盖了,,,
2013-09-10
  • 打赏
  • 举报
回复
只是一个引用,
异常异长 2013-09-10
  • 打赏
  • 举报
回复
java中 this代表当前的对象,super代表父类的
ysh512 2013-09-10
  • 打赏
  • 举报
回复
this代表当前的对象,super代表父类的
菜式歪理 2013-09-10
  • 打赏
  • 举报
回复
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
笑莫问 2013-09-10
  • 打赏
  • 举报
回复

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指的是当前子类对象,没有变
无聊找乐 2013-09-10
  • 打赏
  • 举报
回复
当然可以了。 参考 设计模式的模板方法
william_yao 2013-09-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();
    }
     
}
地下室森林 2013-09-09
  • 打赏
  • 举报
回复
super.addAll() 方法里面的 this.add() 是调用当前对象的 add() 方法,当前对象是 child 。 父类调用了子类的方法有时候真的会晕头转向的,特别是基类和子类的构造方法不是默认改造方法的时候。 记忆楼主去博客专栏看下父类调用了子类的方法的讲解吧。
st_victory 2013-09-09
  • 打赏
  • 举报
回复
我的理解是: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..."); 依次输出到控制台
txtdown0909 2013-09-09
  • 打赏
  • 举报
回复
this,用来表示一个对象。而只有Child被实例化了,所以this就是Child。 另: 当java实例化Child的时候,会寻找Parent的class文件,和Child合并之后一并加载到虚拟机中。 这时,会保留父子类的关系,但是虚拟机认为这个合并的class文件就是一个完整的Child。
  • 打赏
  • 举报
回复
add方法被覆写了
蟹道人 2013-09-09
  • 打赏
  • 举报
回复
this.add(); 其中的this是指当前对象,也就是Child c = new Child();中的c. 这样应该明白了吧!

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧