2010-04-15 44 views
9

在java中,public/private/other方法的含義是什麼?
這些選項的優點和缺點是什麼?
作爲一個想成爲一名優秀程序員的人,我的動力是什麼?在java中,public/private/other方法的含義是什麼?

+9

孫教程:http://java.sun.com/docs/books/tutorial/ java/javaOO/accesscontrol.html – BalusC 2010-04-15 16:50:35

+0

我接下來是教程或基本的OOP教程。在數據封裝/訪問方面,所有OO語言的概念都是相同的。 – 2010-04-15 16:52:25

+0

OOP代表什麼? – David 2010-04-15 16:55:25

回答

13

當一個方法是公共這意味着它可以被其他的對象

例如被訪問:

class David { 
    // public method, can be use by anyone 
    public String getName() { 
     return "David"; 
     } 
} 

方法getName可以通過其它類,因爲它是公共的訪問:

class Other { 
     David davidOne = new David(); 
     String davidsName = davidOne.getName(); //<-- compiles and runs 
} 

好處..好,你可以從其他地方使用它。

當一個方法是私人這意味着它只能通過同一類

例如對象被訪問,在這個新的定義:

class David { 
    public String getName() { 
     return "David"; 
    } 
    // private method... nobody but David's "instances" can use it.. 
    private int getAge() { 
     return 19; 
    } 

} 

方法getAge可以」由其它類訪問,因爲它是私有的,如果你嘗試這樣做,編譯器會給你一個錯誤信息:

class Other { 
     David davidOne = new David(); 
     String davidsName = davidOne.getName(); 
     int davidsAge = davidOne.getAge(); //<-- Compiler error, getAge() is not visible 
} 

但是,如果你能大衛類中使用它

class David { 
    public String getName() { 
     return "David"; 
    } 
    // private method... nobody but David's "instance" can use it.. 
    private int getAge() { 
     return 19; 
    } 
    // Here the call to "getAge()" will succeed, because it is visible 
    // inside the class 
    public boolean hasSameAgeAs(David otherDavid) { 
     return this.getAge() == otherDavid.getAge(); 
    } 
} 

的優勢在哪裏?您可以創建一堆的方法,讓他們私有,避免數據損壞或一般保護你的對象encapsulated

關於封裝

OOP(面向對象編程)的目的是爲了以後真正的軟件模型生活對象。

真實生活對象具有(除別的之外)訪問這些屬性的屬性和方法。

你想公開一些這些方法,並保持私人其他。

例如,一個人類有一顆心。但它不會暴露給每個人,這將是危險的。在我們身體內部是封裝

如果我們是一個真正的後,軟件模型,我們可以宣佈的方法:heartBeat爲私有(所以,沒有人可以訪問它)

在另一方面,這將是非常有用的來public方法如getGender找出您的實例是男性還是女性。

還有其他接入改性劑如:「受保護」和保護的包(其不具有關鍵字)

class David { 
     // protected method 
     protected int getBalance() { 
      return 1000000; 
     } 
     // package protected or "default" method 
     boolean knowsOop(){ 
      return true; 
     } 
} 

有所述方法getBalance只能通過David實例和David子類accesed(創建用於什麼是子類的另一個線程)

方法knowsOop可以由包中的任何人按照David的定義進行訪問。

不要擔心這兩個訪問修飾符,當您瞭解有關OOP和Java的更多內容時,它們將有意義。

最後,你要真的,真的需要時間來閱讀:

http://java.sun.com/docs/books/tutorial/java/javaOO/index.html

我希望這有助於

0

被稱爲封裝的主要原因是:不允許訪問對象的內部狀態。

+0

你能否詳細介紹一下? – David 2010-04-15 16:55:10

+0

對象可能有狀態;例如,它可能具有可變前景和背景顏色的屬性。該狀態將作爲某種類型的變量的值保存在對象中。實施者可能希望規定對顏色如何變化的限制(例如,兩種顏色可能不相同)。如果變量是公開的並且可以直接訪問,那麼用戶可能違反條件(又稱不變),將對象轉換爲意料之外的/非法的狀態。實現者可以使變量保密,並通過公共方法允許有效的變異。 – 2010-04-15 17:27:01

