超级构造函数,如果没有超类?

时间:2014-01-17 08:28:24

标签: java polymorphism

我发现了这样一个类:

public class Computer implements Serializable {

        private static final long serialVersionUID = 1L;    

        //...
        public Computer() {
            super();
        }
        //...
}

有人可以解释一下,这是怎么回事?该类不继承任何超类,仍然可能有“super();”在构造函数中?

5 个答案:

答案 0 :(得分:7)

默认情况下,所有类都继承java.lang.Object。所以你班上的隐藏代码是

public class Computer extends java.lang.Object implements Serializable {

        private static final long serialVersionUID = 1L;    

        //...
        public Computer() {
            super(); //here Object's default constructor is called
        }
        //...
}

如果父类具有默认构造函数(无参数),并且子类定义了默认构造函数,则不需要显式调用父的构造函数。

Java隐式地执行它,换句话说,Java将super()放在子构造函数的第一个语句之前

考虑这个例子

class Base {

    public Base() {
        System.out.println("base");
    }
}

class Derived extends Base {

    public Derived() {
        //super(); call is not necessary.. Java code puts it here by default
        System.out.println("derived");
    }
}

因此,当您创建Derived d = new Derived();时,输出为..

base
derived

答案 1 :(得分:4)

当你没有extends任何类时,默认情况下继承的类是Object,所以它调用Object类构造函数。

答案 2 :(得分:2)

在Java中,Object类位于Class层次结构的顶部。隐含地,所有类都隐式为Object类型。代码中不需要显式调用super()方法。但是,这将在编译器转换为字节码期间由编译器添加。因此,默认情况下,任何构造函数中的第一行都将隐式调用super()。对象的构造包括对超类的默认构造函数的所有调用。但是,您也可以在super构造函数中调用class类的自定义参数构造函数

答案 3 :(得分:1)

默认情况下,每个java类都隐式继承java.lang.Object类。因此,super()将在您的情况下调用Object类构造函数!

答案 4 :(得分:1)

默认情况下,任何类即使我们不扩展任何超类,也会扩展java.lang.Object类。所以它调用Object构造函数。

通过继承概念,我们可以正确编译以下代码。

Object obj = new Computer();

事实上,即使您的interface引用也可以分配给java.lang.Object引用。

interface ICommand 
{

}
class Computer implements ICommand
{

}
class Test
{
    public static void main(String[] arg)
    {
        ICommand ic = new Computer();
        Object obj = ic;  // 'ic' is an interface reference
    }
}

通过这种方式,java.lang.Object也是所有接口的超级接口(这不是确切的技术术语)。