2017-09-24 99 views
-1

我有兩個數組和兩個類。我需要輸出一個用戶的姓名和年齡,但由於返回null,所以我遇到了「姓名」的問題。 「年齡」工作正常。我的錯誤在哪裏?爲什麼「返回姓名」是空的?

public class Lesson4OOP { 
public static void main(String[] args) { 
    String[] names = {"Adam","Sara", "Mike" , "David"}; 
    int[] ages = {21, 25, 34, 16}; 
    User[] users = new User[names.length]; 
    for(int i = 0; i<users.length; i++){ 
     User u = new User(); 
     u.setName(names[i]); 
     users[i] = u; 
    } 

    for(int j = 0; j<ages.length; j++){ 
     User a = new User(); 
     a.setAge(ages[j]); 
     users[j] = a; 
    } 
    System.out.println(users[3].getName()); 
    System.out.println(users[3].getAge()); 
    } 
} 

public class User { 
    String names; 
    int ages; 

    public void setName(String val){ 
     names = val; 
    } 
    public String getName(){ 
     return names; 
    } 
    public void setAge(int num){ 
     ages = num; 
    } 
    public int getAge(){ 
     return ages; 
    } 
} 

輸出是:

+0

爲什麼要創建8個用戶,4個名稱和4個年齡段? – John3136

回答

1

你在第二循環中默認重新分配一個新的Username設置爲null。你應該可以重新使用現有的User對象,這樣

for(int j = 0; j<ages.length; j++){ 
    users[j].setAge(ages[j]); 
} 

在一個循環做到既分配(因爲數組有他相同的長度)

for(int i = 0; i<users.length; i++){ 
    User u = new User(); 
    u.setName(names[i]); 
    users[j].setAge(ages[i]); 
    users[i] = u; 
} 

或添加一個構造函數,並通過名稱和年齡是:

for(int i = 0; i<users.length; i++){ 
    User u = new User(names[i], ages[i]); 
} 

如果允許設置nameage這種方式,可以使類不可變的,太:

public class User { 
    final String name; 
    final int age; 
    public User(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 
    public String getName(){ 
     return name; 
    } 
    public int getAge(){ 
     return age; 
    } 
} 
+0

查看類User的語義,不是現實中可變的年齡,所以需要setter,而class不能是不可變的? – BusinessPlanQuickBuilder

1

那是因爲你已經重寫了users陣列中現有的對象與你的第二個迭代。

for(int i = 0; i<names.length; i++){ //array is named 'names' 
    User u = new User(); 
    u.setName(names[i]); 
    users[i] = u; 
} 

for(int j = 0; j<ages.length; j++){ 
    user[i].setAge(ages[j]); // using the existing object here 
} 

在它的另一面,我會假設你要在用戶數量方面是具有名年齡的映射。因此,它應該是安全的這樣做:

if(names.length != ages.length) { 
    // input mismatch for ages and names ; do some action in this condition 
} else { 
    for(int i = 0; i<names.length; i++){ 
     users[i].setName(names[i]); 
     users[i].setAge(ages[i]) 
    } 
}