Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 公共与受保护的抽象类方法_Java_Access Specifier - Fatal编程技术网

Java 公共与受保护的抽象类方法

Java 公共与受保护的抽象类方法,java,access-specifier,Java,Access Specifier,将包访问级别抽象类的非静态方法公开与保护它们时,安全性/访问性有什么区别吗?只有扩展抽象类的同一包中的类才能访问非静态方法,对吗?那么,这些非静态方法是公共的还是受保护的,因为抽象类本身限制了谁可以扩展它,这有关系吗 abstract class MyClass { protected void myFunction(){ System.out.println("Only child classes can print this"); } } abstract

将包访问级别抽象类的非静态方法公开与保护它们时,安全性/访问性有什么区别吗?只有扩展抽象类的同一包中的类才能访问非静态方法,对吗?那么,这些非静态方法是公共的还是受保护的,因为抽象类本身限制了谁可以扩展它,这有关系吗

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
无法访问。检查下面的示例

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

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());
  }
}

我想不是。我非常确定,根据Oracle文档中的定义,我理解了它们之间的区别,我的问题是关于一个特定情况,即类的访问级别使方法的访问级别变得毫无意义(除了private)。不过我可能误解了。你的例子有点不同。您的抽象类是
public
。然而,我的抽象类有一个“无修改器”访问级别。所以,无论如何,它不能被包外的类扩展。@Kyle是的,这是真的。在定义的包之外将无法访问它。然后,受保护的或公共的方法甚至不出现在图片中,因为它不能扩展到包之外。您的示例是否具有公共的父类并不重要。即使没有修饰符的抽象类,实现类仍然可以是公共的,并且与抽象类驻留在同一个包中,这意味着任何其他类仍然可以通过公共实现类调用抽象类的公共方法。所以你已经完全正确了。再一次,我的评论是无关紧要的,哈哈