Java 为什么返回空的arraylist?
我想创建两个构造函数,一个用于创建具有Java 为什么返回空的arraylist?,java,arrays,construct,Java,Arrays,Construct,我想创建两个构造函数,一个用于创建具有年龄和名称的人类,另一个用于使用第一个构造函数创建具有随机年龄和名称的人类 我创建一个名称数组[Name1,Name2,…,Name9]并选择一个随机名称,然后我创建一个介于1-100之间的随机年龄,并将其存储为rage,最后我创建一个带有随机名称和年龄的人 在我的主要方法中,我想创建一个包含9个随机人的arraylist并将其打印出来,但我只得到了9个名为:null且年龄为0的人。任何帮助都将不胜感激 class Human { int age;
年龄和名称的人类
,另一个用于使用第一个构造函数创建具有随机年龄和名称的人类
我创建一个名称数组[Name1,Name2,…,Name9]
并选择一个随机名称,然后我创建一个介于1-100之间的随机年龄,并将其存储为rage
,最后我创建一个带有随机名称和年龄的人
在我的主要方法中,我想创建一个包含9个随机人的arraylist并将其打印出来,但我只得到了9个名为:null
且年龄为0的人。任何帮助都将不胜感激
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);
}
}
类人类{
智力年龄;
字符串名;
公共人员(int myAge,字符串myName){
name=myName;
年龄=我的年龄;
}
公共人权(){
ArrayList randomnames=新的ArrayList();
对于Human()
构造函数中的(int j=1;j),您编写了
Human randomPerson = new Human(rage,rname);
这不会初始化您的人员
,而是创建另一个对象
正确的做法是:
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()));
}
请注意,randomAge()
和randomName()
必须声明为static
,因为在调用this()
之前不能调用非静态方法,因为对象还不存在。在Human()
构造函数中,您编写了
Human randomPerson = new Human(rage,rname);
这不会初始化您的人员
,而是创建另一个对象
正确的做法是:
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()));
}
请注意,randomAge()
和randomName()
必须声明为static
,因为在调用this()
之前不能调用非静态方法,因为对象还不存在。ArrayList randomName=new ArrayList();
的范围仅限于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);
}
ArrayList randomnames=new ArrayList();
的作用域仅限于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);
}
在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);
}
public-Human(){
ArrayList randomnames=新的ArrayList();
for(int j=1;j在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);
}
public-Human(){
ArrayList randomnames=新的ArrayList();
对于(int j=1;j,如另一个答案中所述,这不起作用:
Human randomPerson = new Human(rage,rname);
但是使用
this(rage, rname);
也不起作用,因为它不是构造函数中的第一行
链接:
因此,不要调用其他构造函数,只需执行以下操作:
this.age = rage;
this.name = rname;
正如在另一个答复中所述,这不起作用:
Human randomPerson = new Human(rage,rname);
但是使用
this(rage, rname);
也不起作用,因为它不是构造函数中的第一行
链接:
因此,不要调用其他构造函数,只需执行以下操作:
this.age = rage;
this.name = rname;
一种解决方案是编写this(rage,rname)
,但这只在它是构造函数中的第一行时有效。要使它成为构造函数中的第一行,需要先创建两个函数
private int randomAge(){
return randomGenerator.nextInt(100);
}
private String randomName(){
return "Namn"+randomGenerator.nextInt(10);
}
创建这两个函数后,第二个构造函数可以说this(randomAge(),randomName())
一个解决方案是编写this(rage,rname)
,但这只在它是构造函数的第一行时起作用。要使它成为构造函数的第一行,需要先创建两个函数
private int randomAge(){
return randomGenerator.nextInt(100);
}
private String randomName(){
return "Namn"+randomGenerator.nextInt(10);
}
创建这两个函数后,第二个构造函数可以说this(randomAge(),randomName())
格式化代码,请回答“返回空数组列表”是什么意思?@Pshemo;它正在返回一个包含9个对象的arraylist,这些对象的名称为null,年龄为0。未设置该对象的属性。arraylist不是null。请格式化您的代码,“返回null arraylist”是什么意思?@Pshemo;它返回了一个包含9个对象的arraylist,该对象的名称为null,年龄为0。该对象的属性未设置。arraylist不是null谢谢你的回答!它说构造函数调用必须是my Human()中的第一条语句-构造函数,但这对我不起作用,因为我只在我的Human()构造函数的末尾创建rage和rname,所以我不能将此(rage,rname);作为我的第一行来编写。这的第一部分是正确的。但是,this(rage,rname)
是不正确的,因为您必须首先将其放在动态创建属性的位置。您可以生成ArrayList并将其作为静态
变量存储在类中。然后您可以做一个很好的小技巧,将所有内容放在一行中,如下所示:此