2017-09-24 98 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]) 
    } 
}