2014-09-21 63 views
3

這是什麼意思,如果你讓一個類的默認訪問,並標記該類中包含的方法公開?換句話說,如果封閉類無法公開訪問,怎麼能公開訪問方法?默認訪問類中的公共訪問方法..有什麼意義?

+0

也許通過[抽象工廠模式](http://en.wikipedia.org/wiki/Abstract_factory_pattern)或[生成器模式](http://en.wikipedia.org/wiki/Builder_pattern)用於創建實例。 – 2014-09-21 14:25:01

+0

低質量問題:[docs](http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html) – afzalex 2014-09-21 14:26:16

+0

@afzalex,請不要像'低質量問題'這樣的無理評論回答這個問題..看看其他帖子,人們實際上給出了有意義的答案。 – user3516726 2014-09-21 15:13:04

回答

2

在某些情況下可能需要公開方法,例如,當您的具有默認訪問權限的類實現公共接口時。

當您的API根據接口定義並且您的默認訪問類實現了其中一個公共接口時,這非常有用。您的API的用戶可以通過工廠方法實例化您的默認訪問類。

+0

你指出了一件非常有趣的事情。我沒有想到這一點。謝謝。 – user3516726 2014-09-21 14:56:01

+0

還有一個問題。這是唯一的情況下,在默認訪問類中聲明公共方法是有意義的嗎? – user3516726 2014-09-21 15:14:27

+1

@ user3516726這是最常見的情況,也是唯一嚴格要求的情況(我計算在這個類別中實現公共抽象類和非抽象類)。其他情況並不嚴格要求公開的方法,但是您可以選擇繼續使用,以向在您之後維護您的代碼的人強調這些方法旨在供任何有權訪問此類的人使用。 – dasblinkenlight 2014-09-21 17:07:45

2

public當您重寫某些公開方法或實現interface s時經常需要。
我們來看一下Object#equals方法的一個簡單例子。

儘管您的主類有默認範圍,但您不能在覆蓋可見性的同時覆蓋此方法。 所以你需要:public void equals(.......

0

你的意思是這樣的:

package p1; 
class C1 { 
    public void publicMethod() {} 
} 

在另一個包:

package p2; 
import p1.C1; // not allowed 
public class C2 { 
    C1 c1; // not allowed 
    void test() { 
     c1.publicMethod(); // not allowed 
    } 
} 

在繼承的情況下,publicMethod可用於:

package p1; 
public class C2 extends C1 {} 

現在publicMethod能訪問:

package p2; 
import p1.C2; // C2 is public, ok ! 
public class C3 { 
    C2 c2; // C2 is public, ok ! 
    void test() { 
     c2.publicMethod(); // C2 is public, use publicMethod of C1 ! 
    } 
} 

因此,減少一個class可見性對於不應該在包外部直接使用的類型的abtract類是有用的。

+0

你說'如果繼承可以使用publicMethod'。但是如果這個類被聲明爲默認訪問,那麼在它之外的任何方法(甚至是公共的)都可以在包之外訪問。事實上,在包之外,你甚至不能用默認訪問來繼承一個類。 – user3516726 2014-09-21 15:09:51

+0

p1.C2(public)擴展p1.C1(默認)。 p1.C2實例可以在任何包中訪問p1.C1的公共方法。試試看吧。 – 2014-09-21 15:41:10

+0

我覺得有一些誤解。我說的是,默認訪問方法只能從包內部調用,而不能在外部調用。如果你有一個'受保護的'訪問方法,那麼它甚至可以從包的外部被子類調用。 – user3516726 2014-09-21 16:26:04

相關問題