2015-11-05 67 views
1

第一次創建我自己的構造函數。Java構造函數 - 爲什麼年齡迴歸爲零?

import java.util.Scanner; 

public class Person { 
    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 
     System.out.println("Please enter your name"); 
     PersonDetails a = new PersonDetails(input.nextLine()); 
     System.out.println("Enter your age"); 
     PersonDetails b = new PersonDetails(input.nextInt()); 

     System.out.println("So your name is" + " " + a.getName() + " and you are" + " " + a.getAge()); 

    } 
} 

PersonDetails類

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

    public PersonDetails(String initialName) { 
     if(initialName.equals("Stephen")) { 
      name = initialName; 
     } 
     else{ 
      System.out.println("Access denied"); 
      System.exit(0); 
     } 
    } 
    public String getName() { 
     return name; 
    } 

    public PersonDetails(int initialAge) { 
     if(initialAge >= 18) { 
      age = initialAge; 
     } 
     else{ 
      System.out.println("You are a child"); 
      System.exit(0); 
     } 
    } 

    public int getAge() { 
     return age; 
    } 
} 

輸出是:

請輸入您的姓名

斯蒂芬

輸入您的年齡

所以,你的名字是斯蒂芬,你是0

當我輸入斯蒂芬,然後數19爲什麼是零?

+0

,因爲您正在爲您的PersonDetails類創建兩個單獨的實例。和你的'PersonDetails'變量'b'持有年齡。 – SomeJavaGuy

+0

創建一個'setAge',然後設置第一個實例的時間 - >'a.setAge(20)' – sam

回答

3

您創建了2個PersonDetails的實例。 a實例只有名稱設置,b實例只有年齡設置。

您可以創建一個新的構造函數,取的名字和年齡作爲參數:

public PersonDetails(String initialName, int initialAge) { 
    if (initialName.equals("Stephen")) { 
     name = initialName; 
    } 
    else { 
     System.out.println("Access denied"); 
     System.exit(0); 
    } 

    if (initialAge >= 18) { 
     age = initialAge; 
    } 
    else { 
     System.out.println("You are a child"); 
     System.exit(0); 
    } 
    } 

然後,用你的類,如下所示:

Scanner input = new Scanner(System.in); 
System.out.println("Please enter your name"); 
String name = input.nextLine(); 
System.out.println("Enter your age"); 
Int age = input.nextInt(); 
PersonDetails a = new PersonDetails(name, age); 

System.out.println("So your name is" + " " + a.getName() + " and you are" + " " + a.getAge()); 

我也不會推薦其在System.exit(0);一類的構造函數。在這種情況下拋出一個異常會更好,可能在構造函數之外(所以你的驗證在別處)。

+0

很好的解釋 –

1

因爲你正在創建不同的對象,你必須使用b.getAge()

private int age; 

這裏age被初始化爲零,這就是爲什麼當你調用a.getAge()0結果

javaDoc

F已聲明但未初始化的字段將被編譯器設置爲 合理的默認值。一般來說,根據數據類型的不同,默認的 將爲零或爲空。然而,依靠這樣的 默認值,一般認爲編程風格不好 。

更好的解決方案:

創建構造函數,它的名字和年齡

public PersonDetails(String name, int age) { 
     if (name.equals("Stephen")) { 
       this.name = initialName; 
     } 
     else { 
       System.out.println("Access denied"); 
       System.exit(0); 
     } 

     if (age >= 18) { 
       this.age = age; 
     } 
     else { 
       System.out.println("You are a child"); 
       System.exit(0); 
     } 
} 

,並創建一個對象,而不是兩個

-1

修改主你的println方法如下:

System.out.println("So your name is" + " " + a.getName() + " and you are" + " " + b.getAge()); 

go od運氣

相關問題