public class Parent {
public void fun1() {
System.out.println("Parent");
this.fun2();
}
public void fun2() {
System.out.println("Parent-fun2");
}
}public class Child extends Parent {
public void fun2() {
System.out.println("Child-fun2");
}
public void test() {
super.fun1();
}
public static void main(String[] args) {
Child c = new Child();
c.test();
}
}子类重写了父类的fun2方法,在子类中用super调用父类的fun1方法,在父类的fun1方法中调用了fun2方法,我的问题就是这个fun2方法的调用问题?实际调用的应该是子类重写的fun2方法,也就是说此时父类中this.fun2();的this指向的是子类,这应该是多态的原因,如果是Parent c = new Child()我能理解,可我在main中Child c = new Child();。
LZ你着色的代码就是调用父类的方法啊。
Parent
Child-fun2我说的是this.fun2这个方法为什么会掉用子类child的fun2
System.out.println("Parent");
this.fun2();//关键就在这里,当super.fun1();执行时,会把一个Child对象传进去,this指向这个Child//对象,这就构成了父类引用指向子类对象了,所以出现了多态,自然就打印出来了Parent Child-fun2 }
你在子类main方法里构建子类对象,然后调用test()方法,这里假如构造父类的对象的话,也调用不了子类的test()方法,只能由子类来调用,
这也就说明了this其实指的是子类的对象。
就是父类引用指向子类对象
这里其实没什么道理好讲的 多看点例子 自然就好了
到写项目的时候 都是 有一个 总的父类的引用 用构造方法穿过来穿过去的 方便调用
this代表父类,而引用地址是指向子类的引用的四楼说会把一个Child对象传进去,请问怎么个原理,咋传进去的。
在你的例子中,只实例化了子类对象,此时父类对象是被协同加载的。
如果你理解了Parent c = new Child();
c.fun2();会调用子类中被重写的方法打印Child-fun2。后面的就不难理解了。
c相当于引用new Child(),被默认先实例化父类的对象。
此父类对象具有子类的特性!
也就是说,如果父类中的一个方法被子类重写,你通过c调用该方法,并不是调用父类中的方法,而是子类中的。
此时的this关键字指向的是被协同加载的父类的对象。
他和 Parent c = new Child();中c所指向的对象相同!
System.out.println("Parent");
fun2();
}效果是一样的,也就是说和this没有关系的,我的理解是因为子类重写了父类的fun2(),
并且方法是支持多态的,所以才调用了子类的fun2()