Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

子类声明同名静态方法会报错吗?属于重写吗?

先说出你的答案

定义边界、关键机制、一个反例;P8题再补容量、失败与验证。

查看完整题解

参考回答

直接回答

不一定报错。父子类声明相同签名的静态方法,在满足返回类型、可见性、final 等限制时可以构成方法隐藏,但不属于重写。调用哪个静态方法主要由编译期确定的类型决定,不会根据接收变量实际指向的子类对象进行普通实例方法式的动态分派。

讲清原理

隐藏也不是“什么同名声明都允许”。不能把继承的同签名实例方法改成 static,也不能把静态方法改成实例方法;父方法是 final 等情况也会限制子类声明。

从接口继承静态方法的规则又不同:接口的静态方法不作为普通继承方法交给实现类,通常应通过声明它的接口名称调用,不能把类的静态隐藏规则直接照搬过去。

重载先由编译期类型选方法,重写再由实际对象选实现
重载先由编译期类型选方法,重写再由实际对象选实现

例子与易错点

class Parent { static String kind() { return "Parent"; } }
class Child extends Parent { static String kind() { return "Child"; } }
Parent value = new Child();
System.out.println(value.kind()); // Parent
System.out.println(Child.kind()); // Child

第一种写法容易让人误认为由对象选择方法,应写成 Parent.kind()。给子类这个方法加 @Override 会失败;“不能覆盖 static”不等于“子类永远不能声明同名静态方法”。

相关题:第 4 题、第 6 题、第 36 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。