仔细阅读下面的程序

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;
}
}

Java构造器练习题的更多相关文章

  1. scjp考试准备 - 7 - Java构造器

    题目——如下代码的执行结果: class Hello{ String title; int value; public Hello(){ title += " World!"; } ...

  2. Java SE练习题——求奇数

    欢迎来到Java SE练习题频道,我是Fishing,今天我带来的练习题是(做题会有不足之处,可评论,说出更好的方法): 通过键盘输入两个整数,计算这两个整数之间的所有奇数之和,并输出计算结果. 看到 ...

  3. Java构造器浅析

    Java构造器 问题引出 1.先看一段简单创建对象的例子: public class constructTest { public static void main(String[] args) { ...

  4. JAVA构造器,重载与重写

    1. java构造器 构造器也叫构造方法(constructor), 用于对象初始化. 构造器是一个创建对象时被自动创建的特殊方法,目的是对象的初始化. 构造器 的名称与类的名称一致. JAVA通过n ...

  5. 浅谈Java构造器

    Java构造器 每个类都有构造方法.如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法. 在创建一个对象的时候,至少要调用一个构造方法.构造方法的名称必须与类同名,一个类可以 ...

  6. java构造器级简单内存分析

    java构造器的使用(基础篇) 构造方法也叫构造器,是创建对象时执行的特殊方法,一般用于初始化新对象的属性. 基本定义语法: 访问控制符 构造方法名([参数列表]){ 方法体 } 注:"访问 ...

  7. java构造器

    java的构造器不是方法,因为没有返回值. 构造器可以重载. 构造器的访问说明符: private:只有本类可以使用这个构造器. protected:这个类的子类和包中的类都可以使用此构造器. pub ...

  8. Java构造器和方法的区别

    摘要要学习Java,你必须理解构造器.因为构造器可以提供许多特殊的方法,这个对于初学者经常混淆.但是,构造器和方法又有很多重要的区别.原作者:Robert Nielsen 原站:www.javawor ...

  9. JAVA构造器、this、super

    构造器是为了创建一个类的实例.这个过程也可以在创建一个对象的时候用到: Platypus p1 = new Platypus(); 相反,方法的作用是为了执行java代码. 修饰符,返回值和命名的不同 ...

随机推荐

  1. 通过cookie记录,设置页面访问的跳转页

    通过cookie记录,设置页面访问的跳转页 转载自:http://blog.csdn.net/yixiao_naihe/article/details/26679515. 目的: 1.访问fm.htm ...

  2. QChart绘制折线区域

    效果图: 代码: // 创建折线上点的序列 QLineSeries *splineSeries = new QLineSeries(); //QSplineSeries *splineSeries = ...

  3. frameset,iframe框架之间如何互相调用变量、函数

    以往一直在编写的都是前台的UI,很少使用到frameset.iframe,对其了解也是十分有限,只是知道其可以为其当前页面引入html文件成为当前页的一部分,但是这两天在做后台UI界面的时候,发现这样 ...

  4. 转载:VC++6.0注释快捷键设置,略有修改

    在Qt Creator,eclipse等编辑器中,都默认有注释代码的快捷键:Ctrl + /. 注释快捷键在程序编程当中的作用相当明显,提高了编程效率.我在网上找到了一个在VC++6.0工具中添加注释 ...

  5. UVa 10905 - Children's Game 排序,题目没有说输入是int 难度: 0

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  6. day050 django第一天 自定义框架

    1.简单的web框架 1. 创建一个简单的python文件: import socket sever=socket.socket() sever.bind(('127.0.0.1',8001)) se ...

  7. python异常处理机制

    python有五种异常处理机制,分别是 1.默认异常处理器. 如果我们没有对异常进行任何预防,那么程序在执行过程中发生异常就会中断程序,调用python默认的异常处理器,并在终端输出异常信息,如图所示 ...

  8. php解析Excel表格并且导入MySQL数据库

    最近根据客户需求,需要增加一个导入Excel表格的功能,Excel中存放的是知识库中医知识的分类体系目录.是在thinkphp框架下编写的代码,用的是phpexcel第三方包.测试环境用的是xampp ...

  9. JS实现数组的相减操作

    /** * 数组相减的方法 * @param {Array} a * @param {Array} b */ function arrSubtraction(a, b) { if (!a || !b ...

  10. vue-router(配置子路由--单页面多路由区域操作)

    1.配置子路由: import Post from "@components/Post" export default new Router({ routers:[ { path: ...