Java 继承与多态实战解析:父类与子类的成员变量与方法重写
一、原题完整代码呈现
以下是计算机二级Java考试中关于类的继承、构造方法和方法重写的典型题型,主要考察父类与子类的变量初始化、方法重写及super
关键字的使用,包含4处需要填写的空白(标记为//*********Found********
):
public class Java_2{
public static void main(String args[]) {
SubClass subC = new SubClass();
subC.doSomething();
}
}
class SuperClass {
int x;
SuperClass() {
//*********Found********
x = ___________;
System.out.println("in SuperClass : x=" + x);
}
void doSomething() {
//*********Found********
System.out.println("__________________________()");
}
}
class SubClass extends SuperClass {
int x;
SubClass() {
super();
//*********Found********
x = ____________;
System.out.println("in SubClass :x=" + x);
}
void doSomething() {
super.doSomething();
//*********Found********
System.out.println("________________________()");
System.out.println("super.x=" + super.x + " sub.x=" + x);
}
}
二、空白处逐一解析与解答
1. 第一处空白:父类变量初始化
答案:10
(或其他合理初始值,结合子类形成对比)
//*********Found********
x = 10;
解析:
父类SuperClass
的构造方法需要初始化成员变量x
。从程序输出逻辑看,需要与子类SubClass
的x
值形成区分(后续通过super.x
和x
分别访问),通常选择10作为初始值,与子类的20形成对比。
2. 第二处空白:父类方法输出
答案:SuperClass doSomething
//*********Found********
System.out.println("SuperClass doSomething()");
解析:
父类doSomething()
方法需要输出标识自身的字符串,以便与子类重写的方法区分。根据命名规范,应包含类名和方法名,清晰展示当前调用的是父类方法。
3. 第三处空白:子类变量初始化
答案:20
(或其他与父类不同的合理值)
//*********Found********
x = 20;
解析:
子类SubClass
的构造方法在调用父类构造方法(super()
)后,需要初始化自身的成员变量x
。为了体现父类与子类变量的区别(同名隐藏),应选择与父类不同的值(如20)。
4. 第四处空白:子类方法输出
答案:SubClass doSomething
//*********Found********
System.out.println("SubClass doSomething()");
解析:
子类重写的doSomething()
方法需要输出标识自身的字符串,且通过super.doSomething()
已调用父类方法,此处应明确显示是子类的方法实现,遵循"类名+方法名"的命名规范。
三、完整正确代码
四、程序功能与运行说明
程序功能
该程序通过类的继承关系展示了:
- 父类与子类的构造方法执行顺序(先父后子)
- 同名成员变量的隐藏(父类
x
与子类x
相互独立) - 方法重写(子类重写父类
doSomething()
方法) super
关键字的用法(调用父类构造方法和父类方法)
运行说明
程序执行流程:
- 创建
SubClass
对象时,先调用父类SuperClass
的构造方法 - 父类初始化
x=10
,输出in SuperClass : x=10
- 子类构造方法继续执行,初始化自身
x=20
,输出in SubClass :x=20
- 调用
subC.doSomething()
,先执行super.doSomething()
(父类方法),再执行子类重写的逻辑
- 创建
输出结果:
in SuperClass : x=10 in SubClass :x=20 SuperClass doSomething() SubClass doSomething() super.x=10 sub.x=20
五、核心知识点总结
继承的基本特性
- 类继承:
SubClass extends SuperClass
表示子类继承父类,获得父类的成员和方法 - 构造方法执行顺序:创建子类对象时,先调用父类构造方法(
super()
),再执行子类构造方法 - 变量隐藏:子类中定义与父类同名的变量(
x
)时,子类变量会隐藏父类变量,需通过super.x
访问父类变量
- 类继承:
super关键字的用法
- 调用父类构造方法:
super()
必须是子类构造方法的第一条语句 - 访问父类成员:
super.x
访问父类的x
变量(区别于子类的x
) - 调用父类方法:
super.doSomething()
在子类中调用父类被重写的方法
- 调用父类构造方法:
方法重写(Override)
- 定义:子类中定义与父类同名、同参数列表、同返回值类型的方法
- 特性:调用时优先执行子类重写的方法(多态的体现)
- 注意:父类方法不能是
private
(私有方法无法被重写)
成员变量与方法的区别
- 变量:同名变量不会被重写,只会被隐藏(需显式用
super
访问父类变量) - 方法:同名方法会被重写,通过
super
可强制调用父类方法
- 变量:同名变量不会被重写,只会被隐藏(需显式用
六、常见错误与应试技巧
常见错误分析
- 第一处空白初始化错误:父类与子类
x
值相同,无法体现变量隐藏的效果 - 第二处空白输出错误:字符串与方法名不匹配,无法区分父类与子类方法
- 第三处空白构造方法错误:忘记调用
super()
(编译器会默认添加,但显式写出更规范) - 第四处空白重写错误:子类方法参数列表与父类不一致,导致不是重写而是重载
- 第一处空白初始化错误:父类与子类
应试技巧
- 继承口诀:"子类extends父类,构造先父后子类,同名变量要隐藏,super关键字来区分"
- 方法重写判断:"两同(名、参数)两小(返回值、异常)一大(访问权限)"
- 输出调试:通过打印类名区分父类与子类的方法调用,通过
super.x
和x
区分变量
通过本题,我们掌握了类继承的基本用法、构造方法的执行顺序、变量隐藏与方法重写的区别,以及super
关键字的灵活应用。继承与多态是面向对象编程的核心特性,理解这些概念对编写可扩展、可维护的Java程序具有重要意义。