簡體   English   中英

公共修飾符在包私有類中是多余的嗎?

[英]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.

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