Java 是按值传递,或者更具体地说,按值传递引用。这意味着所有引用类型都被传递,这样:
List<String> a = myObj.getList();
a.add("My String"); // this modifies the source list
List<String> b = new ArrayList<String>();
a = b; // this doesn't change the source list's reference
在使用 Java 编程时,大多数人尝试尽可能实现最高级别的封装,将可变类型转换为不可变类型(例如使用复制构造函数习语)。这是在 OOP 空间中编程的好方法。
如果你没有 setter,你可能想使用 Java 的内置反射:
public class Test {
private String NAME = "OLD NAME";
public String getName() {
return this.NAME;
}
public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
Test t = new Test();
System.out.println(t.getName()); // OLD NAME
Field f = t.getClass().getDeclaredField("NAME");
f.setAccessible(true); // allows access to private field
f.set(t, "NEW NAME");
System.out.println(t.getName()); // NEW NAME
}
}
但请注意,反射是一个高级主题,在大多数情况下是糟糕编程的症状。