一个关于构造函数的笔试题
class A{
A(int i){
}
}
class B extends A{
}
A、Compile-time error at 5.
B、Compile-time error at 1.
C、The compiler attempts to create a default constructor for class B.
D、The compiler attempts to create a default constructor for class A.
能说说为什么么?
------解决方案-------------------- A把
继承父类,就必须继承父类的构造方法。
------解决方案-------------------- B 的构造函数跟父类不一样 怎么创建父类?
------解决方案-------------------- 答案应该是A.
原因是因为子类B中没有定义构造方法,那么就会有一个默认的无参构造方法,我们知道,在创建子类对象的时候,会调用父类的构造方法无参构造方法,因为A类定义了一个带参数的构造方法,所以无参构造方法被覆盖了,所以在第5行会报A类中没有无参构造方法。
只要给A定义一个无参构造方法就行了。
------解决方案-------------------- 报错了!实例化B对象的时候需要有一个父类A的无参构造函数。第五行报错。
------解决方案-------------------- 你的子类中没有显示调用父类的构造方法,你这个B类就会调用父类默认的“可访问的无参的构造方法”。由于你的A类没有这个方法。所以直接报错。选D。
------解决方案-------------------- 引用: 你的子类中没有显示调用父类的构造方法,你这个B类就会调用父类默认的“可访问的无参的构造方法”。由于你的A类没有这个方法。所以直接报错。选D。
手误 选A。
引用: 答案是A和C,忘记说明是多选了
C不对吧 B extends A{ } 这已经报错了。 如果是“attempts to create”即试图创建也肯定先创建父类对象,怎么说都不能能直接创建B。
------解决方案-------------------- 给A显式创建缺省值构造函数 或者在B中创建创建public B(int i){super(i);}都可以
------解决方案-------------------- 选A,经常遇到,不知道原因
------解决方案-------------------- 引用: 答案应该是A.
原因是因为子类B中没有定义构造方法,那么就会有一个默认的无参构造方法,我们知道,在创建子类对象的时候,会调用父类的构造方法无参构造方法,因为A类定义了一个带参数的构造方法,所以无参构造方法被覆盖了,所以在第5行会报A类中没有无参构造方法。
只要给A定义一个无参构造方法就行了。
+1