public class ff { public ff() {
// TODO Auto-generated constructor stub
} /**
 * @param args
 */
public static void main(String[] args) {
new clss();
new son();
}}
class son extends father{
 int x = 100; public son() {
super();
}
public void dothing()
{
System.out.println(x);
}
}
class father
{
public void dothing()
{

}
public father()
{
dothing();
}
}class clss
{
int x = 100;
public clss()
{
System.out.println(x);
}
}
大家觉得打印出来值是多少
100
0为什么第二个把值取不出来啊

解决方案 »

  1.   

    new son(); 这句首先是调用了new father();调用dothing()方法由于son这个类重写了这个方法,因此调用son类里面的这个dothing()既是:
    public void dothing()
    {
    System.out.println(x);
    }  //此时还没走到x的初始化语句因此x是默认值0。如果x是字符类型的话就是null了
      

  2.   

    super 只是一个特殊用法,它不是什么变量也不具有类型。所以它只能调用父类的protected方法,除此之外之外调用的是子类的方法。这是为java的安全性所设计的!
      

  3.   

    首先可以否定是super()方法的问题,我把super()方法删除,然后打印的值仍然为100,0.
    其次,先走父类的构造函数,再走子类的构造函数,只有走子类的构造函数之前,才会初始化子类的 int x = 100;语句.
    我一会上.net试下,看看也是不是这样的.
      

  4.   

    .net上经过测试,father类的dothing方法,不会去调用子类的dothing方法,而是执行父类的dothing空方法