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 向后兼容的能力。
有人能帮我理解为什么他们会在 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 向后兼容的能力。