关于java:公共与受保护的抽象类方法

Public vs. Protected abstract class method

本问题已经有最佳答案,请猛点这里访问。

将包访问级别抽象类的非静态方法设为公共方法与将其设为受保护方法相比,是否存在安全性/访问差异?只有来自扩展抽象类的同一包中的类才能访问非静态方法,对吗?那么,这些非静态方法是公共的还是受保护的,这是否重要,因为抽象类本身对谁可以扩展它进行了限制?

1
2
3
4
5
6
7
8
9
10
11
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");
    }
}


由于无法访问protected abstract method,因此可以在其他包中访问public abstract method。请检查下面的示例。

同时具有公共和受保护的抽象方法的抽象类

1
2
3
4
5
6
package package1;

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package package2;

import package1.MyClass;

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

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

用于访问抽象方法的主类。

1
2
3
4
5
6
7
8
9
10
11
12
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());
  }
}