Default in Java 8 不会破坏不允许我们进行多重继承的整个想法吗?

Doesn't Default in Java 8 destroy the whole idea of not allowing us to do multiple inheritance?

有人能帮我理解为什么他们会在 Java 8 中添加 Default 以允许实现接口而不是仅仅允许我们在抽象 类 中拥有多重继承吗?仅允许我们扩展多个 类 与允许我们在接口中创建默认方法之间究竟有什么区别?

不,默认不会破坏不允许多重继承的想法,至少不会比接口已经做的更多。重点仍然是接口仅指定 interface(方法签名和 return 值),而 classes 还指定 state 一个对象。默认方法并没有打破这个想法,即默认方法只能访问接口中定义的方法,不能访问任何成员变量(因为接口不能定义成员变量)。

所以关于状态,每个class仍然有一个超级class。但是关于接口,它可以有任意多个超类型。

Can someone help me understand why they would add Default in Java 8 to allow implementation to interfaces instead of just allowing us to have multiple inheritance in abstract classes?

一个重要的原因是超class状态。例如;

class OpticalDrive {

}

class DVDDrive extends OpticalDrive {
    protected int speed = 5;
}

class CDDrive extends OpticalDrive {
    protected int speed = 10;
}

class ComboDrive extends DVDDrive, CDDrive {
    ComboDrive() {
        System.out.println(super.speed); 
        super.speed = 15;
    }
}

在上面的假设示例中 speed 状态变量是多重继承的,读取或修改它会导致必须修改哪个变量的歧义。

What exactly is the difference between just allowing us to extend multiple classes verses allowing us to create Default methods in interfaces?

由于接口不能有可变状态变量,所以最好在接口中使用默认方法,而不是启用抽象 classes 的多重继承。以下示例显示了 Java 8 个接口中的默认方法。

public interface DvdReader {
        default public void read() {
                System.out.println("DvdReader.read()");
        }
}

public interface CdReader {
        default public void read() {
                System.out.println("CdReader.read()");
        }
}

public class ComboReader implements CdReader, DvdReader {
        public void read() {
                CdReader.super.read();
                DvdReader.super.read();
        }

        public static void main(String[] args) {
                new ComboReader().read();
        }
}

在上述情况下,如果您忽略 ComboReader 中的覆盖 read 方法,编译器将报错并报错。

ComboReader.java:1: error: class ComboReader inherits unrelated defaults for read() from types CdReader and DvdReader
public class ComboReader implements CdReader, DvdReader {
       ^
1 error

此外,启用多重抽象 class 继承意味着 Java 代码的语法必须进行重大更改,从而导致 java 向后兼容的能力。