日期:2014-05-20  浏览次数:20697 次

JAVA中关于构造函数重载问题!
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。注意这两个代码的差别,第一个中父类没有缺省的构造方法,第二个中父类的缺省构造方法是必须的,否则无法通过编译,因为如果子类中没有显式的调用的话,编译器需要自动加一个默认的调用。