针对构造函数相关考点的笔试题:
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()的调用在第一行实现【以此来创建对象】,防止发生异常。