如下面的代码所示,给定一个超类Parent,其方法calculate()Parent的构造函数中调用,但也在类Child中被重写,为什么在Child的构造函数中对Parent的构造函数的隐式调用不调用Parentcalculate(),而是调用Childcalculate()

class Parent {
    Parent() {
        calculate();
        System.out.println("Empty parent ctor.");
    }
    void calculate() {
        System.out.println("Parent calculating...");
    }
}

class Child extends Parent {
    Child() {
        System.out.println("Empty child ctor.");
    }
    @Override
    void calculate() {
        System.out.println("Child calculating...");
    }
}

public class ParentConstructor {
    public static void main(String [] args) {
        Parent child = new Child();
    }
}

输出:

Child calculating...
Empty parent ctor.
Empty child ctor.

我本以为要正确构造一个Parent对象,它的构造函数应该总是用它自己的方法定义来调用.

推荐答案

父级中的方法永远不会被重写该方法的子类或子类调用,除非您使用SUPER语句显式调用它.这是因为在方法调用期间,要执行哪个方法(父类或子类)由对象类型确定.

在运行时解析对重写方法的调用的过程称为动态方法调度.

class Child extends Parent {
    Child() {
        System.out.println("Empty child ctor.");
    }
    @Override
    void calculate() {
        super.calculate(); // calling parent implementation
        System.out.println("Child calculating...");
    }
}

Java相关问答推荐

neo4j java驱动程序是否会在错误发生时自动回滚事务?

多个Java线程和TreeMap.put()的非预期行为

@ IdClass with @ Inheritance(策略= InheritanceType. SINGLE_TABLE)

CAMEL 4中的SAXParseException

如何配置ActiveMQ Artemis以使用AMQP 1.0和其他协议与Java

如何使用AWS CLI从S3存储桶中的所有对象中删除用户定义的元数据?

Java FX中的河内之塔游戏-在游戏完全解决之前什么都不会显示

使用传递的参数构造异常的Mockito-doThrow(或thenThrow)

Mapstruct不能正确/完全映射属性

在Java中如何从Executors.newFixedThreadPool(MAX_THREAD_COUNT())迁移到虚拟线程

如何使用带有谓词参数的方法,而不使用lambda表达式

Java连接池无法正常工作

如何在Cosmos DB(Java SDK)中增加默认响应大小

如何使用log4j2(Json)记录由";异常引起的所有";?

如何在Java中为thunk创建映射器函数

对从Spring Boot 3.1.5升级到3.2.0的方法的查询验证失败

不能在 map 上移除折线

rest api服务 spring 启动中出现IllegalFormatConversionException

验证没有';t work on Hibernate Entity';s字段

如何在Java上为循环数组从synchronized迁移到ReentrantLock