Java 抽象类与继承实战解析:多态与方法重写的应用
一、原题完整代码呈现
以下是计算机二级Java考试中关于抽象类、继承与多态的典型题型,主要考察抽象类定义、抽象方法声明、类继承及多态调用,包含5处需要填写的空白(标记为//*********Found**********
):
import java.text.*;
public class Java_2
{
public static void main(String[] args)
{
Person[] people = new Person[2];
people[0] = new Worker("老张", 30000);
people[1] = new Student("小王", "计算机科学");
for (int i = 0; i < people.length; i++)
{
Person p = people[i];
//*********Found**********
System.out.println(____________________() + ", " + p.getDescription());
}
}
}
//*********Found**********
________________ class Person
{
public Person(String n)
{
name = n;
}
//*********Found**********
public ___________________ String getDescription();
public String getName()
{
return name;
}
private String name;
}
//*********Found**********
class Worker _________________ Person
{
public Worker(String n, double s)
{
super(n);
salary = s;
}
public String getDescription()
{
NumberFormat formatter = NumberFormat.getCurrencyInstance();
return "工人,年薪是 " + formatter.format(salary) + "。";
}
private double salary;
}
//*********Found**********
class Student _________________ Person
{
public Student(String n, String m)
{
super(n);
major = m;
}
public String getDescription()
{
return "学生,专业是 " + major + "。";
}
private String major;
}
二、空白处逐一解析与解答
1. 第一处空白:获取对象的姓名(多态调用中的 getName 方法)
答案:p.getName
//*********Found**********
System.out.println(p.getName() + ", " + p.getDescription());
解析: p
是Person
类型的引用,指向Worker
或Student
对象(多态)。Person
类定义了getName()
方法(返回姓名),子类继承该方法,因此通过p.getName()
可获取对象的姓名,与后面的getDescription()
(描述信息)拼接输出。
2. 第二处空白:声明抽象类 Person
答案:abstract
//*********Found**********
abstract class Person
解析: Person
类中包含未实现的方法getDescription()
(仅声明,无方法体,以分号结尾),这类方法称为抽象方法。包含抽象方法的类必须声明为抽象类,关键字为abstract
,因此填写abstract
。
3. 第三处空白:声明抽象方法 getDescription
答案:abstract
//*********Found**********
public abstract String getDescription();
解析: getDescription()
方法在Person
类中未实现,需要声明为抽象方法(强制子类实现)。抽象方法的声明需添加abstract
关键字,因此填写abstract
。
4. 第四处空白:Worker 类继承 Person 类
答案:extends
//*********Found**********
class Worker extends Person
解析: Worker
是Person
的子类,需要继承Person
类的属性和方法(如name
和getName()
)。Java中类的继承通过extends
关键字实现,因此填写extends
。
5. 第五处空白:Student 类继承 Person 类
答案:extends
//*********Found**********
class Student extends Person
解析:
与Worker
类同理,Student
作为Person
的子类,需通过extends
关键字继承Person
类,以复用父类的代码并实现抽象方法getDescription()
,因此填写extends
。
三、完整正确代码
四、程序功能与运行说明
程序功能
该程序通过抽象类Person
及其子类Worker
、Student
,演示面向对象的继承与多态特性,核心功能包括:
- 定义抽象类
Person
,包含姓名属性和抽象方法getDescription()
(描述信息) Worker
和Student
类继承Person
,分别实现getDescription()
(返回职业/专业描述)- 在
main
方法中,用Person
数组存储Worker
和Student
对象,通过多态调用统一输出姓名和描述
运行说明
初始化对象数组:
创建Person[] people
数组,存储两个对象:Worker("老张", 30000)
:姓名“老张”,年薪30000Student("小王", "计算机科学")
:姓名“小王”,专业“计算机科学”
多态调用:
循环遍历数组,通过Person
类型引用p
调用:p.getName()
:继承自Person
类的方法,返回姓名p.getDescription()
:调用实际对象(Worker
或Student
)的实现方法
输出结果:
老张, 工人,年薪是 ¥30,000.00。 小王, 学生,专业是 计算机科学。
五、核心知识点总结
抽象类与抽象方法
- 抽象类:用
abstract
修饰的类,可包含普通方法和抽象方法,不能实例化(如Person
无法创建对象,只能作为父类) - 抽象方法:用
abstract
修饰的方法,只有声明(无方法体,以分号结尾),必须在非抽象子类中实现 - 作用:定义通用模板(如
Person
为“人”的抽象概念),强制子类实现特定方法(如getDescription()
描述具体身份)
- 抽象类:用
继承的特性
- 关键字
extends
:子类通过extends
继承父类,获得父类的非私有属性和方法(如Worker
和Student
继承name
和getName()
) - 构造方法调用:子类构造方法中需通过
super(参数)
调用父类对应构造方法(如super(n)
调用Person(String n)
) - 代码复用:避免重复定义通用属性和方法(如姓名相关逻辑仅在
Person
中定义)
- 关键字
多态的实现
- 多态表现:父类引用指向子类对象(
Person p = new Worker(...)
) - 动态绑定:调用方法时,实际执行的是子类的实现(
p.getDescription()
根据p
指向的实际对象调用Worker
或Student
的方法) - 优势:统一接口(用
Person
数组管理不同子类对象),简化代码,提高扩展性
- 多态表现:父类引用指向子类对象(
方法重写(Override)
- 子类需重写父类的抽象方法(否则子类也需声明为抽象类)
- 重写要求:方法名、参数列表、返回值类型必须与父类一致(协变返回值除外),访问权限不低于父类
- 本题中
Worker
和Student
的getDescription()
均重写了Person
的抽象方法
六、常见错误与应试技巧
常见错误分析
- 第一处空白方法调用错误:写成
getName()
(缺少对象引用p
,编译错误)或p.name
(name
是私有成员,无法直接访问) - 第二处空白抽象类声明错误:遗漏
abstract
(类包含抽象方法,必须声明为抽象类,否则编译错误) - 第三处空白抽象方法声明错误:遗漏
abstract
(未实现的方法需声明为抽象方法,否则编译错误) - 第四/五处空白继承关键字错误:写成
implements
(implements
用于实现接口,继承类用extends
)
- 第一处空白方法调用错误:写成
应试技巧
- 抽象类口诀:“抽象类带abstract,可含抽象方法;抽象方法无实现,子类必须重写它”
- 继承原则:“子类extends父类,super调用父构造,私有成员不能直接用,getter方法来帮忙”
- 多态应用:“父类引用指子类,调用方法看实际对象,统一管理真方便”
- 调试技巧:打印对象类型(
p.getClass().getName()
),验证多态中实际对象的类型
通过本题,我们掌握了抽象类的定义、抽象方法的声明、类的继承实现及多态的应用。这些是面向对象编程的核心特性,理解抽象类作为“模板”和多态作为“统一接口”的思想,对设计灵活可扩展的程序具有重要意义。