据说,Java语言只支持单继承。然而,如何能够同时从Object和任何其他类继承呢?这不是多重继承吗。
其次,我们为什么需要继承所有11个对象方法?我很难想象为什么我在I/O中需要它们。
最后,JDK8将为我们提供接口中的默认方法实现,这可能会导致Java中的多重继承。
如果接口A为方法a()提供了默认实现,接口B也提供了另一个默认实现的()方法,而我们的自定义类C实现了这两个接口并依赖于默认实现-那不是Diamond of Death吗?
发布于 2013-02-05 01:56:30
然而,如何能够同时从Object和任何其他类继承呢?这不是多重继承吗。
不,事情不是这样的。并非所有类都直接从Object
类扩展而来。但只有继承层次结构顶层的类(隐式地)从Object
类继承而来。层次结构中较低的其余类从Object
类扩展到超类。这就是我们所说的多级继承。
因此,请考虑下面的层次结构:
class A { }
class B extends A { }
在上面的例子中,class A
等同于class A extends Object
。
其次,我们为什么需要继承所有11个对象方法?我很难想象为什么我在I/O中需要它们
我猜你说继承的时候指的是覆盖。您不需要重写Object
类的任何方法。这只是你的需求,是否覆盖任何方法。例如:-你可能经常想要覆盖equals()
方法,以便为你的实例编写自定义的相等性测试。在这种情况下,您还应该覆盖hashCode()
方法,以维护equals()
和hashCode()
之间的协定。
最后,JDK8将在接口中为我们提供默认的方法实现,这可能会导致
中的多重继承。
如果接口A为方法a()提供了默认实现,接口B也提供了另一个默认实现的()方法,而我们的自定义类C实现了这两个接口并依赖于默认实现-那不是死亡之钻吗?
我不能评论这个概念,因为我还没有读过关于这个东西的文章。也许,我会在以后的某个时候更新答案。
发布于 2013-02-05 02:02:46
然而,如何能够同时从Object和任何其他类继承呢?这不是多重继承吗。
除非另有说明,否则类将扩展Object
。也就是说,这个:
class A { ... }
等同于:
class A extends Object { ... }
其次,我们为什么需要继承所有11个对象方法?我很难想象为什么我在I/O中需要它们。
跨线程communication.
getClass()
的底层基础是equals()
和wait()
,它们是所有反射代码的起点。通过将它们放在Object
上,可以在JVM中的每个对象上使用它们。你可以得到任何对象的散列代码和类,你可以检查任何两个对象之间的相等性,你可以监视和通知任何对象。
如果接口A提供了方法a()的默认实现,接口B也提供了另一个默认实现的()方法,而我们的自定义类C实现了这两个接口并依赖于默认实现-那不是死亡之钻吗?
正如another question here on SO中所解释的(从字面上看,只需搜索"jdk8 default methods“即可):
要解决多重继承问题,实现两个接口的类必须为相同的方法名称和签名提供默认实现,必须提供方法的实现。
因此,该类必须提供自己的实现,可能会委托给其中一个默认方法。
发布于 2013-02-05 02:04:54
你说的“死亡之钻”是对的但是..。
这就是D实现接口C和B,而这两个接口又都实现A的情况。此外,在两个或多个接口中定义了一个默认方法。
在Java 8中,他们定义了两个默认方法定义的排序方式。
我记得,如果A和B都定义了一个默认方法,那么D将使用B的版本,因为它在类层次结构中处于较低的位置。
如果B和C都定义了相同的默认方法,那么就会有冲突,D将需要实现方法本身,尽管它可以通过回调在B或C中实现的版本来实现(或者它可以有条件并在不同的情况下使用这两种方法)。
interface A { }
interface B implements A { void m() default {println("In A");} }
interface C implements A { void m() default {println("In B");} }
}
class D implements B, C {
public void m() { println("In D"); B.super.m(); }
}
但是您可以访问Oracle的页面,了解Java 8中的新特性,并阅读所有相关内容。我是通过谷歌搜索"Java 8新特性“找到的。在http://cr.openjdk.java.net/~briangoetz/lambda/Defender%20Methods%20v4.pdf找到了我想要的东西
https://stackoverflow.com/questions/14692537
复制相似问题