java - 什么决定了重写方法的调用

标签 java overriding

public class Superclass{

    void method1(){
        method0();
    }

    void method0(){
        System.out.println("superclass"); 
    }

}



public class Subclass extends Superclass{

    void method0(){
        System.out.println("subclass");
    }

}


public class Runclass{

    public static void main(String[] args){
        new Subclass().method1();
    }

}

此代码打印出 - 子类。

假设是

new Superclass().method1();

然后,它会打印出 - superclass

调用的方法是否取决于调用该方法的实例?

最佳答案

它是动态方法调度(运行时多态性)的示例。
在动态方法中,重写方法的调度调用在运行时解析。
当你打电话时

new Superclass().method1();  

输出是 - 父类(super class)
因为父类(super class)没有任何关于子类的信息。
&当你打电话时

new Subclass().method1();  

输出是 - 子类
因为当调用重写方法时,java根据调用时引用的对象类型来确定要执行哪个版本的方法。

关于java - 什么决定了重写方法的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16495619/

相关文章:

css - 覆盖单页设计的全局CSS

java - 在 Java 中覆盖 equals()

ios - 覆盖协议(protocol)扩展默认实现

java - OnDelete 级联失败并出现约束冲突错误 () Hibernate

java - Libgdx 在 actor 上滑动手势

java - 使用反射调用方法会带来哪些安全问题?

java - Sql 抛出 org.springframework.jdbc.BadSqlGrammarException(PreparedStatementCallback; 错误的 SQL 语法

java - 使用 ArrayList 创建 HashMap

c# - 使用反射确定 C# 方法是否具有关键字 'override'

java - 在基类中编写一个需要在子类中覆盖的方法实现?