Java - 带接口的受保护修饰符

时间:2012-11-28 06:41:46

标签: 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”在同一个类和子类中很有用。我也不能认为Interface中实现的类中的方法也是继承的,就像子类一样。

3 个答案:

答案 0 :(得分:7)

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

现在,由于接口中定义的方法是默认的 - public(是的,您不需要明确地编写它),因此您无法在实现类时使方法protected。 / p>

原因很直接,当您使用多态时,您可以实例化implementing class并将其引用存储在interface type中。

ICalculator calc = new Calculator();  //valid

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

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

这就是为什么不允许这样做。


当您添加额外的checked exception时,同样的概念适用。编译器会再次阻止你。但是,您可以添加额外的Unchecked Exception,因为Compiler会忽略这些内容。

答案 1 :(得分:4)

来自Java Language Specification, §9.4

  

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

     

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

     

允许但不鼓励作为样式,为接口中声明的方法冗余地指定公共和/或抽象修饰符。

来自JLS, §8.4.8.3

  

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

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

答案 2 :(得分:2)

Java中的接口是其客户端的类的使用合同。所以他们所有的方法都是公开的,你不能对重写方法施加更多限制。