0
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;
    }
}

为什么我不能在类计算器中使用受保护的方法?我的回答是“受保护”在同一类和子类中是否有用。好吧,我难道不认为接口实现的类中的方法也被继承,就像子类一样。

4

3 回答 3

7

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

现在,由于默认情况下定义在接口中的方法 - public(是的,您不需要显式编写它),因此您不能protected在实现类中使用您的方法。

原因很简单,当您使用多态性时,您可以实例化您的implementing class并将其引用存储在interface type.

ICalculator calc = new Calculator();  //valid

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

现在,当您add使用引用调用方法时ICalculator,编译器只会看到定义在 中的方法ICalculator,并相应地批准访问。但是在运行时,调用的实际方法是表单Calculator类,现在发生的情况是,如果该方法实际上是从 adifferent packagenon-subclass--调用的BOOOOOM,它会在运行时崩溃。

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


当您添加额外的checked exception. 编译器会再次阻止你。但是,是的,您可以添加一个额外的Unchecked Exception,因为这些只是被Compiler.

于 2012-11-28T06:45:27.817 回答
4

来自Java 语言规范,§9.4

接口主体中的每个方法声明都是隐式公共的(第 6.6 节)。

接口主体中的每个方法声明都是隐式抽象的,因此它的主体始终由分号表示,而不是块。

允许但不鼓励为接口中声明的方法冗余地指定 public 和/或 abstract 修饰符。

并来自JLS,§8.4.8.3

覆盖或隐藏方法的访问修饰符(第 6.6 节)必须提供至少与覆盖或隐藏方法一样多的访问...

将这两部分的规则放在一起,得出的结论是,作为接口实现一部分的任何方法都必须是public.

于 2012-11-28T06:52:26.683 回答
2

Java 中的接口是其客户端的类的使用契约。所以他们所有的方法都是公开的,你不能对被覆盖的方法施加更多的限制。

于 2012-11-28T06:48:39.083 回答