- Java code
class Sup {public int i = 0;//public Sup(){} public Sup(String text) { i = 1; } }public class Sub extends Sup { public Sub(String text) { super(text); int i= 2; } public static void main(String args[]) { Sup sub = new Sub("Hello"); System.out.println(sub.i); } }
这段代码运行结果:1
- Java code
class Sup {public int i = 0;public Sup(){} public Sup(String text) { i = 1; } }public class Sub extends Sup { public Sub(String text) { //super(text); int i= 2; } public static void main(String args[]) { Sup sub = new Sub("Hello"); System.out.println(sub.i); } }
这段代码运行结果是:0
为什么,请给个详细的解释,这里总是容易混淆...
------解决方案--------------------
对于第一段代码:
Sup sub = new Sub("Hello");//调用Sub的构造方法
看构造方法:
public Sub(String text) {
super(text);//显示调用父类的构造方法,该方法中设置父类中的成员变量(确切的说是field)i为1
int i= 2; //定义临时变量,方法执行完后该变量消失
}
所以最后i是1。
对于第二段代码:
Sup sub = new Sub("Hello");//调用Sub的构造方法
public Sub(String text) {
//super(text);
int i= 2;//临时变量执行完方法就消失了
}
这里一个关键的问题是你没有显示的调用父类的构造方法,但是编译器会自动调用父类的缺省构造方法public Sup(){},因为i初始化是0
所以最后输出的是0。注意这两个代码的差别,第一个中父类没有缺省的构造方法,第二个中父类的缺省构造方法是必须的,否则无法通过编译,因为如果子类中没有显式的调用的话,编译器需要自动加一个默认的调用。