使用公共方法更改Java中的私有字段

时间:2016-07-09 19:02:46

标签: java c++

在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这样的关键字来防止这种行为?

1 个答案:

答案 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关键字可确保仅为字段分配一次。该字段在构造函数完成后需要有一个值,之后无法更改。然而,引用的对象可能仍然是可变的,仅仅引用它不是。