1. 程式人生 > >抽象方法的訪問修飾符

抽象方法的訪問修飾符

抽象方法不能使用private修飾符,也不宜使用預設修飾符(default)

(1)如果使用private修飾符

public abstract class SuperClass {
    /*
     * The abstract method test in type SuperClass can only set a visibility modifier,
     *  one of public or protected
     */
    private abstract void test();//編譯通不過    
}

這裡寫圖片描述

抽象方法必須對子類可見,而private修飾的方法對子類不可見,因此不能使用private修飾符。

(2)如果使用預設修飾符(即不帶修飾符)

package cn;

public abstract class SuperClass {
    //採用package修飾符,可以通過編譯,但是後患無窮
    //該方法,不一定對子類可見,除非子類也在這個包下
    abstract void test();
}
package com;

import cn.SuperClass;

public class SubClass extends SuperClass {
    /*
     * This class must implement the inherited abstract method SuperClass.test(), 
     * but cannot override it since it is not visible from SubClass. 
     * Either make the type abstract or make the inherited method visible
     */
@Override void test() {//編譯出錯 //子類和父類,不在同一個包下,因此不能訪問父類的package方法 } }

這裡寫圖片描述

如果不帶修飾符,那麼就是包內訪問。這種情況下,不一定能保證對子類可見。如果子類和父類不在一個包下面,子類是無法訪問(無法覆蓋)父類的package方法。因此,abstract方法的訪問許可權不應該是包內訪問。

總結:

對於abstract方法,不能使用private修飾符(編譯出錯),不能使用package修飾符(編譯正常,但是不合理,後患無窮),可以使用public和protected,大多數情況下都是使用public。