为什么this()和super()方法必须在构造方法中首先调用? | Java Debug 笔记

134 阅读1分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

目录

  • 问题
  • 解决

问题

问题:为什么this()和super()方法必须在构造方法中首先调用?

Stackoverflow地址stackoverflow.com/questions/1…

如果你在构造函数中调用this()方法和super()方法,Java要求你必须在一开始就调用他,为什么?

举一个例子:

public class MyClass {
    public MyClass(int x) {}
}

public class MySubClass extends MyClass {
    public MySubClass(int a, int b) {
        int c = a + b;
        super(c);  // 编译器会提示错误
    }
}

Sun编译器提示的错误信息是:

call to super must be first statement in constructor

Eclipse编译器提示的错误信息是:

Constructor call must be the first statement in a constructor

针对上述报错,你可以稍微修改一下代码就能编译通过,修改后的代码如下:

public class MySubClass extends MyClass {
    public MySubClass(int a, int b) {
        super(a + b);  // 编译通过
    }
}

再举一个例子:

public class MyClass {
    public MyClass(List list) {}
}

public class MySubClassA extends MyClass {
    public MySubClassA(Object item) {
        // Create a list that contains the item, and pass the list to super
        List list = new ArrayList();
        list.add(item);
        super(list);  // COMPILE ERROR
    }
}

public class MySubClassB extends MyClass {
    public MySubClassB(Object item) {
        // Create a list that contains the item, and pass the list to super
        super(Arrays.asList(new Object[] { item }));  // OK
    }
}

通过上边的例子,我们可以看出,在调用super()方法之前,编译器并没有阻止你去执行一些逻辑处理。

另外,类似的方法还有this(),也存在对应的使用限制。

编译器这样做,有什么原因呢?

解决

高分回答!

父类的构造函数必须在子类的构造函数之前被调用,这样是为了保证,之后在子类中调用父类的方法时,它们都已经被正确设置了。

尽管这个回答已经赢得了大多数人的支持,但也有不少反对声音。