class Super{
public int i=0;
public Super(String text){
i=1;
}
}
public class Sub extends Super{
public Sub(String text) {
i=2;
} public static void main(String [] args){
Sub sub = new Sub("Hello");
System.out.println(sub.i);
}
}
代码如上!
错误如下:
Sub.java:8: Super(java.lang.String) in Super cannot be applied to ()
        public Sub(String text) {
                                ^
1 error请问错在哪里?

解决方案 »

  1.   

    没有显示调用父类的构造函数,以下是经过修改的源代码,
    class Super {
      public int i = 0;
      public Super(String text) {
        i = 1;
      }
    }public class Sub extends Super {
      public Sub(String text) {
        super(text);  // Place that make a mistake.
        i = 2;
      }
      public static void main(String[] args) {
        Sub sub = new Sub("Hello");
        System.out.println(sub.i);
      }
    }    在原先注释的地方遗漏了对父类构造函数的调用。
        由于在JAVA的继承机制中,初始化一个子类型对象时,必须持有对父对象的引用,所以必须首先初始化一个父对象,这里如果在父类中没有显示的构造函数,那么编译器会自动生成一个默认构造函数,这样在子类型的构造函数中即使不显示调用父类的构造函数也是可以的(默认会添上),但如果在父类中拥有显示的构造函数,那么就必须在子类的构造函数中加以调用,否则编译器将报错。
        以上代码通过运行,运行环境为JCreator 3.0、JDK1.4.2、win2k server
    @.@||~
      

  2.   

    那请问楼上的,如果我把Sub类里i = 2;改成super.i为什么打印sub.i的时候是2呢??
      

  3.   

    super.i就是sub.i阿,sub子类中并没定义自己的i
      

  4.   

    TO gaibian(改变)
        正如fifadxj朋友说的,由于Super的i是一个public域,所以在这里Sub && Super是共享该对象的,但是如果我们在Sub class中同样拥有一个int i,那么我们必须显示地操纵父类的i,否则我们默认调用的变量i将是Sub自己的,显示调用的方法是super.i(注意,这里的super不是指Super class的super,而是Sub的父类,他可以是任何class以及任何名字,但在Sub调用父类的公共方法或者公共域,可以使用super.xxx)。
    @.@||~