2015-11-19 81 views
0

我的程序應該將用戶提交的信息存儲到另一個類中。然後它應該執行一個小計算來確定年齡。最後一部分是在驅動程序中創建一個輔助類的實例,然後使用toString打印出所有的信息。我的結果每次都爲null,null,0,0。我究竟做錯了什麼?爲什麼我的程序返回null,null,0,0?

public class CustomerInfoProgram { 

    public static Scanner scan = new Scanner(System.in); 
    public static String firstName; 
    public static String lastName; 
    public static String address; 
    public static String phoneNumber; 
    public static int dob; 
    public static int currentYear; 
    public static int age; 
    public static String name; 

    public static void main(String[] args) { 

     Customer in = new Customer(); 

     getCustomerName(); 
     getPhone(); 
     getAddress(); 
     getDOB(); 
     getCurrentYear(); 
     in.toString(); 

    } 

    public static String getCustomerName() { 

     System.out.println("What is your first name?"); 
     firstName = scan.nextLine(); 

     System.out.println("What is your last name?"); 
     lastName = scan.nextLine(); 

     name = firstName + " " + lastName; 

     return name; 

    } 

    public static String getAddress() { 

     System.out.println("What is your address?"); 
     address = scan.nextLine(); 

     return address; 
    } 

    public static String getPhone() { 

     System.out.println("What is your phone number?"); 
     phoneNumber = scan.nextLine(); 

     return phoneNumber; 
    } 

    public static int getDOB() { 

     System.out.println("What year were you born?"); 
     dob = scan.nextInt(); 

     return dob; 
    } 

    public static int getCurrentYear() { 

     System.out.println("What is the current year?"); 
     currentYear = scan.nextInt(); 

     return currentYear; 
    } 
} 

二級類:

import java.util.Scanner; 

public class Customer { 

    public static int age; 
    public static String allInfo; 
    public static String name = CustomerInfoProgram.name; 
    public static String address = CustomerInfoProgram.address; 
    public static String phoneNumber = CustomerInfoProgram.phoneNumber; 
    public static int dob = CustomerInfoProgram.dob; 
    public static int currentYear = CustomerInfoProgram.currentYear; 

    private int getAge() { 

     age = (currentYear - dob); 

     return age; 
    } 

    public String toString() { 

     getAge(); 
     allInfo = (name + " " + address + " " + phoneNumber + " " + dob + " " + age); 
     System.out.println(allInfo); 

     return toString(); 
    } 
} 
+1

冷酷的事情似乎是錯誤的是,所有的領域都是靜態的。這很奇怪。這使得它們成爲類字段而不是實例字段。 –

回答

2
public static String name = CustomerInfoProgram.name; 

這隻套CustomerInfoProgram.name值字段時被初始化,即一次,當Customer類加載 - 當CustomerInfoProgram.name是不更新更新。

Customer類(最晚),當你調用new Customer(),你運行任何方法之前設置的CustomerInfoProgram.name值,所以它是空當您嘗試使用name恰好加載。

如果您要使用當前值CustomerInfoProgram.name,請直接引用該字段。或者,你可以添加一個getter,它會返回其當前值:

public static String getName() { 
    return CustomerInfoProgram.name; 
} 

然後調用吸氣代替name

allInfo = (getName() + " " + ... 

(完全同樣適用於其他領域)。


你也會從你得到一個StackOverflowErrortoString()方法:

public String toString() { 

    getAge(); 
    allInfo = (name + " " + address + " " + phoneNumber + " " + dob + " " + age); 
    System.out.println(allInfo); 

    return toString(); 
} 

你無條件調用toString()toString(),因此這將只是保持自稱,直到它運行的堆棧空間。在main方法

public String toString() { 

    getAge(); // This actually does nothing - do you intend to use it in the return value? 
    return (name + " " + address + " " + phoneNumber + " " + dob + " " + age); 
} 

,並呼籲System.out.println

相反,只返回allInfo

System.out.println(in); // Implicitly calls toString(). 
+0

是的 - 這是一個評估和價值類型問題的時間。當名稱分配完成後,它將獲得對當前存儲的實際字符串的引用的「複製」,此時在源中。更改來源,更改來源的參考,而不是目的地。 – ash

+0

@ Andy Turner謝謝!我現在得到它的工作,但它打印出的結果像100次....不知道爲什麼 – Jibblz

+0

增加了原因。 –

0

見@安迪的回答你的問題的原因。

通常的做法是在創建對象之前收集要存儲在您的對象中的值,然後使用非默認的構造函數調用。部分示例可能如下所示:

// get individual values here 
getCustomerName(); 
getPhone(); 
// etcetera 

Customer in = new Customer(name, phone, address, dob); 

其餘我作爲練習留給讀者。

0

作爲靜態屬性,在這兩個類中的初始化將只有一次。因此,發佈您從用戶那裏獲得的輸入,這些值不會設置爲屬性。因此,空。