Public vs. Protected abstract class method 
将包访问级别抽象类的非静态方法设为公共方法与将其设为受保护方法相比,是否存在安全性/访问差异?只有来自扩展抽象类的同一包中的类才能访问非静态方法,对吗?那么,这些非静态方法是公共的还是受保护的,这是否重要,因为抽象类本身对谁可以扩展它进行了限制?
| 12
 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");
    }
} | 
		
		
- 我不这么认为。我很肯定,我理解它们之间的区别是基于在Oracle文档中找到的定义,我的问题是关于一个特定的案例,在这个案例中,类的访问级别使方法的访问级别毫无意义(除了private)。不过,我可能误解了。
 
	 
由于无法访问protected abstract method,因此可以在其他包中访问public abstract method。请检查下面的示例。
同时具有公共和受保护的抽象方法的抽象类
| 12
 3
 4
 5
 6
 
 | package package1;
public abstract class MyClass {
  abstract protected String  method1();
  abstract public String  method2();
} | 
另一个扩展类并实现抽象类的包。
| 12
 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";
  }
} | 
用于访问抽象方法的主类。
| 12
 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());
  }
} | 
		
		
- 你的例子有点不同。你的抽象类是public。然而,我的抽象类具有"无修饰符"访问级别。所以,无论如何,它不能被包外的类扩展。
- @凯尔是的,那是真的。它将无法在定义的包之外访问。然后,受保护或公共方法甚至不会出现在图片中,因为它不能扩展到包外部。
- 2年后,我在重新阅读我的问题lol,我发现在这个例子中,方法的访问级别是什么确实很重要。考虑到上面的示例,即使那些"其他类"与子类不在同一个包中,也可以由实例化子类的其他类在子类上调用public方法。另一方面,包外部的类永远无法调用受保护的方法。