在C ++中,有一种方法可以更改数据,即使它是私有的:
class Foo
{
private:
char * i;
public:
char * getInt() {return i;};
Foo() {i="Winter";};
}
int main()
{
Foo a;
strcpy(a.getInt(), "Summer"); //it changes i
cout<<a.getInt(); //gives "Summer"
return 0;
}
有没有办法在Java中做到这一点?
编辑:如果有,那么在C ++中是否有一些像const
这样的关键字来防止这种行为?
答案 0 :(得分:2)
Java返回指向对象的指针的副本(以及基元值的副本)。 String
就是这样一个对象。 E.g。
class Foo {
private String i = "Winter";
public String get() { return i; }
}
现在这是绝对安全的,没有任何东西(除了反射)可以改变你的私人领域或它的状态:
void main() {
Foo a = new Foo();
String i = a.get();
String j = i + " rocks"; // creates a new string
i = "Summer"; // now points to another string
System.out.println(a.get()); // still prints "Winter"
}
但是,如果代码能够修改返回的对象,则无法阻止它更改它。
Java也没有内置的方法来使对象不可变,你必须将它们设计为有效的不可变,例如String
类。每个修改&#34;的方法都是&#34;一个字符串实际上创建了一个新的不可变字符串,可以在所有地方之间共享。线程没有后顾之忧。
如果你的班级是
class Foo {
public String i = "Winter";
}
你不安全。代码可以改变该字段指向的内容。
void main() {
Foo a = new Foo();
a.i = "Summer"; // that works.
System.out.println(a.i); // prints "Summer"
}
虽然你不应该有公共领域,特别是如果你不想修改它,有一些有用的东西:final
。
class Foo {
public final String i = "Winter";
}
void main() {
Foo a = new Foo();
a.i = "Summer"; // Error: final field cannot be modified.
}
final
关键字可确保仅为字段分配一次。该字段在构造函数完成后需要有一个值,之后无法更改。然而,引用的对象可能仍然是可变的,仅仅引用它不是。