搜尋

首頁  >  問答  >  主體

java - 为什么接口的方法的访问修饰符只能是public不能是protected?

为什么抽象类的方法的访问修饰符可以是public和protected,而接口的方法的访问修饰符只能是public?

或者说,

接口的方法的访问修饰符为什么不能是protected?

PHP中文网PHP中文网2887 天前1067

全部回覆(5)我來回復

  • PHPz

    PHPz2017-04-17 17:34:01

    個人推測:

    • 語言的設計者可能覺得這增加了interface的access model的複雜度。

    • 負責實現介面的class的會很為難,如果implementation和interface不在一個package下面,你該不該implement一個protected method呢?

    下面我用2個實例說明,第一個讓你覺得protected interface method不太make sense。另一個讓你覺得,它就完全不make sense。

    比如說,在sample.interface这个包下面有一个ISomething

    package sample.interface;
    interface ISomething {
      protected foo1() { ... }
    }

    下面的case就怪怪的。

    package a.place.of.nowhere;
    // some code tries to use ISomething
    ISomething someting = initializeSomething();
    
    something.foo1();   // 抱歉,foo1是被保护的,和你不是一个package的,你滚吧。
    // ME: shit... if I cannot use anything of this interface, why the heck you expose this interface to me...

    更不make sense的:

    package a.place.of.nowhere;
    // some code tries to implements ISomething
    class SomethingImpl implements ISomething {
       // 抱歉,尽管你想implement foo1这个接口方法,但是由于你在a.place.of.nowhere这个package,foo1()对你是不可见的。走人吧。
       protected void foo1() {...}

    如此一來,class implement和interface就要在一個package下面。這是什麼鬼啊,我可能要實現多個interface,又不能分身。 。 。

    回覆
    0
  • 阿神

    阿神2017-04-17 17:34:01

    介面更多的是在系統架構設計方法發揮作用,主要用於定義模組之間的通訊契約。
    而抽象類別在程式碼實作方面發揮作用,主要用於實作程式碼的重用。

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 17:34:01

    Abstract 和interface 用的場合不一樣,前者在繼承參數的前提下override,但目標都是它的直接或間接父類,protected權限是可以的。而interface通常用於不同類別中的回調,例如listener,如果是protected 權限那麼即便得到listener 實例也無法獲得它的方法,那麼回調本身也就沒有了意義。
    一點個人見解,如有錯誤請指出

    回覆
    0
  • 迷茫

    迷茫2017-04-17 17:34:01

    介面是什麼?介面寫作interface,是給外界互動用的,你寫成protected還怎麼跟外界互動?

    介面用來規約,傳入的某個物件必須實作某些方法,如果實作的方法不可調用,那麼這個規約還有啥意義?反正也調用不到,穿啥對像不都一樣嘛。

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 17:34:01

    介面是用來實現的,是外人,不是繼承關係的,不是直系親屬,如果currency money=1^n,不能給他一份錢,他也享受不到。
    protect對於繼承的子類別可見,是自己人, money就都繼承給他吧。
    如果介面搞成protect, 那不是二奶就是小三,非法的。

    回覆
    0
  • 取消回覆