在Java中的For循环中可以直接修改对象的属性
import java.util.ArrayList;
import java.util.List;
import java.util.regex.*;
public class main {
static class Student {
String name;
int id;
public Student(String name, int id) {
this.name = name;
this.id = id;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [name=" + name + ", id=" + id + "]";
}
}
public static void main(String[] args) {
List<Student> mStudents = new ArrayList<Student>();
mStudents.add(new Student("Tony", 1));
mStudents.add(new Student("Lili", 2));
System.out.println("BEFORE: " + mStudents);
for (Student student : mStudents) {
if (student.id == 1) {
student.setName("zhangsan");
}
}
System.out.println("AFTER: " + mStudents);
}
}
运行结果:
BEFORE: [Student [name=Tony, id=1], Student [name=Lili, id=2]]
AFTER: [Student [name=zhangsan, id=1], Student [name=Lili, id=2]]
而在C++中直接修改不会改变List中的对象属性。结果如下:
for (Student student : mStudents) {
if (student.id == 1) {
student.setName("zhangsan");
}
}
需要加上取地址符才能达到java中的效果:
for (Student &student : mStudents) {
if (student.id == 1) {
student.setName("zhangsan");
}
}
因为C++中讲究传值和传址。而java中并没有这个区分,都是传址,所以在子函数可以直接修改传递过来对象的属性值。而C++中就需要加上&取地址符以变成传址。