先看下面的程序:class Person {
    public Person () { func(); }
    public void func() { System.out.println("1, "); }
    
}public class Person_A extends Person {

public Person_A(){super();}
public Person_A(int a){System.out.println(a);}

public void func(){System.out.println("2,");}
public static void main(String[] args) {

                Person_A pa = new Person_A();
Person_A pb = new Person_A(3); }}
运行结果:2,
2,
3请问为什么会是这样的结果???我的理解是:先调用父类的缺省构造方法,但是父类的构造方法中有个func()方法,这个方法到底调用父类的,还是调用子类的???根据结果来看,是调用子类中的func(),但是不知道为什么会是这样?

解决方案 »

  1.   

    //多态,父类的引用,子类的对象
    Person   p1 = new Person_A();
    Person   p2 = new Person();
    p1.func();
    p2.func();
      

  2.   

    Person_A   pa   =   new   Person_A();
    调用Person_A构造,创建子类的对象无论有参无参都会调父类的无参构造,执行func() 方法,这时this还在子类Person_A 中,又因为func()把父类的func()方法覆盖了所以这时候调用的是子类中的func()执行为2
    Person_A   pb   =   new   Person_A(3); 
    调用Person_A(3)调用子类中 public   Person_A(int a)
    上面说了创建子类的对象无论有参无参都会调父类的无参构造,所以打2,之后调Person_A(int a)打出3
    记得直接打出对象的时候就会打用  
    包@Object.父类.子类...........
      

  3.   

    因为子类中的fun()覆盖了父类的fun(),所以是调用子类中的func(),但是输出两个“2,”没有想通。
      

  4.   

    执行:Person_A   pa   =   new   Person_A(); 
    首先会调用超类的默认构造函数,结果是打印了 2执行:Person_A   pb   =   new   Person_A(3); 
    首先会调用超类的默认构造函数,结果是打印了第二个 2
    然后会调用 Person_A.func(2),结果是打印出 3所以,结果是:
    2
    2
    3
      

  5.   

    构造方法
    创建事例时首先去父类中找符合条件的构造方法,有符合的就执行
    然后继续在子类里找符合条件的构造方法,有符合的就执行Person_A pa=new Person_A(); 
    那么先找父类的构造方法,这是一个无参的构造方法,父类里有,那么执行
    func()
    而子类又覆盖了这个方法,那么执行子类的func(),输出2然后在子类里找构造方法,也有,那么也执行
    super()
    执行的是父类的构造方法,那么再输出一个2Person_A pb=new Person_A(3);
    父类里没有int参数的构造方法
    那么找子类,有,执行
    输出3
      

  6.   

    错了,“然后会调用   Person_A.func(2),结果是打印出   3 ” 应该改成 "然后会调用   Person_A.func(3),结果是打印出   3 "
    一时手快,写错了
      

  7.   

    如果没有super() 也会打印2 构造子类的时候也顺带构造了父类
      

  8.   

    子类中的fun()覆盖了父类的fun(),所以是调用子类中的func()~我也不知道怎么会打印两个2
      

  9.   

    谢谢大家的帮助现在我知道了,2楼的说的是正确,4楼也是对的,不过和2楼写差不多后来我写了程序验证了一下,是这样的:首先创建一个Person_A 对象,用pa指向这个对象 ,调用这个对象的构造方法,Java发现这个子类有个父类程序传向父类,调用父类的构造方法,构造方法中有个fun(),由于此时程序在子类对象中,所以此时的fun()方法(应该是this.fun()  this是当前子类对象)被当前子类对象调用,又由于fun()方法在子类中被重写(或者叫覆盖)所以this.fun()调用的是子类中的方法。打印输出2
    然后又创建一个Person_A 对象,不过此时的构造方法是含有参数3的,还是调用父类的无参数构造方法,打印输出2又由于System.out.println(a)故打印输出3
      

  10.   

    thinking in java第3版第7章,“构造器内部的多态方法的行为"这一节说得很清楚。
      

  11.   

    哈哈 刚看到java编程思想多态那章 也发现这个问题了  不过书上讲的没看明白  正想问别人呢 没想到在这里找到答案了 谢谢啦!!