[Java] 笔试题 - 构造函数考点

针对构造函数相关考点的笔试题:

class CD {

    int r;

    CD(int r) {
        this.r = r;
    }
}

class DVD extends CD {

    int c;

    DVD(int r, int c) {
        // line n1
    }
}

And given the code fragment:

DVD dvd = new DVD(10, 20);

Which code fragment should you use at line n1 to instantiate the dvd object successfully?

A:
super.r = r;
this.c = c;

B:
super(r);
this(c);

C:
super(r);
this.c = c;

D:
this.c = r;
super(c);

问题:第n1行应该使用哪个代码片段成功实例化dvd对象?

知识点明确:

1:构造函数不能被继承,只是调用而已。

2:如果类中创建了有参构造函数后,系统就不再有默认无参构造函数。如果没有任何构造函数,系统会默认有一个无参构造函数。

3:父类如果没有创建构造函数(没有显示的创建有参和无参构造函数,系统默认有一个无参构造函数),子类可以不写构造函数(可以理解为:子类的系统默认构造函数,默认调用了super();)

4:如果父类没有无参构造函数,有且只创建了有参构造函数,

创建子类时,不能编译,除非在构造函数代码体中第一行,必须是第一行显式调用父类有参构造函数,即super(参数名)。

 

针对该知识点,

因为父类CD类中不存在「CD()」这样的无参构造函数,因此如果不修改 line n1,一定会出现编译错误。

所以答案一定需要符合如下的 code:

DVD(int r, int c) {
    super();
}

答案A:没有使用super或者this来调用别的构造方法,无法解决编译错误

答案B:this(c) 会出现编译错误,因为在子类DVD中只有一个双参数构造方法,没有一个参数的构造方法

答案C:正确答案符合考点的知识点。

答案D:super(c) 必须放在第一行,否则无法正常编译。

为什么this(),super()必须放在第一行?

this()和super()调用构造方法,作用是在JVM堆中构建出一个对象。因此避免多次创建对象,同一个方法内只能调用一次this()或super()。同时为了避免操作对象时对象还未构建成功(在执行任何动作前,需要确保对象已经完成了初始化),需要this()和super()的调用在第一行实现【以此来创建对象】,防止发生异常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章