是什么决定是应该调用静态方法还是对象方法

Egg*_*ans 3 java

只是一个普通的查询是由某人意外地给一个类的变量赋予一个名称,该名称与另一个类匹配,其中两个类都有一个同名的方法,其中一个是静态的.

鉴于以下内容:

public class A {
    public static String dothis(String string){
        return "Class";
    }

    public static String dothis(String string, String string2){
        return "Class Method 2";
    }
}
Run Code Online (Sandbox Code Playgroud)

还有这个

public class B {    
    public String dothis(String string){
        return "Object";
    }
}
Run Code Online (Sandbox Code Playgroud)

一旦对象被实例化,以下是否总是调用对象而不是静态方法?

System.out.println(A.dothis("..."));//outputs Class
B A = new B();
System.out.println(A.dothis("..."));//outputs Object
Run Code Online (Sandbox Code Playgroud)

实例化后的Nb似乎不可能在A类中调用任何静态方法,即

B A = new B();
System.out.println(A.dothis("..."));
System.out.println(A.dothis("...","..."));//Won't compile
Run Code Online (Sandbox Code Playgroud)

上面不会编译抱怨错误的树型,

编辑:添加了特定的例外: -

java.lang.RuntimeException: Uncompilable source code - Erroneous tree type: <any>
    at testbed.....
Run Code Online (Sandbox Code Playgroud)

...这是否意味着编译器有效地决定调用哪个方法,因此差异javac版本的行为可能会有所不同.

这里发生了什么,如果这有保证,它可以用于某种方式的混淆,还是反编译会删除名称冲突?

Jon*_*eet 7

这样做之后:

B A = new B();
Run Code Online (Sandbox Code Playgroud)

...标识符A指的是变量,而不是类.

为避免出现问题,请不要这样做......

这里发生了什么,如果这有保证,它可以用于某种方式的混淆,还是反编译会删除名称冲突?

这完全取决于反编译器.如果它足够聪明地识别问题,它可以将局部变量重命名为不会发生冲突的变量.

  • 同意.这是尊重Java命名约定的另一个好理由:类以大写字母开头,而变量以小写字母开头.如果尊重这些惯例,那么这样的冲突是不可能的. (3认同)