在Java中,我们可以将父类(super class)对象传递给子类引用吗?

我知道这是一个奇怪的问题/实际上不可行,
但我想了解其背后的逻辑
为什么在Java中不允许使用。

class Employee {
    public void met1(){
        System.out.println("met1");
    }
}


class SalesPerson extends Employee
{
    @Override
    public void met1(){
    System.out.println("new met1");
    }


    public void met2(){
        System.out.println("met2");
    }

}

public class ReferenceTest {
    public static void main(String[] args) {

        SalesPerson sales = new Employee(); // line 1

        sales.met1();  // line 2

        sales.met2();  // line 3
    }
}

如果Java允许编译第1行会发生什么?
问题将在哪里出现?

欢迎任何输入/链接。

最佳答案

如果允许您的SalesPerson sales = new Employee();语句进行编译,这将破坏Polymorphism的原理,这是该语言具有的功能之一。

另外,您应该熟悉编译时间类型和运行时类型的含义:

变量的编译时类型是声明为的类型,而运行时类型是变量指向的实际对象的类型。例如:

Employee sales = new SalesPerson();
sales的编译时类型为Employee,运行时类型为SalesPerson
编译时类型定义可以调用的方法,而运行时类型定义实际调用期间发生的事情。

让我们暂时假设此语句是有效的:
SalesPerson sales = new Employee();

就像我说的那样,编译时类型定义了可以调用的方法,因此met2()本来可以调用。同时,Employee类没有met2(),因此实际的调用是不可能的。

09-05 03:06
查看更多