更改java 8默认方法的可见性

时间:2017-12-05 12:58:21

标签: java inheritance java-8 override default-method

我有一个class(说FOO),它有一个default可见性的方法, 如下所示:

void sayHi() {}

现在,如果在扩展I类时覆盖此方法无法降低其可见性。所以我只能使用defaultpublic

public class MyClassTest extends FOO {
    @Override
    // Or I can use public void sayHi()
    void sayHi() {
        System.out.println("Overriden sayHi");
    }
}

现在,如果我使用下面的默认方法在Java 8中编写接口:

public interface InterfaceX {

    // Java-8 defalu method
    default String printName() {
        System.out.println("Interface1 default metod");
        return "Interface1 default metod";
    }
}

现在,如果我在类中重写此方法,则应该在保持重写方法的可见性default时进行编译。

public class Java8InterfaceTest implements InterfaceX{
    @Override
     void printHello() {
        System.out.println("Printing..!");
        Interface1.super.printName();
    }
 }

它说

  

无法降低InterfaceX

中继承方法的可见性

默认情况下,我已经知道interface中的public中的每个方法,但在上面的示例中,我们使用的是default,我认为这是access modifier之一java

我有以下问题:

  1. default中的interfacedefault的可见度不同,这是在未应用访问修饰符时提供的吗?
  2. 如果它有所不同,那么它有何不同?

3 个答案:

答案 0 :(得分:6)

default与默认可见性无关。接口中的default方法是在接口中具有默认实现的方法。

该方法的可见性仍为public

因此,Java8InterfaceTest课程中实施的方法必须具有public可见性:

public void printHello() {
    ...
}

答案 1 :(得分:3)

我认为如果你把你的界面写成:

interface Test {
    default public void go() {

    }
}

这是有道理的。 default方法仍为public;与“默认”可见性无关。

答案 2 :(得分:2)

其他答案很好地勾勒出"句法"你假设默认是一个"可见性"事情。

但是背后有一个概念问题值得专门回答:降低方法的可见性不是声音

请记住:耻骨" API"类或接口声明合同以使客户端代码可以使用。比如:在基类/接口eat()上有一个方法Animal

重点是不同的子类/实现可以提供自己的eat()实现。这样你就可以拥有:

Animal whatever = ...
whatever.eat();

无论...实际创建的内容(可能是CatDogUnicorn) - 调用whatever.eat()都是有效的。

你的想法是说:我想"隐藏"对于特定的子类eat()Donkey。如果你能做到这一点 - 上面的代码突然变得无效。由于whatever.eat()恰好是whatever的实例,Donkey不再是有效通话。

长话短说:阅读Liskov Substitution Principle以了解为什么"带走"公众不是一个好主意 - 完全独立于混合"默认包保护可见性"和 接口中的默认关键字。