1.
class Parent1 {
Parent1(String s){
System.out.println(s);
}
}
class Parent2 extends Parent1{
Parent2(){
System.out.println("parent2");
}
}
public class Child extends Parent2 {
public static void main(String[] args) {
Child child = new Child();
}
}
//编译错误:没有找到构造器Parent1()
在给定的代码中,Parent2
类继承自 Parent1
类,但是 Parent2
类的构造函数没有显式地调用父类 Parent1
的构造函数。由于 Parent1
类中只声明了一个带有字符串参数的构造函数,没有无参构造函数,所以编译器会默认插入父类的无参构造函数调用,但是在父类中并没有这样的构造函数。
因此,在编译代码时,由于缺少调用父类 Parent1
的构造函数的语句,编译器会报错,提示找不到构造器 Parent1()
。
解释是:
Parent1
类有一个接受字符串参数的构造函数。Parent2
类继承自Parent1
类,但是它的构造函数中没有显式地调用父类的构造函数。Child
类继承自Parent2
类,并在其main
方法中创建一个Child
实例对象。- 由于缺少对父类
Parent1
构造函数的调用,编译器会报错,指出找不到无参构造函数Parent1()
。
2.
class Parent{
public String name;
public Parent(String pName){
this.name = pName;
}
}
public class Test extends Parent { //第1行
public Test(String Name){ //第2行
name="hello"; //第3行
super("kitty"); //第4行
}
}
下列选项说法正确的是( )
A.第2行错误,Test类的构造函数中参数名称应与其父类构造函数中的参数名相同
B.第3行错误,应使用super关键字调用父类的name属性,改为super.name="hello";
C.第4行错误,调用父类构造方法的语句必须放在子类构造方法中的第一行
D.程序编译通过,无错误
Test
类是 Parent
类的子类。在 Test
类的构造函数中,首先出现的语句是name="hello";
,然后才是 super("kitty");
。根据Java语法规定,调用父类的构造方法必须作为子类构造函数的第一条语句,因此这里的代码是错误的。
正确的代码如下所示:
public class Test extends Parent {
public Test(String pName) {
super("kitty"); // 调用父类构造方法作为第一条语句
name = "hello"; // 设置子类的实例变量
}
}
这样,调用父类的构造方法 super("kitty");
就被放置在了正确的位置。
3.
public class Test {
public Test(){
System.out.println(“构造方法一被调用了”);
}
public Test(int x){
this();
System.out.println(“构造方法二被调用了”);
}
public Test(boolean b){
this(1);
System.out.println(“构造方法三被调用了”);
}
public static void main(String[] args){
Test test = new Test(true);
}
}
上面程序的运行结果为()
A.构造方法一、构造方法二和构造方法三都被调用了
B.只有构造方法一被调用了
C.只有构造方法一和构造方法三被调用了
D.只有构造方法三被调用了
- 在主函数中,创建了一个名为
test
的Test
对象,并传入了布尔值true
。 - 由于传入的是布尔值
true
,所以会调用Test
类中的带有boolean
类型参数的构造函数public Test(boolean b)
。 - 在
public Test(boolean b)
构造函数中,首先出现的语句是this(1);
,表示调用带有int
类型参数的构造函数public Test(int x)
。 - 在
public Test(int x)
构造函数中,首先调用了this()
,没有参数,表示调用无参构造函数public Test()
。 - 在
public Test()
构造函数中,输出了字符串 “构造方法一被调用了”。 - 继续执行
public Test(int x)
构造函数中的代码,输出了字符串 “构造方法二被调用了”。 - 最后继续执行
public Test(boolean b)
构造函数中的代码,输出了字符串 “构造方法三被调用了”。
因此,根据程序的运行流程,三个构造函数都被调用了,最终的运行结果是构造方法一、构造方法二和构造方法三都被调用了