interface Rideable {
String getGait();
}
public class Camel implements Rideable {
int weight = 2;
String getGait() {
return " mph, lope";
}
void go(int speed) {++speed;
weight++;
int walkrate = speed * weight;
System.out.print(walkrate + getGait());
}
public static void main(String[] args) {
new Camel().go(8);
}
}
编译完上面的代码后,我遇到了编译错误,与getGait()
方法的访问修饰符有关。请解释一下,为什么我应该使用getGait()
访问修饰符声明public
?
答案 0 :(得分:5)
getGait()
的{p> Camel
实现了Rideable
接口的方法。默认情况下,所有接口方法都是public
(即使您未在接口定义中明确指定),因此所有实现方法也必须公开,因为您无法降低其可见性界面方法。
答案 1 :(得分:3)
在界面中,您将方法getGait()
声明为public
。即使你没有在公共接口中声明一个方法作为公共方法。
但是在你的课堂上,你已将此方法声明为package private。这是不允许的,因为它降低了实现的方法的可见性。
避免这个问题。要么在您的类中将此方法声明为public,要么删除您的类使用此方法签名实现接口的声明(implements Rideable
)。
答案 2 :(得分:0)
根据面向对象的基础,接口只包含公共方法。所以当你实现接口时,你应该将它声明为public,否则它会给你编译时错误。
感谢。
答案 3 :(得分:0)
在Interface中,字段隐式public static final
,界面中的方法默认为public
。
请阅读继承规则:
http://www.codejava.net/java-core/the-java-language/12-rules-of-overriding-in-java-you-should-know
其中一个说,“重写方法必须没有更严格的访问修饰符”。所以你要在getGait()
课程中考虑Camel
。如果您没有在类的方法中提供访问修饰符,则默认为default
。这意味着您将访问修饰符限制在public
到default
。因此打破了ovveriding的规则,这就是为什么它抱怨。
答案 4 :(得分:0)
接口的一个基本用法是检查一致性。例如,实现Comparable
接口的类必须提供compareTo
方法,因此提供了一种比较类对象的机制。
这些方法公开的原因是有意义的是,任何利用这种一致性的类都必须能够不受任何限制地使用这些方法。例如,Arrays
类的排序方法足以对类的对象进行排序它实现Comparable
并公开compareTo
方法(如果那就是你想要为排序提供的机制。当然Comparator
也在那里)。简而言之,如果在接口的情况下它的可读性或可用性(因此使方法public
势在必行),合同就足够好了。