【问题标题】:overriding methods in Interface java接口java中的重写方法
【发布时间】:2014-08-06 12:58:53
【问题描述】:

我用 Java 写了一个接口。 之后,我尝试通过覆盖来实现它,如代码所示。 但我收到错误,我必须在方法之前添加 public。

为什么我必须添加 public ?为什么没有公开它不起作用?

正如 Net-Beans 所说:“试图分配较弱的访问权限;是公开的”

代码:

    package tryinginterface;
interface Bicycle {

    //  wheel revolutions per minute
    void changeCadence(int newValue);

    void changeGear(int newValue);

    void speedUp(int increment);

    void applyBrakes(int decrement);
}


class ACMEBicycle implements Bicycle {

    int cadence = 0;
    int speed = 0;
    int gear = 1;
    @Override 
        void changeCadence(int newValue) {
         cadence = newValue;
    }
    @Override
    void changeGear(int newValue) {
         gear = newValue;
    }
    @Override
    void speedUp(int increment) {
         speed = speed + increment;   
    }
    @Override
    void applyBrakes(int decrement) {
         speed = speed - decrement;
    }
    @Override
    void printStates() {
         System.out.println("cadence:" +
             cadence + " speed:" + 
             speed + " gear:" + gear);
    }
}

【问题讨论】:

标签: java netbeans


【解决方案1】:

接口中的所有方法都是公共的。

类中没有可见性修饰符的所有方法都是包私有的。

您不能将公共方法的可见性降低到包私有,因为它违反了接口。

【讨论】:

  • 没错。如果您觉得有帮助,您可以将接口中的所有方法更改为 public void - 这样更清楚的是,实现方法也应该是 public void
  • 这有点傻。接口和类中的隐式可见性不一样,它总是困扰着我。对于隐含 public static final 的字段也是如此(甚至更糟)
  • @njzk2 我不能明确地说方法/类是包私有的,这让我很恼火。我必须省略声明。我的强迫症很刺痛。
【解决方案2】:

因为在一个接口中,所有方法默认都是public,而在一个类中,方法的默认可见性是"friend"——在同一个包中可见。

实现方法时不能缩小可见性,这是​​规则。

【讨论】:

  • "friend" 在 Java 中被称为包私有。
【解决方案3】:

假设你有一个 Printable 接口,它包含一个方法 print()。

interface Printable{
   int MIN=5;
   void print();
}

现在因为方法是在 interface 中声明的,编译器会在方法之前隐式添加 public abstract。 像这样 :- interface for compiler

现在方法被声明为 public ,所以现在当你扩展方法时,你必须在方法之前添加 public 。

我认为这可能会对你有所帮助。

【讨论】:

    猜你喜欢
    • 2019-03-04
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 2017-03-26
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多