class Father
{
int age = 20;
Father()
{
say();
System.out.println(age);
}
void say()
{
System.out.println(age);
}
}
class Child extends Father
{
int age = 40;
Child(){
say();}
void say()
{
System.out.println(age);
}
public static void main(String[] args)
{
new Child();
}
}

解决方案 »

  1.   

    http://topic.csdn.net/u/20091201/22/967ab473-6b88-42aa-8a7b-12a0ea576e85.html?25797
     
    一样的帖
      

  2.   

    调试一下就明白了,Farther的Say被重载了,所以Farther()里面调到了Child里面的Say(),这时age还没有初始化,所以是0,然后调Farther里面的print 20,然后初始化Child age = 40, print 40
      

  3.   

    答案是: 

    20 
    40 
    考的是父类和子类初始化顺序的问题。基类参数->基类构造器->子类参数->子类构造器(未考虑静态字段以及静态块,实际是一样的)。 
    Child子类构造函数中首先调用父类Father 的构造函数,遇见了say()方法,这个方法是缺省的方法故而可以看成类接口的一部分可以动态转型,从而调用Child的方法。然后这个时候Child的age没有初始化(基类还没有构造完全),故而打印0,后面当然打印自身的age为20,然后最后调用Child的打印age为40. 
    我在另外一个帖子已经回了
      

  4.   


    class Father 

    int age = 20; //4,初始化age
    Father() //3,初始化Child的基类

    say(); //5,调用Child的say()
    System.out.println(age); //7,输出20

    void say() 

    System.out.println(age); 


    class Child extends Father 

    int age = 40; //8,初始化Child中的age
    Child() //2,构造Child对象

    say();//9,调用Child的say()

    void say() 

    System.out.println(age); //6,第一次age=0,输出0//10,第二次age=40,输出40

    public static void main(String[] args) 

    new Child(); //1,主程序入口

    }
      

  5.   

    楼主看看这个
    http://blog.csdn.net/KingWolfOfSky/archive/2009/08/13/4444231.aspx
      

  6.   


    你看看《Thinking is Java》继承那一章的几个例子,可以帮助你理解。