在 Java 中,将子类对象赋值给超类对象会发生什么?

java 8object oriented programmingprogramming更新于 2025/11/15 13:32:17

在 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

相关文章