• Java构造器练习题


    仔细阅读下面的程序

    public class Car {
    	String name = "汽车";
    
    	public Car(String name) {
    		this.name = name;
    	}
    
    	// 加上main方法
    	public static void main(String[] args) {
    		Car bmw = new BMW("宝马X5");
    		System.out.println(bmw.name);
    	}
    }
    
    class BMW extends Car {
    	String name = "宝马";
    
    	public BMW(String name) {
    		this.name = name;
    	}
    }
    

    请问正确的选项是什么?

    A.汽车    B.宝马    C.宝马x5    D.编译报错    E.输出异常

    答案

    答案是:D.编译报错

    解析

    1.相关知识

    子类继承父类时,如果父类没有无参构造器,子类需要在构造函数中通过super(参数),先显示调用父类的有参构造。

    2.代码流程
    • 定义了Car类,包含name属性值为"汽车";
    • 定义了有参构造将默认的name值"汽车"传递给参数;
    • 定义了BMW类继承Car类,包含name属性值为"宝马";
    • 有参构造将name属性值设为传递进来的参数值;
    • Car类中的main方法中,声明了一个Car对象,new一个BMW实例,输出实例的name属性值。
    3.答案解析

    情况一:在父类中添上无参构造,输出汽车

    因为父类没有给出无参构造,子类必须要显示调用父类的有参构造,因此会发生编译错误。如果显示调用了父类的有参构造,则调用的是父类的name值,但由于赋值语句是将原值赋值给参数,因此"汽车"并未发生改变,会输出"汽车"。代码如下:

    public class Car {
    	String name = "汽车";
    
    	public Car(String name) {
    		this.name = name;
    	}
    
    	// 加上无参构造
    	public Car() {}
    
    	// 加上main方法
    	public static void main(String[] args) {
    		Car bmw = new BMW("宝马X5");
    		System.out.println(bmw.name);
    	}
    }
    
    class BMW extends Car {
    	String name = "宝马";
    
    	public BMW(String name) {
    		this.name = name;
    	}
    }  
    

    情况二:在子类中显示调用父类有参构造,输出宝马X5

    public class Car {
    	String name = "汽车";
    
    	public Car(String name) {
    		this.name = name;
    	}
    
    	// 加上main方法
    	public static void main(String[] args) {
    		Car bmw = new BMW("宝马X5");
    		System.out.println(bmw.name);
    	}
    }
    
    class BMW extends Car {
    	String name = "宝马";
    
    	public BMW(String name) {
    		// 显示调用父类有参构造器
    		super(name);
    		this.name = name;
    	}
    }
  • 相关阅读:
    JDBC 删除数据两种方式,PreparedStatement表示预编译的 SQL 语句的对象,防止sql注入
    MySQL 主键外键
    JDBC 增删改查
    MySQL数据库语句
    反射
    如何安装、配置、登陆MySQL
    如何干净卸除MySQL数据库
    IO流总结
    字符流五种读写 字符流 BufferedWriter BufferedReader 带缓冲区的字符流
    单例模式
  • 原文地址:https://www.cnblogs.com/zxfei/p/10758790.html
Copyright © 2020-2023  润新知