Java方法隐藏概念中“hiding”术语的意义及用法是什么?
理解Java静态方法中的「Hiding(隐藏)」机制
咱们来好好唠唠Java里静态方法的「隐藏」到底是啥意思,很多刚接触的同学容易把它和实例方法的重写搞混,其实二者的逻辑差得老远了!
什么是静态方法的「隐藏」?
当子类定义了一个和父类签名完全相同的静态方法时(方法名、参数个数/类型/顺序都得一致),我们就说子类的这个方法「隐藏」了父类的对应方法。
为啥叫「隐藏」而不是「重写」?
核心原因在于:静态方法是属于类本身的,不是属于对象实例的,它的调用逻辑和实例方法完全不同:
- 规范的做法是直接通过类名调用静态方法,比如
Parent.staticMethod()或者Child.staticMethod(),这时候调用哪个方法一目了然,直接看类名就行。 - 但如果有人图方便用对象引用来调用静态方法(划重点:这是非常不推荐的不良实践!),这时候执行的方法是看引用的编译时类型,而不是对象的实际运行时类型——这就是隐藏和重写最本质的区别:重写的实例方法是看运行时类型,而隐藏的静态方法只认编译时类型。
用代码示例直观感受一下
class Parent { public static void printGreeting() { System.out.println("Hello from Parent!"); } } class Child extends Parent { public static void printGreeting() { // 这里隐藏了父类的printGreeting方法 System.out.println("Hello from Child!"); } } public class StaticHidingDemo { public static void main(String[] args) { // 规范调用:通过类名,逻辑清晰 Parent.printGreeting(); // 输出: Hello from Parent! Child.printGreeting(); // 输出: Hello from Child! // 不规范的引用调用:看编译时类型 Parent parentRef = new Child(); parentRef.printGreeting(); // 输出: Hello from Parent!(因为parentRef的编译类型是Parent) Child childRef = new Child(); childRef.printGreeting(); // 输出: Hello from Child!(编译类型是Child) } }
几个关键要点总结
- 静态方法的隐藏只发生在子类与父类拥有完全相同签名的静态方法时;
- 隐藏的本质是子类的静态方法在子类范围内,覆盖了父类同名静态方法的可见性;
- 强烈建议永远通过类名调用静态方法,不要用对象引用,否则会让代码逻辑变得模糊,埋下bug隐患。
内容的提问来源于stack exchange,提问作者greenHorn
相关产品推荐
相关产品推荐

