2016-11-28 43 views
1

当我创建一个新的类,它是Java中的每个子类都从两个类(Object及其超类)继承?

ClassA extends Object{ 
} 

所以,如果我有从的ClassA ClassB的继承,那岂不是

ClassA extends Object extends ClassB { 
} 

这基本上是多重继承,是不是允许在Java中。

或者对于Object类有一个特殊的例外,这意味着它确实可以安全地说,Java中的每个基类继承了两个类

+3

多继承有两个直接的超类。相反,这是一个类层次结构,其中'B'扩展'A',继而扩展'Object'。 –

+0

Object的唯一特殊例外是:“extends子句不能出现在类Object的定义中,或者发生编译时错误,因为它是原始类,并且没有直接的超类。” (来自[JLS Sec 8.1.4](https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.4)) –

回答

8

这将是ClassA继承自继承自Object的ClassB。

这不是多重继承。这是单一继承。单继承给你的排序链的:

Object -> ClassB -> ClassA 

多重继承让你做更多的树:

Object -> ClassB \ 
        ---> ClassA 
Object -> ClassC/

Java并不让你做后者。你可以得到最接近的是实现多个接口。

注意,这仍然是OK(单继承),因为每类最多有一个直接基:

    /--> ClassC 
Object -> ClassB - 
        \--> ClassD 

另外,回答你直接的问题,JLS 8.1.4 states(重点煤矿):

给定一个...类声明...类类型C ...的直接超类是如果存在extends子句,则在C的声明的extends子句中给出的类型,否则为Object。

也就是说,它仍然是单一继承。如果你有一个extends那么这就是基类,否则基数是Object。在你的例子中,ClassA没有Object作为直接基地


你也可以尝试一下自己。 Check out this example

static class ClassB { 
} 

static class ClassA extends ClassB { 
} 

static void printHierarchy (Class<?> clz) { 
    if (clz != null) { 
     System.out.println(clz.getSimpleName()); 
     System.out.print("inherits from: "); 
     printHierarchy(clz.getSuperclass()); 
    } else { 
     System.out.println("nothing"); 
    } 
} 

public static void main (String[] args) { 
    printHierarchy(ClassA.class); 
} 

输出:

ClassA 
inherits from: ClassB 
inherits from: Object 
inherits from: nothing 
1

Java不支持多重继承。相反,你所描述的是一个阶级阶层。 Java中没有明确扩展类的所有类扩展为Object。但是,如果类A延伸B,那么它不直接延伸Object。因为B直接延伸Object,A仍然是子类Object(因为在你可以做Object a = new A()没有任何问题),但它不是一个直接的子类。

+0

@Andreas我并不打算至。我会编辑我的答案。谢谢。 –