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

Meh*_*lik 2 java inheritance overriding java-8 default-method

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

void sayHi() {}
Run Code Online (Sandbox Code Playgroud)

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

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

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

public interface InterfaceX {

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

现在,如果我在类中重写此方法它应该编译,如果保持重写方法的可见性default.

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

它说

无法从InterfaceX降低继承方法的可见性

我已经知道,在每一个方法interfacepublic默认,但在上面的例子中,我们使用default,我认为是一个access modifierjava.

我有以下问题:

  1. defaultinterface不同default的可见性没有被施加访问修饰符时提供?
  2. 如果它不同那么它有什么不同?

Era*_*ran 6

default与默认可见性无关.甲default在接口方法是具有界面内的默认的实现方法.

该方法的可见性仍然存在public.

因此,在您的Java8InterfaceTest类中实现的方法必须具有public可见性:

public void printHello() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • @MehrajMalik我没有说Java中没有默认的可见性.我说默认可见性没有关键字,因此与`default`关键字无关. (2认同)
  • @MehrajMalik:你似乎对所有Java关键词在英语中都有字面含义的事实感到困惑.还有"默认构造函数"的概念,它与`default`关键字完全无关.此外,在许多规范中找到的"默认行为"与所述关键字无关.与注释默认值不同,注释默认值使用`default`关键字但仍然与`default`方法无关. (2认同)