“java中的每个类都扩展了MetaClass对象”这是否意味着每个子类都会导致Diamond问题
这两个事实在java中
事实1
“ 默认情况下,java中的每个类都扩展了java元类Object
”
和
事实2
“ Java中不允许多重inheritance ”在Javainheritance中阅读有关钻石问题的更多信息
很安静,令人困惑
假设ClassB
扩展ClassA
然后根据fact1 ClassB
扩展Object
这是否意味着ClassB
正在扩展ClassA
和Object
? 这是多重inheritance的情况吗?
如果它不是多重inheritance那么这两个陈述怎么不相矛盾呢?
“默认情况下,java中的每个类都扩展了java元类Object”// fact1
每个类都扩展了Object
类, 只有它们不直接扩展任何其他类 。
如果类Test
扩展了另一个Sample
类,那么Test
不会直接扩展Object
类,而是通过超类Sample
inheritanceObject类行为,它直接扩展了Object
类。
感谢您提供事实的来源。 现在我可以进入一些细节。
“Head First Java 2nd edition”在第208页上说:
Java中的每个类都扩展了Object
Class Object是所有类的母亲; 它是一切的超类。
在段落的下面,它说:
你编写的每个类都扩展了Object,你无需说出来。 […]可以把它想象成你写的类看起来像这样:
public class Dog
extends Object
{ }
[…] Dog 已经扩展了一些东西, Canine 。 […]编译器将使Canine扩展Object。
虽然他们试图沟通的一般想法(Java中的每个类都有java.lang.Object
作为超类)是正确的,但他们使用的是错误的术语,而使用Dog
的示例是完全错误的,这导致你的困惑。
我编写了一个Java编译器(用于Java 1.4),我对Java语言规范非常熟悉,所以请耐心等待。
为了certificate术语是“Head First Java”是错误的,我需要引用Java语言规范,这有点技术性。
但首先,我可以给你一个更简单的解释,你怎么看到这个。
更好的定义
Java中的每个类都没有显式
extend
另一个类,它扩展了Object
当你写:
class Canine { }
然后编译器将其表示:
class Canine extends Object { }
但是当你写:
class Dog extends Canine { }
然后编译器会发现您已经显式扩展了一个类,并且没有更改代码的含义。
由于Head First Java第二版基于Java 5,我将使用该Java版本的Java语言规范。
扩展的含义在JLS的8.1.4节中定义:
8.1.4超类和子类
普通类声明中的可选extends子句指定当前类的直接超类。
Super: extends ClassType
如您所见, extends仅指直接超类。 在Head First Java的示例中,Dog不扩展Object,因为它的直接超类是Canine 。 只有Canine扩展了Object。
他们的意思是说Object是Java中所有其他类的超类。 这在JLS第4.3.2节中定义:
4.3.2类对象
Object
类是所有其他类的超类(第8.1节)。Object
类型的变量可以包含对null
引用或任何对象的引用,无论它是类的实例还是数组(第10节)。 所有类和数组类型都inheritance了Object
类的方法,[…]
我担心你会被第一版Java头版第2版中的误导性方式所牵制。 希望已经在新版本中修复了这个问题(如果有人有,请确认/反驳),否则我们应该通知作者。
是的,这两个陈述都是正确的。
确实,java中的每个类都扩展了元类Object
。
仍然ClassB没有多重inheritance,因为在编译时java将Object
Class移动一级。
这样,现在ClassA
现在扩展了Object
而不是ClassB
。
这样, ClassB
没有多重inheritance,因此遵循fact2。
现在ClassB
扩展了ClassA
和ClassA
扩展Object
从而通过MultiLEVELinheritance ClassB extends Object
; 事实1紧随其后