我发现了这样一个类:
public class Computer implements Serializable {
private static final long serialVersionUID = 1L;
//...
public Computer() {
super();
}
//...
}
有人可以解释一下,这是怎么回事?该类不继承任何超类,仍然可能有“super();”在构造函数中?
答案 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
也是所有接口的超级接口(这不是确切的技术术语)。