Java 类的继承与多态实战:Person与Student类的设计

一、原题完整代码呈现
以下是Java中关于类的继承、构造方法调用及方法重写的典型题型,通过Person类和Student类(继承自Person)展示面向对象的基本特性,包含5处需要填写的空白(标记为//*********Found********):
public class Java_2 {
public static void main(String[] args) {
Person p = new Person("Zhao",20);
Student s = new Student("Wang",18,"Cambridge");
System.out.println(p);
System.out.println(s);
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
//*********Found********
___________ = name;
//*********Found********
___________ = age;
}
public void setName(String n) {
//*********Found********
___________= n;
}
public String toString() {
return "Name: " + name + " Age: " + age;
}
}
class Student extends Person {
private String school;
public Student(String name, int age, String s) {
//*********Found********
___________;
school = s;
}
public String toString() {
//*********Found********
return ___________.toString() + " School: " + school;
}
}二、空白处逐一解析与解答
1. 第一处空白:Person构造方法中给name赋值
答案:this.name
//*********Found********
this.name = name;解析:
Person类的构造方法参数name与类的私有成员变量name同名,需用this关键字区分(this.name表示当前对象的成员变量,name表示参数)。此处将参数值赋给成员变量,因此填写this.name。
2. 第二处空白:Person构造方法中给age赋值
答案:this.age
//*********Found********
this.age = age;解析:
与name同理,参数age与成员变量age同名,需用this.age表示成员变量,将参数值赋给它,因此填写this.age。
3. 第三处空白:setName方法中给name赋值
答案:this.name
public void setName(String n) {
//*********Found********
this.name = n;
}解析: setName方法用于修改name的值,参数n是新的名字,需将其赋给成员变量name,用this.name明确指向成员变量,因此填写this.name。
4. 第四处空白:Student构造方法中调用父类构造方法
答案:super(name, age)
public Student(String name, int age, String s) {
//*********Found********
super(name, age);
school = s;
}解析:
Student类继承自Person类,Person类没有无参构造方法(只定义了带name和age的构造方法)。根据Java规则,子类构造方法必须先调用父类的构造方法(否则编译错误),super(name, age)用于调用父类的带参构造方法,初始化继承自父类的name和age,因此填写super(name, age)。
5. 第五处空白:Student类toString方法中调用父类toString
答案:super
public String toString() {
//*********Found********
return super.toString() + " School: " + school;
}解析:
Student类重写了toString方法,需要复用父类Person的toString方法(获取name和age的字符串),再拼接自己的school信息。super.toString()表示调用父类的toString方法,因此填写super。
三、完整正确代码
四、程序功能与运行说明
程序功能
该程序通过两个类展示面向对象的继承特性:
Person类:封装了人的基本属性(name和age),提供构造方法初始化属性、setName方法修改名字、toString方法返回属性字符串;Student类:继承自Person类,新增school属性,重写构造方法(调用父类构造)和toString方法(复用父类信息并添加学校信息);- 主类
Java_2:创建Person和Student对象,打印对象信息(自动调用toString方法)。
运行说明
对象创建:
Person p = new Person("Zhao",20):创建名为"Zhao"、年龄20的Person对象;Student s = new Student("Wang",18,"Cambridge"):创建名为"Wang"、年龄18、就读于"Cambridge"的Student对象。
打印输出:
System.out.println(p):调用Person的toString,输出Name: Zhao Age: 20;System.out.println(s):调用Student的toString(先调用父类toString,再拼接学校信息),输出Name: Wang Age: 18 School: Cambridge。
五、核心知识点总结
this关键字的用法- 作用:区分成员变量与局部变量(当两者同名时);
- 格式:
this.成员变量名表示当前对象的成员变量; - 场景:构造方法、setter方法中常用,避免变量名冲突。
类的继承与
super关键字- 继承:通过
extends关键字实现(如Student extends Person),子类继承父类的非私有属性和方法; super关键字:- 调用父类构造方法:
super(参数),必须放在子类构造方法的第一行; - 调用父类方法:
super.方法名(参数),如子类重写父类方法后,需显式调用父类版本。
- 调用父类构造方法:
- 继承:通过
构造方法的调用规则
- 父类无显式构造方法时,子类构造默认调用父类无参构造(隐式);
- 父类有显式构造方法(尤其是带参构造)时,子类必须在构造方法中通过
super显式调用父类的某个构造方法,否则编译错误。
方法重写(Override)
- 概念:子类定义与父类同名、同参数列表、同返回值类型的方法,覆盖父类方法;
- 目的:实现子类特有的功能,同时可复用父类逻辑(通过
super.方法名调用); - 示例:Student类重写
toString,既保留父类的name和age信息,又添加school信息。
toString方法的作用- 当打印对象时(如
System.out.println(对象)),Java会自动调用该对象的toString方法; - 默认实现:
Object类的toString返回“类名@哈希码”,通常需要在自定义类中重写,返回有意义的属性信息。
- 当打印对象时(如
六、常见错误与应试技巧
常见错误分析
- 第一、二处空白:遗漏
this(导致成员变量未被赋值,参数值赋给自身,逻辑错误); - 第三处空白:写成
name = n(虽然此处参数名是n,与成员变量name不同名,可正常赋值,但最佳实践仍用this明确区分,增强可读性); - 第四处空白:遗漏
super(name, age)(父类无无参构造,子类构造必须调用父类带参构造,否则编译错误); - 第五处空白:写成
Person(Person是类名,不能直接调用实例方法,需用super指代父类对象)。
- 第一、二处空白:遗漏
应试技巧
this使用:“成员参数同名时,this.成员来区分,赋值操作不混淆”;- 继承与
super:“子类继承父类,构造先调super,参数匹配要注意,首行调用是规则”; - 方法重写:“子类重写父类法,同名同参同返回,super.方法复用父类逻辑,添加子类特有内容”;
toString重写:“打印对象调toString,重写返回属性串,信息展示更直观”。
通过本题,我们掌握了this与super的核心用法、类的继承规则、构造方法调用及方法重写等面向对象的基础知识点。这些是Java面向对象编程的核心,理解并熟练运用这些概念,能帮助我们设计更合理的类结构和继承关系。