【问题标题】:Public vs. Protected abstract class method [duplicate]公共与受保护的抽象类方法[重复]
【发布时间】:2016-03-19 13:09:54
【问题描述】:

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

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 文档中的定义了解它们之间的区别,并且我的问题是关于类的访问级别使方法访问级别无意义的特定情况(除了私有)。不过我可能理解错了。

标签: java access-specifier


【解决方案1】:

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

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

package package1;

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

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

package package2;

import package1.MyClass;

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

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

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

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。然而,我的抽象类具有“无修饰符”访问级别。所以,无论如何,它都不能被包外的类扩展。
  • @Kyle 是的,这是真的。在定义的包之外将无法访问它。那么protected或public方法甚至都没有出现在图片中,因为它不能在包之外扩展。
  • 重新审视这个问题,我发现我的评论无关紧要。您的示例是否有一个公开的父类并不重要。即使使用无修饰符的抽象类,实现类仍然可以是公共的,并且与抽象类位于同一个包中,这意味着任何其他类仍然可以通过公共实现类调用抽象类的公共方法。所以你已经完全正确了。再说一次,我的评论无关紧要,哈哈
猜你喜欢
  • 2015-08-02
  • 1970-01-01
  • 2011-05-30
  • 2012-02-13
  • 2017-06-14
  • 1970-01-01
  • 2017-05-05
  • 2015-05-16
  • 1970-01-01
相关资源
最近更新 更多