面试题答案
一键面试- 静态方法不能被重写
- 原因:静态方法属于类,而非实例。在Java中,重写是基于运行时的动态绑定,针对的是实例方法,根据对象的实际类型来决定调用哪个方法。而静态方法在编译期就已经确定了调用关系,属于静态绑定。
- 代码示例:
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 parent = new Child();
parent.staticMethod(); // 输出:Parent's static method
Child.staticMethod(); // 输出:Child's static method
}
}
在上述代码中,parent.staticMethod()
调用的是Parent
类的静态方法,因为静态方法是根据引用类型(Parent
)来确定调用的,而不是根据对象的实际类型(Child
)。
- 私有方法不能被重写
- 原因:私有方法在类内部使用,对子类不可见,所以不存在重写的概念。
- 代码示例:
class Parent {
private void privateMethod() {
System.out.println("Parent's private method");
}
}
class Child extends Parent {
// 这里不是重写,只是在Child类中定义了一个新的私有方法
private void privateMethod() {
System.out.println("Child's private method");
}
}
public class Main2 {
public static void main(String[] args) {
Parent parent = new Child();
//parent.privateMethod(); // 编译错误,无法访问父类私有方法
}
}
在这个例子中,parent.privateMethod()
会导致编译错误,因为私有方法不能在类外部(包括子类)访问。Child
类中的privateMethod
只是一个新的私有方法,与父类的私有方法没有重写关系。
- 多态场景下“貌似重写”的实际运行机制
- 静态方法:如前面代码所示,在多态场景下,当通过父类引用调用静态方法时,实际调用的是父类的静态方法,不会因为对象的实际类型是子类而调用子类的静态方法。这是因为静态方法的调用不依赖于对象的实际类型,而是依赖于引用的类型。
- 私有方法:由于私有方法对子类不可见,不存在多态的“貌似重写”情况。在类的内部,调用私有方法是基于当前类的定义,与对象的实际类型无关。如果子类定义了一个同名的私有方法,它与父类的私有方法是完全独立的,不会产生重写相关的动态绑定效果。