【问题标题】:Creating a new object in Java with the class name of an abstract class?用抽象类的类名在Java中创建一个新对象?
【发布时间】:2020-02-27 12:26:42
【问题描述】:

我正在进行一些考试修订工作,并创建了一个 Employee 抽象类和两个从 Employee 类扩展的其他类(AcademicEmployee 和 ProfessionalEmployee)。

我在 Employee 类中设置了一个 public static 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 class object abstract


    【解决方案1】:

    你的问题是,

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

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

     new AcademicEmployee("Ryan", 1000.0, boss, 'A');
    
    new ProfessionalEmployee("The Big Man", 5000.0, null, 10);
    

    而且,AcademicEmployeeProfessionalEmployee 都不能是 abstract,否则会出现编译时错误。

    由于AcademicEmployeeProfessionalEmployee 是一个 Employee(因为你已经扩展/实现了它),你可以分配!

    这个用简单的语言解释here

    【讨论】:

    • 呵呵,我的问题写得有点奇怪。感谢您的解释和链接!
    【解决方案2】:

    这是java中Polymorphism的概念。由于您的类ProfessionalEmployeeAcademicEmployee 都扩展了Employee,因此两者都可以分配给Employee 引用对象。

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

    【讨论】:

    • 将它们分配给 Employee 引用对象有什么缺点吗?
    • 缺点是,如果您有特定于 AcademicEmployee 或 ProfessionalEmployee 的方法,您将无法调用它。因为可用的方法列表将基于引用类型。
    • 啊,因此无法调用 AcademicEmployee 或 ProfessionalEmployee 中的重写方法,因为我的引用仅指向位于 Employee 类中的方法?
    • @firsttimeandroid 不,重写的方法将被调用,因为这些方法也存在于父类中。仅在子类中创建的不在父类中的方法将无法调用。
    猜你喜欢
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    相关资源
    最近更新 更多