我想创建两个构造函数,一个用Human
创建一个age
和一个name
,另一个用第一个构造函数创建一个带的人随机年龄和名称。
我创建了一个名为[Name1, Name2,...,Name9]
的数组并挑出一个随机名称,然后创建一个介于1-100之间的随机年龄并将其存储为rage
,最后创建一个Human
随机name
和age
。
在我的主要方法中,我想创建一个由9个随机人组成的arraylist并将其打印出来,但我只得到9个名字为null
并且年龄为0的人类。任何帮助都将不胜感激!< / p>
class Human {
int age;
String name;
public Human (int myAge, String myName) {
name = myName;
age = myAge;
}
public Human() {
ArrayList<String> randomnames = new ArrayList<String>();
for (int j=1;j<10;j++) {
randomnames.add("Namn"+j);
}
Random randomGenerator = new Random();
int index = randomGenerator.nextInt(randomnames.size());
String rname = randomnames.get(index);
int rage = (int) (Math.random()*100)
Human randomPerson = new Human(rage,rname);
}
public static void main (String[] args) {
ArrayList<Object> randomHumans = new ArrayList<Object>();
for (int j=1;j<10;j++) {
Human randomPerson = new Human();
randomHumans.add(randomPerson);
}
System.out.println(randomHumans);
}
}
答案 0 :(得分:1)
在Human()
构造函数中,您编写了
Human randomPerson = new Human(rage,rname);
这不会初始化您的Human
,而是会创建另一个对象。
正确的做法是:
this(rage,rname); // Invoke Human(int, String) constructor
因为this()必须是第一行,所以你可以编写辅助方法,如:
private static int randomAge(){
return (int) (Math.random()*100);
}
private static String randomName(){
ArrayList<String> randomnames = new ArrayList<String>();
for (int j=1;j<10;j++) {
randomnames.add("Namn"+j);
}
return randomnames.get((int)(Math.random()*randomnames.size()));
}
然后你的构造函数只是
public Human(){
this(randomAge(),randomName());
}
请注意randomAge()
和randomName()
必须声明为static
,因为在调用this()
之前无法调用非静态方法,因为该对象不存在爱好。
答案 1 :(得分:1)
您在Human()构造函数中执行的所有操作都不会影响根本创建的Human对象的内部属性。
以下是解决问题的Human()构造函数的变体:
public Human() {
ArrayList<String> randomnames = new ArrayList<String>();
for (int j=1;j<10;j++) {
randomnames.add("Namn"+j);
}
age = (int) (Math.random()*100);
Random randomGenerator = new Random();
int index = randomGenerator.nextInt(randomnames.size());
name = randomnames.get(index);
}
答案 2 :(得分:1)
正如另一个答案中所述,这不起作用:
clone()
但使用
Human randomPerson = new Human(rage,rname);
无法工作,因为它不是构造函数中的第一行。
链接:Why do this() and super() have to be the first statement in a constructor?
所以不要只调用其他构造函数来执行此操作:
this(rage, rname);
答案 3 :(得分:1)
一种解决方案是编写this(rage,rname)
但这仅在构造函数中的第一行才有效。要使它成为构造函数中的第一行,需要首先创建两个函数。
private int randomAge(){
return randomGenerator.nextInt(100);
}
private String randomName(){
return "Namn"+randomGenerator.nextInt(10);
}
创建这两个函数后,第二个构造函数可以说this(randomAge(),randomName())
。
答案 4 :(得分:-1)
ArrayList<String> randomnames = new ArrayList<String>();
仅作用域到Human()
,而不是main()
。您不需要它只从列表中提取随机名称。
您的Human
课程并不关心ArrayList
。它有两个字段,就是这样。
在我的主要方法中,我想创建一个由9个随机人组成的arraylist
你需要在main()
中制作随机的人类,而不是从new Human()
调用
将该代码完全移至main()
,而不是重复其尝试。
例如,
public static void main() {
// Make your list
List<Human> randomHumans = new ArrayList<>();
Random randomGenerator = new Random();
for (int j = 1; j <= 10; j++) {
// Get the random data
String randomName = "Namn"+j;
int rage = (int) (Math.random()*100);
// add the human
randomHumans.add(new Human(randomName, rage););
}
System.out.println(randomHumans);
}
使用第一个构造函数创建具有随机年龄和名称的人
这可以简单地写成
public Human() {
Random randomGenerator = new Random();
this.name = "Namn"+randomGenerator.nextInt(10);
this.age = randomGenerator.nextInt(100);
}