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

时间:2017-04-18 06:23:51

标签: java interface scope access-specifier

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

5 个答案:

答案 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。这意味着您将访问修饰符限制在publicdefault。因此打破了ovveriding的规则,这就是为什么它抱怨。

答案 4 :(得分:0)

接口的一个基本用法是检查一致性。例如,实现Comparable接口的类必须提供compareTo方法,因此提供了一种比较类对象的机制。 这些方法公开的原因是有意义的是,任何利用这种一致性的类都必须能够不受任何限制地使用这些方法。例如,Arrays类的排序方法足以对类的对象进行排序它实现Comparable并公开compareTo方法(如果那就是你想要为排序提供的机制。当然Comparator也在那里)。简而言之,如果在接口的情况下它的可读性或可用性(因此使方法public势在必行),合同就足够好了。