2014-12-22 27 views
0

从读一本书重载的构造函数,我累了下面的代码后:重载构造

public class Employee { 

    String name; 
    int idNumber; 

    public Employee(){ 
     this("JJ", 0); 
     System.out.println(name +" "+ idNumber); 
    } 

    public Employee(String name, int num){ 

     this.name = name; 
     idNumber = num; 
     System.out.println(name +" 2nd "+ idNumber); 
    } 
} 


public class Object1 { 

    public static void main(String[] args) { 

     Employee emp = new Employee(); 
    } 

} 

OUTPUT:

JJ 2nd 0 

JJ 0 

我真的很困惑。为什么“JJ 2nd 0”先打印出“JJ 0”?我创建了一个employee对象emp,并没有传入参数中的任何参数,是不是假设先调用第一个构造函数?

+2

或许,如果人们使用的调试器(HTTP:/ /www.vogella.com/tutorials/EclipseDebugging/article.html)更多,这不会是一个问题。 – Qix

+0

@Qix谢谢。从来没有听说过调试器,但我没有谷歌它,我现在要学习如何使用它。 – OPK

+1

我刚刚意识到,您已经提出了一些问题,但尚未接受任何答案。接受一些,如果他们真的有用,可能是一个好主意,既是一种说“谢谢”的方式,也是向未来的用户表明看问题的答案最能回答问题。 –

回答

5

new Employee();被调用

public Employee(){ 
    this("JJ", 0); 
    System.out.println(name +" "+ idNumber); 
} 

在此构造

this("JJ", 0);

正在调用

public Employee(String name, int num)

构造,其与呼叫

System.out.println(name +" 2nd "+ idNumber);结束。

负责印刷

JJ 2日0

this("JJ", 0);将完成System.out.println(name +" "+ idNumber);将被调用,你应该看到另一条线路

JJ 0

2

的无参数的构造函数调用其他的构造与下面的行参数:

this("JJ", 0); 
+4

不知道这是怎么回事... –

+1

不能同意更多。回答这个问题。 – Adam

4

当你写道:

... new Employee(); 

你最终调用默认的(无参数)构造函数。在构造函数中的第一行的代码是:

this("JJ", 0); 

它调用2参数的构造函数,在其中你写

System.out.println(name +" 2nd "+ idNumber); 

这是第一次两个输出报表程序的遭遇,因此是您在控制台中看到的第一件事。

该输出语句后,程序返回到默认的无参数的构造函数,并继续执行你的其它输出语句

System.out.println(name +" "+ idNumber); 

这是你看到的“第二”输出语句。

如果你用调试器遍历你的代码,一行一行,你将会看到程序的执行过程,并且应该证明我指的是什么。

0

它确实首先调用第一个构造函数,但其​​中的第一行是对第二个构造函数的调用。当您使用main方法创建Employee对象时,可以调用构造函数Employee(),但不带参数(第一个参数)。该构造函数首先调用第二个构造函数,该构造函数打印JJ 2nd 0,然后,第一个构造函数打印行JJ 0。这是它如何被执行:

  1. 当被称为main方法,第一个构造函数,new Employee(),被调用。
  2. 该构造函数调用第二个构造函数。
  3. 第二个构造函数打印JJ 2nd 0,然后完成。
  4. 第一个构造函数继续下一行,即System.out.println(name +" "+ idNumber);,并打印JJ 0
1

您必须阅读有关这个​​关键字进行,只是开始的像和傻冒使用类的对象,

     See in the first constructor this("JJ","0") means that a constructor having two arguments is being invoked so the first line redirects the control into the second constructor that's is why the other line is printed first.