用抽象类的类名在Java中创建新对象?

用抽象类的类名在Java中创建新对象?,java,class,object,abstract,Java,Class,Object,Abstract,我正在做一些考试复习工作,创建了一个Employee抽象类和另外两个类(AcademicEmployee和ProfessionalEmployee),它们扩展了Employee类 我在Employee类中设置了一个公共静态void main来运行以下行: ProfessionalEmployee boss = new ProfessionalEmployee("The Big Man", 5000.0, null, 10); AcademicEmployee e1 = new AcademicE

我正在做一些考试复习工作,创建了一个Employee抽象类和另外两个类(AcademicEmployee和ProfessionalEmployee),它们扩展了Employee类

我在Employee类中设置了一个公共静态void main来运行以下行:

ProfessionalEmployee boss = new ProfessionalEmployee("The Big Man", 5000.0, null, 10);
AcademicEmployee e1 = new AcademicEmployee("Ryan", 1000.0, boss, 'A');
我知道你不能实例化一个抽象类,而创建的实际对象是“new”关键字后面的任何东西,但为什么我可以这样做:

Employee boss = new ProfessionalEmployee("The Big Man", 5000.0, null, 10);
我认为它的工作方式是“数据类型”,然后“引用名称”=new

但我只是对为什么允许我将数据类型设置为Employee感到困惑。很抱歉,如果这是一个奇怪的问题,我只是刚接触Java:)

这是Java中的一个概念。由于类
ProfessionalEmployee
academicalemployee
都扩展了
Employee
,因此都可以分配给
Employee
引用对象

多态性允许您定义一个接口或类并有多个实现。

您的问题是

用抽象类的类名在Java中创建新对象

但是你在哪里创建了这样的新对象?您已经创建了两个
对象
s,如下所示

 new AcademicEmployee("Ryan", 1000.0, boss, 'A');

new ProfessionalEmployee("The Big Man", 5000.0, null, 10);
而且,
AcademicEmployee
ProfessionalEmployee
都不能是
abstract
,否则会出现编译时错误

由于
AcademicEmployee
ProfessionalEmployee
是一名
员工
(因为您已经扩展/实施了它),因此允许您分配


这是用简单的文字解释的

呼,是的,我的问题写得有点奇怪。谢谢你的解释和链接!将它们分配给Employee引用对象有什么不利之处吗?不利之处是,如果您有一个特定于AcademicEmployee或ProfessionalEmployee的方法,您将无法调用它。因为可用的方法列表将基于引用类型。啊,所以无法调用AcademicEmployee或ProfessionalEmployee中的重写方法,因为我的引用只指向Employee类中的方法?@firsttimeandroid no,重写的方法将被调用,因为这些方法也存在于父类中。仅在不在父类中的子类中创建的方法将无法调用。