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();。

解决方案 »

  1.   

    super.fun1();关键字就是显示调用父类的fun1()方法了,怎么不好理解呢?
      

  2.   

    super.fun1();
    LZ你着色的代码就是调用父类的方法啊。
      

  3.   

    程序输出结果是
    Parent
    Child-fun2我说的是this.fun2这个方法为什么会掉用子类child的fun2
      

  4.   

        public void fun1() {
            System.out.println("Parent");
            this.fun2();//关键就在这里,当super.fun1();执行时,会把一个Child对象传进去,this指向这个Child//对象,这就构成了父类引用指向子类对象了,所以出现了多态,自然就打印出来了Parent Child-fun2     }
      

  5.   

    首先你这个程序有两个公共类,这是一个错误。
    你在子类main方法里构建子类对象,然后调用test()方法,这里假如构造父类的对象的话,也调用不了子类的test()方法,只能由子类来调用,
    这也就说明了this其实指的是子类的对象。
      

  6.   

    这里this就是parent   自身的引用而你把child给传进去了    
    就是父类引用指向子类对象
    这里其实没什么道理好讲的    多看点例子  自然就好了    
    到写项目的时候    都是   有一个  总的父类的引用   用构造方法穿过来穿过去的   方便调用
      

  7.   

    创建对象后,this指向创建的对象
      

  8.   

    请问哪里把child给传进去了 ???
      

  9.   

    this.fun2()中的this
    this代表父类,而引用地址是指向子类的引用的四楼说会把一个Child对象传进去,请问怎么个原理,咋传进去的。
      

  10.   

    子类对象被实例化之前,父类会先被实例化。
    在你的例子中,只实例化了子类对象,此时父类对象是被协同加载的。
    如果你理解了Parent c = new Child();
    c.fun2();会调用子类中被重写的方法打印Child-fun2。后面的就不难理解了。
    c相当于引用new Child(),被默认先实例化父类的对象。
    此父类对象具有子类的特性!
    也就是说,如果父类中的一个方法被子类重写,你通过c调用该方法,并不是调用父类中的方法,而是子类中的。
    此时的this关键字指向的是被协同加载的父类的对象。
    他和 Parent c = new Child();中c所指向的对象相同!
      

  11.   

    代码改成    public void fun1() {
            System.out.println("Parent");
            fun2();
        }效果是一样的,也就是说和this没有关系的,我的理解是因为子类重写了父类的fun2(),
    并且方法是支持多态的,所以才调用了子类的fun2()