面试题答案
一键面试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
类中定义的privateMethod
与Parent
类中的privateMethod
没有重写关系,各自在所属类的作用域内有效。