2017-05-28 77 views
-2

嗨,大家好我需要一些帮助,以了解更好的构造函数和方法。为什么java的先调用第一个构造函数,而不是默认?:为什么java在这种情况下先调用NOT default构造函数?

public class Human { 
    private String name; 
    private int age; 

    public Human() { 
     this("Alex", 25); 
     System.out.println("Default constructor called"); 
    } 

    public Human(String name, int age) { 
     this.name = name; 
     this.age = age; 
     System.out.println("First constructor called"); 
    } 

    public Human(String name) { 
     this.name = name; 
     System.out.println("Second constructor called"); 
    } 

    public String info(){ 
     return name+" "+age; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } } 

package com.company; 

public class Main { 

    public static void main(String[] args) { 
     System.out.println("Create object 1"); 
     Human person = new Human(); 
     System.out.println(person.info()); 
     System.out.println("Create object 2"); 
     Human person2 = new Human("Mike",55); 
     System.out.println(person2.info()); 
    } 
} 

所以输出是:

Create object 1 
First constructor called 
Default constructor called  
Alex 25 
Create object 2 
First constructor called 
Mike 55 
+3

它** **不叫“默认”构造 - 不然怎么解释中的'默认的构造called'你的输出? –

+0

@OliverCharlesworth OP问为什么默认的构造函数被称为第二 – niceman

+0

好吧,我明白,我有“这个”,但为什么输出字符串“System.out.println(”默认构造函数调用“);”是第二个? – Ess

回答

3

这样的说法:

Human person = new Human(); 

会打电话的默认的构造函数是def独立非执行董事喜欢这里:

public Human() { 
    this("Alex", 25); 
    System.out.println("Default constructor called"); 
} 

现在的第一条语句this("Alex",25)将调用定义的另一个构造这里:

public Human(String name, int age) { 
    this.name = name; 
    this.age = age; 
    System.out.println("First constructor called"); 
} 

这等构造设置了一些实例字段,然后打印“被称为第一个构造函数”,当它完成我们返回到我们的默认构造函数this("Alex",25),并返回到打印出“Default constructor called”的下一条语句。

简而言之:您的打印成功调用其他构造函数,这使得您认为其他构造函数被首先调用。

+1

你的回答非常好,然后你在最后一句话中搞砸了。你不能在'this(“Alex”,25);'之前放置打印语句。不允许!! – Andreas

+0

@Andreas感谢您指出这一点 – niceman

+0

这里'Human'类没有默认构造函数。 –

3

这正是表现为它应该,让卷起的函数调用:

System.out.println("Create object 1"); 
Human person = new Human(); 
--this("Alex", 25); 
----this.name = name; 
----this.age = age; 
----System.out.println("First constructor called"); 
--System.out.println("Default constructor called"); 
System.out.println(person.info()); 
System.out.println("Create object 2"); 
Human person2 = new Human("Mike",55); 
--this.name = name; 
--this.age = age; 
--System.out.println("First constructor called"); 
System.out.println(person2.info()); 
相关问题