2016-04-26 28 views
0

我知道這是非常基本的,但我想知道爲什麼我們應該在封裝中使用私有變量。我提到我的代碼。所以我可以給你更好的解釋。封裝中使用公有方法的私有變量的需求是什麼?而不是直接聲明公共變量

Class Employee 
{ 
     private String eName; 

     public String getEname() 
     { 
     return this.eName; 
     } 
     public void setEname(String name) 
     { 
      this.eName=name; 
     } 

這裏「eName」是私人的,所以我們可以限制外部對象直接訪問。變量只能使用其getter setter進行訪問。

現在我的問題是爲什麼我們應該使用getter setter方法?我們不能將變量聲明爲公共。

使用setter方法任何人都可以更改值,所以這個私有變量需要什麼?

另一個問題

我們設置創建讀/寫的,如果我們不創建getter方法唯一的方法則變成只寫,如果我們不創造setter方法,然後它變成只讀。

那麼什麼是隻讀和只寫?

如果我們不創建setter方法,那麼值將如何設置爲變量?

如果我們不創建getter方法,那麼值將如何檢索?

請給我上述簡單問題的答案。

謝謝 :)

+0

當然你可以把它標記爲'public'。但是,如果您這樣做,您如何執行由外部代碼分配給它的值是一個允許值? –

+0

如果您稍後想要爲獲取者和設置者添加副作用,則調用API的任何代碼都不需要更改。 – bhspencer

+1

http://stackoverflow.com/questions/1568091/why-use-getters-and-setters –

回答

0

如果我們申報方法公開,那麼其他人可以改變它的值。有時候,在封裝中,你不希望價值被改變,而只是被看到。 public會員可以閱讀,也可以更改。因此,你聲明private


所以什麼用的只讀,只寫?

我很少看到只寫,但只讀是常見的,例如,在銀行帳戶軟件。您想要讀取帳戶餘額,但不能更改!


如果我們不創造setter方法則值將如何設置成變量?

obj.eName = "Whatever"; 

如果我們不創建getter方法則值將如何找回?

whatever = obj.eName; 
+0

你好。 如果我們的變量是私人的,那麼obj.eName =「Whatever」;有可能嗎? –

+0

不可以,只有當它是公開的,保護的或者沒有的時候,這取決於其他班級所在的軟件包 – Hackerdarshi

+0

現在我的問題就是這樣。如果我們的變量是私有的,並且我們沒有setter方法,那麼我們可以將該值設置爲變量嗎?還有其他的選擇嗎? –

0

在二傳手,我們可以驗證輸入的數據被設置爲財產和採取行動。因此,請參考下面:

public void setEname(String name) 
     { 
      //Here we can validate input data or even throw an exception 
      if(name!=null && name.length()<5){ 
      this.eName="Some Default Value"; 
      //throw new IllegalArgumentException("Your custom message goes here"); 
      }else{ 
      this.eName=name; 
      } 
     } 

而且許多API的使用Java反射來設置私有屬性值,對於此setter方法是必需的。

0

現在我的問題是爲什麼我們應該使用getter setter方法?我們不能把 作爲公開聲明變量。

使用setter方法任何一個可以更改值,所以需要什麼 這個私有變量?

你的類的公共和受保護的方法形成了導出API,即你與你的類的客戶端用戶指定你的班級做什麼合同的一部分。換句話說,可訪問的方法指定您的課程行爲

yout class的字段形成的狀態。一個階級的國家不需要,也往往不需要依賴合同。換句話說,你班上隱藏的領域構成了你的班級的一部分實施(但不是其行爲或合同)。

請注意,實現的隱藏部分不是合同的一部分,也不是導出的API的一部分。這意味着只要實現繼續服從您導出的API的合同,您就可以隨時更改實現,而不會有違反客戶程序的風險。因此,構成對象狀態的字段應該幾乎總是私有的或私有的。

當你公開你的領域時,所有這些都會改變。在這種情況下,客戶端可以直接訪問您的類的狀態,所以現在它成爲導出的API的一部分。公開發布字段會使您的實現成爲您合同的一部分,因此現在您不再可以自由地對該部分進行任何更改。只要您的課程存在,您就必須繼續支持該公共變量。

0

使得可變private

比方說,你bankBalanceprivate變量,checkBalance()public方法,該方法是調用一個公共的getter方法getbankBalance()bankBalance的點。 現在通過這樣做,我可以撥打電話checkBalance(),這將調用getbankBalance()函數並讀取bankBalance的值。我只能通過公共方法只讀訪問敏感數據。

現在,如果變量bankBalancepublic任何函數可以訪問和更改您的銀行存款餘額的價值,我可以檢查packageName.ClassName.bankBalance變量,然後我可以改變這個變量爲0

值爲了提供我們需要的讀/寫訪問權限,以便創建變量private, protected

因此需要在公共方法中使用私有變量。

希望這是很好的解釋。

+1

checkBalance()是公共權利嗎?每個人都可以訪問,所以它有什麼用處。每個人都可以使用class的實例調用checkBalance()方法,並且可以輕鬆獲取bankBalance的值。所以這是如何有用? –

相關問題