Java父子类同签名静态方法隐藏规则及运行输出问题咨询
问题解释
你对Java静态方法「隐藏」的规则理解存在偏差,实际运行结果是完全符合Java语法规范的,核心原因如下:
- 静态方法属于类本身,和实例无关,调用时绑定的是你显式指定的类,不存在实例方法那样的动态多态分派。
- 子类和父类存在同签名静态方法时,是子类的静态方法隐藏父类的同签名静态方法,而非父类方法覆盖子类方法。
你代码里的两处调用逻辑非常明确:
- 调用
Obcount.num_obj():显式指定调用父类Obcount的静态方法,因此输出i am parent class。 - 调用
Doing.num_obj():显式指定调用子类Doing的静态方法,子类已经实现了同签名的num_obj(),会优先用子类自身的实现,因此输出i am child class。
你可能混淆了向上转型场景下的隐藏表现:如果写的是
Obcount test = new Doing(1,2); test.num_obj();,此时输出才会是i am parent class,因为静态方法看的是变量的声明类型(此处是Obcount)而非实际实例类型,这才是「隐藏」的含义:当通过父类类型调用时,父类的方法会被子类隐藏的实现又显露出来,不会像实例方法重写那样走实际实例的实现。
内容的提问来源于stack exchange,提问作者Uzair Baig
相关产品推荐
相关产品推荐

