Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中用相同的方法名分别实现和扩展接口和抽象类_Java_Java 8 - Fatal编程技术网

在java中用相同的方法名分别实现和扩展接口和抽象类

在java中用相同的方法名分别实现和扩展接口和抽象类,java,java-8,Java,Java 8,我试图理解默认方法如何在各种场景中处理菱形问题这是一个我无法理解的场景。 以下是说明, 1.与默认方法()的接口 2.具有方法()的抽象类 3.实现上述接口并扩展抽象类的具体类 interface Interface { default void method() { System.out.println("Interface method"); } } abstract class AbstractClass { void method() {

我试图理解默认方法如何在各种场景中处理菱形问题
这是一个我无法理解的场景。

以下是说明,
1.与默认方法()的接口
2.具有方法()的抽象类
3.实现上述接口并扩展抽象类的具体类

interface Interface {
    default void method() {
        System.out.println("Interface method");
    }
}


abstract class AbstractClass {
    void method() {
            System.out.println("Abstract class method");
    }
}


// Concrete class definition first starts
public class ConcreteClass extends AbstractClass implements Interface {

    @Override
    public void method() {
        super.method();
    }

    public static void main(String[] args) {
        Interface test = new ConcreteClass();
        test.method();
    }
}
// Concrete class definition first ends

// Concrete class definition Second starts
public class ConcreteClass extends AbstractClass implements Interface {

    public static void main(String[] args) {
        Interface test = new ConcreteClass();
        test.method();
    }
}
// Concrete class definition Second ends
我的疑问,

1.为什么定义一开始总是以“抽象类方法”的形式给出输出,即使我将接口类型用于具体的类对象
2.为什么第二个定义不编译
若编译器首先在定义中使用抽象类实现,那个么它应该能够确定它将始终在第二个定义中使用抽象类实现

这种行为让我很困惑,非常感谢您的帮助。 否则,我越深入研究这个问题,它就越令人困惑


编辑1:

第二个定义中的编译错误是“继承的方法AbstractClass.method()无法在接口中隐藏公共抽象方法”

默认方法只是:默认值。如果有实现,将使用它。如果没有,将使用默认值。这里没有菱形问题(但是可以有多个默认值)

(一)


2) 抽象类给出名为
method
包私有访问的方法;接口要求它是公共的。

默认方法就是:默认值。如果有实现,将使用它。如果没有,将使用默认值。这里没有菱形问题(但是可以有多个默认值)

(一)


2) 抽象类给出名为
method
包私有访问的方法;接口要求它是公共的。

(1)“即使我将具体的类对象强制转换为接口”,您所说的强制转换是什么意思?(2) 你得到了什么编译错误(它应该包含为什么部分的答案)?添加了编译错误。可能重复(1)“即使我将具体的类对象转换为接口”你所说的转换是什么意思?(2) 您得到的编译错误是什么(它应该包含为什么部分的答案)?添加了编译错误。可能是@dSanders的重复,特别是关于(1),AbstractClass为method()指定了一个覆盖默认接口::method的实现。抽象类的任何子类都将调用AbstractClass::method,除非所述子类通过依次定义subclass::method来覆盖它。好的,所以默认方法被用作方法定义的最后手段。“抽象类提供名为method package private access的方法;接口要求该方法为public。”我没有得到这一点。如果您有接口,则无论是否添加
public
关键字,该方法都是隐式公共的。抽象类中的方法不是公共的。它是在默认访问级别(包专用)定义的。问题是私人包裹比公共包裹更具限制性。哦,我明白了。因此,编译错误即将出现,因为抽象类使方法更具限制性,如果我将其方法公开,则不会出现编译错误。感谢您的澄清。@dSanders特别针对(1),AbstractClass为method()指定了一个实现,该实现覆盖了默认接口::method。抽象类的任何子类都将调用AbstractClass::method,除非所述子类通过依次定义subclass::method来覆盖它。好的,所以默认方法被用作方法定义的最后手段。“抽象类提供名为method package private access的方法;接口要求该方法为public。”我没有得到这一点。如果您有接口,则无论是否添加
public
关键字,该方法都是隐式公共的。抽象类中的方法不是公共的。它是在默认访问级别(包专用)定义的。问题是私人包裹比公共包裹更具限制性。哦,我明白了。所以编译错误来了,因为抽象类使方法更加严格,如果我将其方法公开,就不会有编译错误。谢谢您的澄清。