Java类中同名静态与非静态方法的调用优先级问题
问题解答
代码示例
public class test2 { public static void main(String[] args) { A a = new A(); int y = 5; System.out.println(a.foo(y)); } } class A{ public A() { } public int foo(int x) { return x+1; } public static int foo(int x) { return x+2; } }
核心问题解答
执行的方法:会执行非静态的
foo(int x)方法,最终输出结果为6。优先执行的原因:
- Java语法规则中,当通过实例对象调用方法时,编译器会优先匹配非静态实例方法。静态方法属于类本身,规范上应通过类名直接调用;即便语法允许用实例对象调用静态方法,只要存在签名完全一致的实例方法,编译器会优先选择实例方法——因为实例方法与对象实例绑定,调用时会隐含传递
this引用,而静态方法不依赖实例,不属于对象的成员。
- Java语法规则中,当通过实例对象调用方法时,编译器会优先匹配非静态实例方法。静态方法属于类本身,规范上应通过类名直接调用;即便语法允许用实例对象调用静态方法,只要存在签名完全一致的实例方法,编译器会优先选择实例方法——因为实例方法与对象实例绑定,调用时会隐含传递
是否与定义顺序有关:完全无关。Java对方法的匹配逻辑基于调用方式和方法类型(静态/非静态),和方法在类中的定义先后顺序没有任何关联。哪怕把静态
foo方法写在非静态foo之前,通过实例对象调用时,依然会选择非静态方法。
内容的提问来源于stack exchange,提问作者Beier Mu
相关产品推荐
相关产品推荐

