当前位置: 代码迷 >> J2SE >> JAVA中关于构造函数重载有关问题
  详细解决方案

JAVA中关于构造函数重载有关问题

热度:32   发布时间:2016-04-24 12:57:50.0
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。注意这两个代码的差别,第一个中父类没有缺省的构造方法,第二个中父类的缺省构造方法是必须的,否则无法通过编译,因为如果子类中没有显式的调用的话,编译器需要自动加一个默认的调用。
  相关解决方案