我可以在Java中改变参数吗? 在C++中,我可能会做如下的事情: sometype var = somevalue; mutate(var); // var is now someothervalue void mutate(sometype &a) { a = someothervalue; } Customer a; public static void main(String[] args) { a = newCustomer("Charles"); Customer b = null; mutate(b); System.out.println(b.getName()); // NullPointerException, expected "Charles" } void mutate(Customer c) { c = a; }
Java中是否有类似的东西 我正在努力实现以下目标:我可以在Java中改变参数吗? 在C++中,我可能会做如下的事情: sometype var = somevalue; mutate(var); // var is now someothervalue void mutate(sometype &a) { a = someothervalue; } Customer a; public static void main(String[] args) { a = newCustomer("Charles"); Customer b = null; mutate(b); System.out.println(b.getName()); // NullPointerException, expected "Charles" } void mutate(Customer c) { c = a; },java,oop,mutation,Java,Oop,Mutation,Java中是否有类似的东西 我正在努力实现以下目标: sometype var = somevalue; mutate(var); // var is now someothervalue void mutate(sometype &a) { a = someothervalue; } Customer a; public static void main(String[] args) { a = newCustomer("Charles"); Custom
sometype var = somevalue;
mutate(var);
// var is now someothervalue
void mutate(sometype &a) {
a = someothervalue;
}
Customer a;
public static void main(String[] args) {
a = newCustomer("Charles");
Customer b = null;
mutate(b);
System.out.println(b.getName()); // NullPointerException, expected "Charles"
}
void mutate(Customer c) {
c = a;
}
如果
Customer
是可变的,为什么会产生NullPointerException?看起来您对可变性感到困惑。易变性只是改变对象状态。您在示例中展示的不仅仅是易变性。通过将实例引用到其他实例(=
),您正在完全更改该实例
什么是可变性
sometype var = somevalue;
mutate(var);
var.getChangeState() // just gives you the latest value you done in mutate method
void mutate(sometype a) {
varType someParamForA= valueX;
a.changeState(someParamForA); // changing a param inside object a.
}
是的,在Java中完全有效的可变对象的情况下。您可以在调用mutate方法后看到更改
原语的大小写::
请记住,在使用原语的情况下,Java无法做到这一点。所有的原语变量都是不可变的
如果您想在原语中使用Java实现同样的功能,可以尝试以下方法
int var = 0;
var = mutate(var);
int mutate(int a) {
a = a + 1;
return a;
}
原语是不可变的,但这是你的问题吗?这个例子只是为了说明。其他对象是可变的(不是全部)。是的,不幸的是,这行不通。唯一的方法是用其他东西包装int。看见我倾向于使用原子整数。在这个链接中有很多很好的答案——看这个例子并没有展示易变性。两者都只是描述用另一个引用/值覆盖一个引用/值。此外,由于java是按值调用的,所以引用(将其看作指针,因为java引用与C++引用不相同)将在函数中复制。除非您执行类似于
a=
(例如a.setValue(7)
或对于公共成员a.member=7
)的操作,否则某些类型的状态不会更改。@patrik同意您的意见。澄清了我的回答:)