提问人:Luke O'Meara 提问时间:3/2/2022 更新时间:3/2/2022 访问量:81
Java - 我可以将引用值相乘吗?
Java - Can I multiply referenced values?
问:
如果我有一个如下类,只是为了存储一个值:
public class RefTest{
private int value;
public void setValue(int value){
this.value = value;
}
public int getValue(){
return value;
}
}
并希望 RefTest b 始终是双 RefTest a,我该怎么做?目前我的值相等:
RefTest a = new RefTest();
a.setValue(5);
RefTest b = new RefTest();
b = a;
System.out.println("RefTest a: "+a.getValue());
System.out.println("RefTest b: "+b.getValue());
a.setValue(10);
System.out.println("RefTest a: "+a.getValue());
System.out.println("RefTest b: "+b.getValue());
但我不确定如何将 b 设置为 2 a,因为“b=2a”返回错误(如预期的那样),并且 b.setValue(2*a.getValue()) 在 a.setValue() 更改时不会更新。
答:
0赞
bhspencer
3/2/2022
#1
我不认为 b = a 正在做你认为它正在做的事情。相反,您想要的是:
b.setValue(a.getValue());
对于 b = 2a,您想要的是:
b.setValue(2 * a.getValue());
事实上,当 a 的值发生变化时,b 的值不会更新。这不是数学,这些是程序表达式。
评论
0赞
Luke O'Meara
3/2/2022
我专门寻找一种方法来做到这一点,其中 b.value 会在 a.value 更新时更新。这在 Java 中是行不通的吗?
0赞
bhspencer
3/2/2022
不像 b = 2a 这样的数学表达式。在 java 中,这是一个简单的赋值,其值为 a 时发生一次。Java 不会自动为您更新事物的值。进行您想要的自动更新的唯一方法是使用一些包装 a 的类,并有一个 get2A() 方法,每次调用它时都会计算 2a。
2赞
jeffchong07
3/2/2022
#2
您想要完成的任务无法按照您实施的方式完成RefTest
你希望 a 和 b 的行为不同,这意味着它们不可能是同一个对象。RefTest
虽然这个要求有点奇怪,但从引用的角度来看,你需要实际存储对对象的引用(在本例中为 a),而不是不是引用的 int 值(该值是在调用 setValue 时计算和设置的)。您仍然需要执行其他工作来实际确保 getValue 始终是 a 值的两倍。
实际上,您需要定义两个单独的对象,其中“b”的行为将是变量(可以是对另一个对象的引用),如果它的 intValue 是该值的两倍
如果你是 Java 的新手,请查看实例变量中 int 和对象引用之间的差异,以及 composition 等模式(在这种情况下可以为您提供帮助)
评论
0赞
Luke O'Meara
3/2/2022
你会怎么做?我明白你的意思,但我不知道该怎么做。
0赞
jeffchong07
3/2/2022
请参阅下面戴夫·科斯塔(Dave Costa)的回复,这是一个很好的例子
1赞
Dave Costa
3/2/2022
#3
根据给定的定义,定义另一个类,例如:RefTest
public class RefTestMultiple{
private RefTest source;
private int multiplier;
RefTestMultiple(RefTest source, int multiplier) {
this.source = source;
this.multiplier = multiplier;
}
public int getValue() {
return multiplier * source.getValue();
}
你可以像这样使用它:
RefTest a = new RefTest();
RefTestMultiple b = new RefTestMultiple(a,2);
a.setValue(5);
System.out.println(b.getValue());
评论
0赞
Luke O'Meara
3/3/2022
然后为我想做的任何其他算术做其中之一?
0赞
Dave Costa
3/3/2022
@LukeO'Meara:你当然可以。我不明白你的总体目标,所以我不知道这是否是实现它的最佳方式。
评论
RefTest
b.setValue(1)
a