2017-09-24 20 views
-1

私は2つの配列と2つのクラスを持っています。私はユーザーの名前と年齢の出力を持つ必要がありますが、nullを返すために "名前"に問題があります。 「年齢」はうまくいきます。私のミスはどこですか?なぜ「名前を返すか」 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; 
    } 
} 

出力は次のようになります。あなたは2回目の反復でusers配列内の既存のオブジェクトを上書きしているためである

ヌル

+0

なぜ8人のユーザー、4人の名前、4人のユーザーを作成していますか? – John3136

答えて

1

あなたは、デフォルトでnullnameセットと第二のループで新しいUserを再割り当てされています。したがって、のような何かをするのが安全でなければなりません。あなたはどちらか(配列は、彼と同じ長さを持っているので)、単一のループで

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 j = 0; j<ages.length; j++){ 
    users[j].setAge(ages[j]); 
} 

のように、既存のUserオブジェクトを再使用したり、コンストラクタを追加し、名前を渡す必要がありますそれまでの年齢:

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のセマンティクスを見ると、現実には年齢が変更できないため、セッターが必要であり、クラスを変更することはできません。 – BusinessPlanQuickBuilder

1

。それの反対側に

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]) 
    } 
} 
関連する問題