[英]Is the public modifier redundant inside a package private class?
假設我在包com.test
中的Test.java中聲明了一個類Test:
class Test {
public void test() {
}
}
我想知道,這里方法test()
的公共訪問修飾符不是多余的嗎? 因為intellij沒有給我一個提示,說它是。
我認為只有當Test
類包含public static void main(String[] args) {}
時,我才是多余的?我是對還是錯?
這不是多余的。 如果你有一些衍生類,那么修飾符會產生巨大的差異。 考慮這些課程:
package ex.one
class Test {
public void testPublic() {
}
void testPackage() {
}
}
和另一個派生Test.class的類
package ex.one
public class TestDerivate extends Test {
private void doSomething(){
//legal
testPublic();
testPackage();
}
}
現在,當我們有另一個派生TestDerivate.class的類時,您可以在方法上看到不同的行為。 在這種情況下,此類具有公共修飾符。
package ex.two
public class TestDerivateInOtherPackage extends TestDerivate {
public void test(){
// legal
testPublic();
//illegal since it is only package visible
testPackage();
}
@Override
public void testPublic() {
// still legal
}
@Override
void testPackage() {
// still illegal
}
}
任何類都可以實現一個接口 。 后者包含始終public
的方法聲明。 此外,您無法降低界面方法的可見性。
因此,必須可以在非公共類中聲明public
方法。
這並不是多余的,因為如果你在包外面有一個Test
類型的對象,那么public
修飾符可以使方法可見,即使類本身不是。
在實踐中,這是非常罕見的。 作為一個例子,如果你有另一個類Test2
(在同一個包中)從Test
擴展並且它本身就是一個公共類,那么public
修飾符或缺少它會影響包外的代碼是否可以調用對象的test()
類型Test2
。
另一個更常見的情況是,如果Test
實現了一個接口; 然后該方法必須是public
,同樣允許方法本身在包外可見,其中類本身可能不可見但接口可能是。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.