在 Java 中,将子类对象赋值给超类对象会发生什么?
在 Java 中,将一种数据类型转换为另一种数据类型称为强制类型转换。
如果将较高数据类型转换为较低数据类型,则称为收缩(将较高数据类型的值赋给较低数据类型的变量)。
char ch = (char)5;
如果将较低数据类型转换为较高数据类型,则称为扩展(将较低数据类型的值赋给较高数据类型的变量)。
int i = 'c';
同样,您也可以将一种类类型的对象强制类型转换/转换为其他类型。但这两个类应该存在继承关系。那么,
如果将超类转换为子类类型,则在引用方面称为收缩(子类引用变量保存超类的对象)。
Sub sub = (Sub)new Super();
如果将子类转换为超类类型,则在引用方面称为扩展(超类引用变量保存子类的对象)。
Super sup = new Sub();
将子类对象赋值给超类变量
因此,如果将子类对象赋值给超类的引用变量,则子类对象将转换为超类的类型,此过程称为扩展(就引用而言)。
但是,使用此引用只能访问超类的成员,如果尝试访问子类成员,则会生成编译时错误。
示例
在下面的 Java 示例中,我们有两个类,分别是 Person 和 Student。Person 类有两个实例变量 name 和 age,以及一个实例方法 display person(),用于显示 name 和 age。
Student 类扩展了 Person 类,除了继承的 name 和 age 之外,它还拥有两个变量 branch 和 student_id。它有一个方法 display data(),可以显示所有四个值。
在主方法中,我们将超类引用变量赋值给子类对象
class Person{
public String name;
public int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public void displayPerson() {
System.out.println("Data of the Person class: ");
System.out.println("Name: "+this.name);
System.out.println("Age: "+this.age);
}
}
public class Student extends Person {
public String branch;
public int Student_id;
public Student(String name, int age, String branch, int Student_id){
super(name, age);
this.branch = branch;
this.Student_id = Student_id;
}
public void displayStudent() {
System.out.println("Data of the Student class: ");
System.out.println("Name: "+super.name);
System.out.println("Age: "+super.age);
System.out.println("Branch: "+this.branch);
System.out.println("Student ID: "+this.Student_id);
}
public static void main(String[] args) {
Person person = new Student("Krishna", 20, "IT", 1256);
person.displayPerson();
}
}
输出
Data of the Person class: Name: Krishna Age: 20
访问子类方法
将子类对象赋值给超类引用变量,并尝试使用此引用访问子类的成员时,将生成编译时错误。
示例
在本例中,如果将 Student 对象赋值给 Person 类的引用变量,如下所示:
Person person = new Student("Krishna","IT", 1256);
使用此引用,您只能访问超类的方法,即 display person()。相反,如果您尝试访问子类方法,即 display student(),则会生成编译时错误。
因此,如果将上一个程序的 main 方法替换为以下内容,将生成编译时错误。
public static void main(String[] args) {
Person person = new Student("Krishna", 20, "IT", 1256);
person.displayStudent();
}
编译时错误
Student.java:33: error: cannot find symbol person.dispalyStudent(); ^ symbol: method dispalyStudent() location: variable person of type Person 1 error

