Public 与受保护的抽象 class 方法

Public vs. Protected abstract class method

将包访问级别抽象化 class 的非静态方法 public 与将它们保护起来有什么 security/access 区别吗?只有扩展抽象 class 的同一个包中的 classes 无论如何都可以访问非静态方法,对吗?那么,这些非静态方法是 public 还是受保护是否重要,因为抽象 class 本身对谁可以扩展它施加了限制?

abstract class MyClass {
    protected void myFunction(){
        System.out.println("Only child classes can print this");
    }
}

abstract class MyClass {
    public void myFunction(){
        System.out.println("Still, only child classes can print this");
    }
}

public abstract method 将可以在另一个包中访问,而 protected abstract method 无法访问。检查下面的示例。

抽象 class 同时具有 public 和受保护的抽象方法

package package1;

public abstract class MyClass {
  abstract protected String method1();
  abstract public String method2();
}

扩展 class 并实现抽象 class 的另一个包。

package package2;

import package1.MyClass;

public class MyClassImpl extends MyClass {
  @Override
  protected String method1() {
    return "protected method";
  }

  @Override
  public String method2() {
    return "public method";
  }
}

Main class 用于访问抽象方法。

package package2;

import package1.MyClass;

public class MainClass {
  static MyClass myClass = new MyClassImpl();

  public static void main(String[] args) {
    System.out.println(myClass.method1());   // This is compilation error.
    System.out.println(myClass.method2());
  }
}