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面向对象编程的核心,理解并熟练运用这些概念,能帮助我们设计更合理的类结构和继承关系。