其次,我们需要继承所有11个Object方法?我很难想象为什么我在I / O中需要它们,例如
最后,JDK 8将在接口中为我们提供默认方法实现,如果这可能会导致Java中的多重继承。
如果接口A为方法a()提供了默认实现,接口B也提供了带有另一个默认实现的a()方法,并且我们的自定义类C实现了两个接口并依赖于默认实现,那么该怎么办呢{{3> }?
答案 0 :(得分:8)
但是如何继承Object和其他任何东西 同时上课?这不是一个多重继承。
不,这不是会发生什么。并非所有类都直接从Object
类扩展。但只有顶级继承层次结构中的类从Object
类扩展(隐式)。层次结构中较低的其余类从Object
类扩展到超类。而且,这就是我们所说的多级继承。
因此,请考虑以下层次结构: -
class A { }
class B extends A { }
在上述情况下,class A
相当于class A extends Object
。
其次,我们需要继承所有11个Object方法?一世 我很难想象为什么我在I / O中需要它们
当您说 inherit 时,我怀疑您的意思是覆盖。您不需要覆盖Object
类的任何方法。只是根据您的要求,是否覆盖任何方法。例如: - 您经常要覆盖equals()
方法,以便为您的实例编写自定义相等性测试。在这种情况下,您还应该覆盖hashCode()
方法,以维持equals()
和hashCode()
的合同。
最后JDK 8将为我们提供默认方法实现 接口以及可能导致多重继承的接口 Java的。
如果接口A提供带有默认实现的方法a(),该怎么办? 接口B还提供了另一个默认实现的a()方法 我们的自定义类C实现了两个接口并依赖于默认值 实现 - 那不是钻石死亡吗?
我不能对这个概念发表评论,因为我还没有读过这个东西。可能会在稍后的某个时候更新答案。
答案 1 :(得分:3)
但是如何继承Object和其他任何东西 同时上课?这不是一个多重继承。
除非另有说明,否则课程会延伸Object
。就是这样:
class A { ... }
相当于:
class A extends Object { ... }
其次,我们需要继承所有11个Object方法?一世 很难想象为什么我在I / O中需要它们,例如
equals()
和hashCode()
用于比较和哈希表。notify()
和wait()
构成了跨线程通信的低级基础。getClass()
是所有反射代码的起点。通过将它们放在Object
上,可以在JVM中的每个对象上使用它们。您可以获取哈希码和任何对象的类,您可以检查任何两个对象之间的相等性,您可以监视并通知任何对象
如果接口A提供带有默认实现的方法a(),该怎么办? 接口B还提供了另一个默认实现的a()方法 我们的自定义类C实现了两个接口并依赖于默认值 实现 - 那不是钻石死亡吗?
正如another question here on SO中解释的那样(实际上只是搜索“jdk8默认方法”):
要解决多重继承,请执行一个实现两个的类 接口提供相同方法名称的默认实现 和签名必须提供该方法的实现。
因此,类必须提供自己的实现,可能委托给其中一个默认方法。
答案 2 :(得分:1)
你对“死亡之钻”是正确的,但是......
这是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中新功能的页面并阅读所有相关内容。我通过Googling“Java 8新功能”到达那里。在http://cr.openjdk.java.net/~briangoetz/lambda/Defender%20Methods%20v4.pdf
找到了我的想法答案 3 :(得分:0)
您从一个继承自object的类继承。 Java不允许您从两个不同的类链继承。但是,解决这个问题的方法是使用接口。
答案 4 :(得分:0)
但是如何继承Object和其他任何东西 同时上课?
你不能这样做,你听错了。
其次,我们需要继承所有11个Object方法?一世 很难想象为什么我在I / O中需要它们,例如
不确定你在这里谈论什么。
如果接口A提供带有默认实现的方法a(),该怎么办? 接口B还提供了另一个默认实现的a()方法 我们的自定义类C实现了两个接口并依赖于默认值 实现 - 那不是钻石死亡吗?
对JDK8一无所知,但你已经可以在两个接口中实现一个具有相同名称/类型签名的方法,这可能是不合逻辑的,但Java允许它。
答案 5 :(得分:0)
首先,所有东西都是Java中的Object或原语,所以这里没有问题。对象是层次结构顶部的类。
目前您可以将多个接口应用于Java - 然后编写您的实现。我想在Java 8中 - 如果你定义了你的界面,那么你就有了实现。如果不是 - 那么使用一些默认值。如果定义了多个默认值(或者该方法由多个接口声明) - 则不使用默认值。它可以很简单。