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中实现的类中的方法也是继承的,就像子类一样。
答案 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 package
和non-subclass
- BOOOOOM
调用的,那么现在会发生什么在运行时崩溃。
这就是为什么不允许这样做。
当您添加额外的checked exception
时,同样的概念适用。编译器会再次阻止你。但是,您可以添加额外的Unchecked Exception
,因为Compiler
会忽略这些内容。
答案 1 :(得分:4)
来自Java Language Specification, §9.4:
接口主体中的每个方法声明都是隐式公共的(第6.6节)。
接口主体中的每个方法声明都是隐式抽象的,因此它的主体总是用分号表示,而不是块。
允许但不鼓励作为样式,为接口中声明的方法冗余地指定公共和/或抽象修饰符。
覆盖或隐藏方法的访问修饰符(第6.6节)必须至少提供与重写或隐藏方法一样多的访问权限...
将这两个部分的规则放在一起,结论是作为接口实现一部分的任何方法必须是public
。
答案 2 :(得分:2)
Java中的接口是其客户端的类的使用合同。所以他们所有的方法都是公开的,你不能对重写方法施加更多限制。