MST

星途 面试题库

面试题:Java多态编译时实现机制之中等难度

请简要描述Java多态在编译时,对于方法调用的解析规则是怎样的?特别是在继承关系中,不同作用域下同名方法的编译时处理方式。
13.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. 编译时方法调用解析规则概述

在Java中,编译时主要依据引用变量的声明类型来确定可调用的方法。编译器会在声明类型的类及其父类中查找匹配的方法签名。

2. 继承关系中同名方法编译时处理方式

  • 静态方法:静态方法在编译时绑定,依据引用变量的声明类型查找。如果子类定义了与父类同名同参数的静态方法,这是方法隐藏,并非重写。编译时,若用父类引用调用,会调用父类的静态方法;若用子类引用调用,会调用子类的静态方法。例如:
class Parent {
    public static void staticMethod() {
        System.out.println("Parent's static method");
    }
}
class Child extends Parent {
    public static void staticMethod() {
        System.out.println("Child's static method");
    }
}
public class Main {
    public static void main(String[] args) {
        Parent parentRef = new Child();
        parentRef.staticMethod(); // 输出 "Parent's static method"
        Child childRef = new Child();
        childRef.staticMethod(); // 输出 "Child's static method"
    }
}
  • 实例方法:对于实例方法,编译时同样依据引用变量的声明类型查找。若子类重写了父类的实例方法,运行时会根据对象的实际类型(动态绑定)调用正确的重写方法,但编译时只关心声明类型是否有匹配的方法签名。例如:
class Parent {
    public void instanceMethod() {
        System.out.println("Parent's instance method");
    }
}
class Child extends Parent {
    @Override
    public void instanceMethod() {
        System.out.println("Child's instance method");
    }
}
public class Main {
    public static void main(String[] args) {
        Parent parentRef = new Child();
        parentRef.instanceMethod(); // 运行时输出 "Child's instance method",编译时检查Parent类是否有此方法
    }
}
  • 私有方法:私有方法不能被重写,在编译时,只能在声明该私有方法的类内部访问。如果子类定义了与父类私有方法同名的方法,它们是完全独立的方法,不存在重写关系。例如:
class Parent {
    private void privateMethod() {
        System.out.println("Parent's private method");
    }
}
class Child extends Parent {
    private void privateMethod() {
        System.out.println("Child's private method");
    }
}

Child类中定义的privateMethodParent类中的privateMethod没有重写关系,各自在所属类的作用域内有效。