为什么我应该将实现的接口方法声明为“public”?

3
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()方法的访问修饰符有关。请解释一下,为什么我应该使用public访问修饰符声明getGait()方法?

你应该阅读这个:https://docs.oracle.com/javase/tutorial/java/concepts/interface.html 和这个:http://stackoverflow.com/documentation/java/102/interfaces#t=201704180625205346952 - Yevhen Danchenko
5个回答

8

CamelgetGait() 实现了 Rideable 接口的一个方法。所有接口方法默认都是 public(即使你在接口定义中没有显式指定),因此所有实现方法也必须是 public,因为你不能降低接口方法的可见性。


3
在接口中,您有名为getGait()的方法声明为public。即使您在接口中没有将方法声明为公共方法,它也是公共的。
但是在您的类中,您将此方法声明为包级私有。这是不允许的,因为它会降低实现的方法的可见性。
为避免此问题,请在您的类中将此方法声明为public,或删除该类实现具有此方法签名的接口的声明(implements Rideable)。

@Rafeal Osipov,你能帮我理解JUnit的功能需求和非功能需求吗? - Akhil Vijayan
@AkhilVijayan,我不明白你的问题。请详细说明。 - user784540

0
根据面向对象的基本原则,接口只包含公共方法。因此,当您实现接口时,应将其声明为公共的,否则会在编译时出现错误。
谢谢。

0

接口的基本使用之一是用于检查一致性。例如,实现 Comparable 接口的类必须提供 compareTo 方法,从而提供了一种比较该类对象的机制。 这些方法之所以是公共的,是因为任何利用此一致性的类都必须能够在没有任何限制的情况下使用这些方法。例如,如果一个类实现了 Comparable 并暴露了 compareTo 方法(如果这是您想要提供的排序机制),则 Arrays 类的 sort 方法足以对该类对象进行排序。当然还有 Comparator。总之,在接口方面,只有可读或可用的契约才足够好(因此使方法 public 成为必要条件)。


-1
在接口中,字段默认为public static final,接口中的方法默认为public
请阅读继承规则:

http://www.codejava.net/java-core/the-java-language/12-rules-of-overriding-in-java-you-should-know

其中一个提示是,“重写方法不能具有更严格的访问修饰符”。因此,您正在覆盖Camel 类中的getGait()方法。如果您在类的方法中未提供访问修饰符,则默认为default。这意味着您将访问修饰符从public限制为default。因此,违反了重写规则,这就是为什么出现错误提示的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接