1

HThe public,protected和private修飾符控制其他代碼可以看到這些方法(或字段)的內容。這是關於控制你正在暴露的界面。

的很常用的有:

public修飾符:任何其他可以看到你的方法。

私人修改:沒有代碼,除了你的類和任何內部類可以看到你的方法。

例如,如果您想確保創建的類只有一個實例(singleton pattern),這些將很有用。你可以使構造私人,創建一個單一的實例和存儲作爲一個私有成員稱爲實例,並提供一個公共的方法是這樣的:

public static MyObject getInstance() { 
    return instance; 
} 

,所以你能保證將只有每一個是一個實例。


更新 - 請求的另一個示例。

另一個例子可能是你有一個複雜的公共方法,你想把它分解成更簡單的部分。你可以把它分解成簡單的方法,每個方法都是完成工作的一部分,但你不希望其他代碼調用這些方法,因爲它們不會自己工作 - 所以你可以使小方法保密,確保他們不能在你的班級以外被調用。

+0

您能否詳細瞭解實用性? – David 2010-04-15 16:59:23

+0

不能調用多次MyObject嗎?這不會導致創建類的多重實例嗎? – David 2010-04-15 17:03:13

+0

否 - 調用MyObject.getInstance()不會創建新實例,它只會返回已創建的實例。重複的調用將繼續返回相同的實例。 – Brabster 2010-04-15 17:04:59

1

Private方法只能在類中調用。您可以撥打電話public您的課程在任何地方的方法。沒有訪問修飾符的方法意味着包的可見性範圍(它被稱爲默認),所以你可以在包中定義類的地方調用它。

http://en.wikipedia.org/wiki/Object_oriented_programming#Encapsulation

+0

我的動力是什麼讓一個方法只能在課堂內部調用? – David 2010-04-15 16:58:22

+0

有時你只有在課堂上需要的方法。它可以是一些轉換功能或任何其他補充的代碼。 – Dmitry 2010-04-15 17:09:26

+1

在公共方法本身中實現通過公共方法公開的功能並不總是可取的。公共方法可能需要調用其他方法來執行其行爲。這些其他方法因此旨在用於內部使用,並應標記爲私人。 – 2010-04-15 17:13:56

5

一個公共方法可以從任何地方訪問,只能從同一類的私有方法。主要優點是對類的API的控制。如果我只公開需要什麼,我可以改變一個類的內部行爲,而不會根據這個類破壞代碼。你應該關心,因爲軟件在現實世界中經常發生變化(至少這是我的經驗,其他人也有這種感覺),每一次變更都會中斷,你需要投入更多的精力或者軟件有更多的錯誤。最後,這是一個成本問題。

從這個類的用戶隱藏你的類的內部以避免以後改變破壞代碼的可能性通常稱爲封裝或information hiding

除了公共和私人的兩個選項是包(沒有修飾符)和保護。程序包可訪問的方法也可以從相同程序包的類中訪問。我不記得以任何有用的方式使用該選項。受保護的方法可以從類中進行訪問,這些類繼承了所討論的類。這通常用於爲基類定義的API創建具有具體行爲的類。例如,你可以通過擴展AbstractList來實現一個新的List類,你只需要實現get和size(以及一個可修改列表的set-method)。 List的API公開的其他方法在基類中定義,如果需要的話調用其他三個方法。

0

對於初學者,我會盡可能地開始限制訪問。從private開始。如果你碰巧需要從別的地方的構造函數,方法或字段,但不能訪問它由於限制,那麼下一步將是要問自己:

  1. 如果它是一個方法,你真的需要訪問它?它會改變類/實例的行爲嗎?你不應該讓那個班做這項工作嗎?當前課程(需要該領域或方法)是否不應該爲該課程提供更緊張的體系?
  2. 如果它是一個領域,你需要獲得或設置它的價值?你不應該添加一個方法嗎?

點1避免了錯誤的耦合,點2改善了封裝。一旦你考慮了上述內容並得出結論,確實需要更少的限制,那麼將其設置爲更進一步打開。

相關問題