练习1、
ps:输出结果为地址值,是因为在输出对象时,默认调用了对象的toString()方法。在没有重写toString()方法的情况下,toString()方法返回的是对象的地址值。如果想要输出对象的属性值而不是地址值,可以重写toString()方法。
可以改为这样:
代码:
import java.util.ArrayList;
public class practice {
public static void main(String[] args) {
//定义一个集合
ArrayList<Student> list = new ArrayList<>();
//创建学生对象
Student s1 = new Student("zhangsan",19);
Student s2 = new Student("lisi",20);
Student s3 = new Student("wangwu",10);
Student s4 = new Student("xiaoliu",18);
//添加元素
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4);
//遍历集合
for(int i=0;i< list.size();i++){
Student stu = list.get(i);
System.out.println(stu.getName()+","+stu.getAge());
}
}
}
结果:
练习2、
问题1、没有执行添加的循环,最后集合长度为0;
因为集合的长度一开始为0;所以size方法返回的for里面的就为0,如下图所示,相当于第一次循环就不执行,循环没有执行;
所以改为固定的数字即可;
问题2、如果将Student s = new Student();放在循环外面,会出现全部被最后一个人替代的问题:
原因是:第一次创建学生对象后,地址是0x0011,将zhangsan 23复制进去后,存储到集合中,接下来并没有再次创建对象,所以还是对同一个对象赋值,变为lisi 24,再将0x0011放进集合中,最后输入的是wangwu 25,仍然是对这个对象赋值,所以,存入集合中的是三个一样的地址都是0x0011,所以指向的都是同一个对象,所以输出的都是wangwu 25;
正确的是这样的:
自己写的代码:(冗余)
import java.util.Scanner;
import java.util.ArrayList;
public class practice {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
//定义一个集合
ArrayList<Student> list = new ArrayList<>();
//创建学生对象
Student s1 = new Student();
Student s2 = new Student();
Student s3 = new Student();
System.out.println("输入第一个同学的名字:");
String n1 = input.next();
s1.setName(n1);
System.out.println("输入第二个同学的名字:");
String n2 = input.next();
s2.setName(n2);
System.out.println("输入第三个同学的名字:");
String n3 = input.next();
s3.setName(n3);
System.out.println("输入第一个同学的年龄:");
int a1 = input.nextInt();
s1.setAge(a1);
System.out.println("输入第二个同学的年龄:");
int a2 = input.nextInt();
s2.setAge(a2);
System.out.println("输入第三个同学的年龄:");
int a3 = input.nextInt();
s3.setAge(a3);
//添加元素
list.add(s1);
list.add(s2);
list.add(s3);
//遍历集合
for(int i=0;i< list.size();i++){
Student stu = list.get(i);
System.out.println(stu.getName()+","+stu.getAge());
}
}
}
public class Student {
//私有化成员变量
private String name ;
private int age;
//空参构造
public Student() {
}
//带全部参数的构造方法
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//get/set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
代码结果: