Java - 带接口(interface)的 protected 修饰符

标签 java interface polymorphism

public interface ICalculator {

    public double multi(double a, double b);

    public int add(int a, int b);


    public int sub(int a, int b);
}

public class Calculator extends ICalculator {

    protected int add(double a, double b) {
        return a+b;
    }

    public double sub(int zahl1, int zahl2 ) {
        return a*b;
    }
}

为什么我不能在 Calculator 类中使用 protected 方法? 我的答案是“ protected ”在同一个类和子类中有用吗?好吧,我不能也认为从 Interface 实现的类中的方法也是继承的,就像子类一样。

最佳答案

您不能对子类中重写的方法添加更多限制。同样,您不能对从接口(interface)实现的方法添加更多限制。

现在,由于接口(interface)中定义的方法默认是public(是的,您不需要显式地编写它),因此您无法使您的方法 protected 在实现类中。

原因很简单,当您使用多态性时,您可以实例化您的实现类并将其引用存储在接口(interface)类型中。

ICalculator calc = new Calculator();  //valid

calc.add(1, 2);   // Compiler sees ICalculator method.

现在,当您使用 ICalculator 引用调用 add 方法时,编译器只会看到 ICalculator 中定义的方法,并相应地批准访问。但在运行时,实际调用的方法是 Calculator 类的形式,如果该方法实际上是从 不同的包非子类<调用的,现在会发生什么 -- BOOOOOOM,它在运行时崩溃。

这就是为什么它是不允许的。

<小时/>

当您添加额外的检查异常时,同样的概念也适用。编译器将再次阻止你。但是,是的,您可以添加额外的Unchecked Exception,因为这些编译器会简单地忽略它们。

关于Java - 带接口(interface)的 protected 修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13599276/

相关文章:

c++ - 我正在寻找围绕内置 Perl 函数的 C++ 包装器

c# - 构造函数中的抽象类型而不是具体类型

java - 令人困惑的 Java 多态性

java - 创建的方法,在返回其中的变量时遇到问题

cocoa - 为 NSToolbar 制作 NSToolbar 图标

java - NetBeans 7.0 是否内置了对 spring 3.0 的支持?

pointers - 指向结构的 Nil 指针不深等于 nil?

c++ - jvm如何处理多态及其优化

java - servlet 的 init() 方法有什么用?

java - Eclipse 自动重构字符串比较