簡體   English   中英

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

[英]Changing private fields in Java using public methods

在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這樣的關鍵字來防止這種行為?

Java返回指向對象的指針的副本(以及基元值的副本)。 String就是這樣的對象。 例如

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類。 每個“修改”字符串的方法實際上都會創建一個新的不可變字符串,該字符串可以在所有場所和線程之間共享,而無需擔心。

如果你的課是

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關鍵字保證一個字段只被分配一次。 構造函數完成后,該字段需要具有一個值,此后不能更改。 但是,引用的對象可能仍然是可變的,只是對其的引用不是可變的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM