今天看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 父类 子类 覆盖 方法
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 父类 子类 覆盖 方法
其中的this是指当前对象,也就是Child c = new Child();中的c.
这样应该明白了吧!
另:
当java实例化Child的时候,会寻找Parent的class文件,和Child合并之后一并加载到虚拟机中。
这时,会保留父子类的关系,但是虚拟机认为这个合并的class文件就是一个完整的Child。
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...");
依次输出到控制台
记忆楼主去博客专栏看下父类调用了子类的方法的讲解吧。
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指的是当前子类对象,没有变
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
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();
}
}
那如果我就像让super.addAll()方法调用自己的add方法呢?按这么分析,那父类中addAll方法的add方法就不是this.add而是super.add了 但是父类没有super.add() 请问有别的途径吗?
那如果我就像让super.addAll()方法调用自己的add方法呢?按这么分析,那父类中addAll方法的add方法就不是this.add而是super.add了 但是父类没有super.add() 请问有别的途径吗?你好像是被绕进去了, 你子类重写了父类的方法,创建子类的对象,能调用子类自己的方法和父类中非私有的方法,而现在你想要在父类中调用父类的方法,只能创建父类的对象去调用