在我的项目中,我遇到了一个我无法快速谷歌的情况。 我有几个对象,并在每个对象的 id 字段中写入一个值,当我稍后更改此 id 时,我需要更新每个对象的 id 字段中的值。示例b = null; a = b; => a = null;
例如,在b = 3
之后,有必要在不再次a = b
的情况下更新a = 3
的值。我将尝试更详细地解释。
class Student { private Long id; }
class Class { private Long id; }
Student s = new Student ();
Class c = new Class ();
c.getid = null;
s.setId (c.getId); => s.getId == null;
经过一些操作c.getId == 1;
但s.getId == null
如何在没有s.setId (c.getId)
的情况下做s.getId == 1
?
这可能吗?
,有必要更新 a = 3 的值,而无需 a = b 再。这可能吗?
如果字段a
和b
是基元数据类型,则 no。您需要同时更新a
和b
。
如果a
和b
是对象上的实例,那么是的,因为a
和b
共享相同的内存引用。因此,如果您的字段是原始数据类型,您可以使用适当的 set/get 方法将它们包装在自定义对象中,您就可以开始了。
如果这些字段可以由多线程并发读取/写入,则在访问它们时可能还需要确保互斥。
正如我所怀疑的,你的问题实际上是一个XY问题,你吠错了树。解决方案不是更改学生的 ID,而是将引用传递到需要的地方。在这里,我怀疑id
代表一个班级的id
,因此最好的解决方案是给班级一个ArrayList<Student>
字段(因为它将容纳多个学生),并给你的学生一个ArrayList<Class>
字段(因为一个学生可以参加多个班级)。
然后,当学生注册课程(通过某种方法)时,将该班级添加到其班级列表中,并将该学生添加到班级的学生列表中。
例如,
public class Student {
private int id;
private List<Class> classes = new ArrayList<>();
// constructor, getters, setters
public void addClass(Class class) {
classes.add(class);
}
// also removeClass method, a getClasses method...
}
public class Class {
private int id;
private List<Student> students = new ArrayList<>();
// constructor, getters, setters
public void addStudent(Student student) {
students.add(student);
}
// also removeStudent method, a getStudents method...
}
感谢您对问题的良好解释,但如果您告诉我们原因会更好。 买路,我觉得这是一个XY问题,更重要的问题是"你为什么需要这个"?
让我们谈谈您的问题,您应该考虑的选择很少。
a
和b
的类型是原始的 由于原语有自己的记忆(不指向其他地方),就像 C 语言一样,在赋值之后,没有任何东西将a
和b
联系起来,它们可以(并且将)单独更改。 例如
int a, b;
a = 3;
b = a;
a = 5;
// b is still 3
a
和b
是引用,您希望它们指向同一对象。 对象在堆中,并且由于没有赋值重载(就像我们在 cpp 中一样),在赋值之后a
和b
指向完全相同的对象,因此 a 指向的对象中的每个更改都将从 b 中看到。 但请记住,除非 a 和 b 指向同一对象并使用.
操作对象状态;
class Student {
int id;
}
class Demo {
public static void main(String[] args) {
Student a, b;
a = new Student();
a.id = 3;
b = a;
// they are now pointing to same object
a.id = 5;
// b.id is 5 too, basically same int
b = null;
// now they are disconnect
// or maybe this: b = new Student()
}
}
我认为这可以帮助并回答您的问题,但让我们也讨论一下您的代码片段。
- 如果您希望引用本身更改。 例如:
String a, b;
a = "some string"
b = a;
a = null;
// b should be null?
据我所知,Java中没有为您提供此功能,没有运算符重载或预处理器可以提供帮助。
但如果你坚持,我可以想到一些技巧。
使用- C 或任何其他自定义预处理器并定义一些宏来执行此操作。 例如,在使用 Java 编译器编译之前,使用
a
重命名所有b
变量。 检查这个 - 定义一个单例对象(或只是一个虚拟类)并
a
,b
保留对该对象的引用,这实际上是情况 2 和 3 的组合;
使用静态类:
class Global {
static Object reference;
}
class Demo {
public static void main(String[] args) {
Global a = null, b = null;
a.reference = "some string value";
b.reference = null;
// a.reference is null
}
}
和单例类:
class Singleton {
private static final Singleton instance = new Singleton();
public static Singleton getInstance() {
return Singleton.instance;
}
private Singleton() {}
Object ref;
}
class Demo {
public static void main(String[] args) {
Singleton a = Singleton.getInstance();
Singleton b = a;
a.ref = "some string value";
b.ref = null;
// a.ref is null
System.out.println(a.ref);
}
}
(是的,我知道这不是你想要的,但java是语法级别的简单语言)