1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Main  {
    public void test(Object object) {
        System.out.println("Object");
    }
     // class X(){}

    public void test(String s){
        System.out.println("String");
    }
    // public void test(X x){
    //      System.out.println("X");
    // }
    static String  s1 ,s0;
    public static void main(String[] args) {
     // 第一题
        Main main = new Main();
        main.test(null);
     // 第二题
        String a = "abc";
        String b = "ab" + "c" ;
        System.out.println(a == b);

     // 第三题
        s0 = s1 + s0;
        System.out.println(s0);
    }
}

第一题 输出的是 String
因为在调用方法时 null可以匹配不同的重载版本 但是String s 的方法更为具体 所以选择他
如果是同样的具体的类 譬如说X 这样test.(null)方法时 因为X 和 String 都具体 所以会报
Ambiguous method 错误

第二题 输出true
这里考察的是编译时常量 和常量的折叠 以及String interning的知识
“abc” “a” “bc” 在Java里都是String类型的编译时常量 + 左右两侧都是常量时 这个+表达式也会被认为是编译时常量表达式

第三题 输出 nullnull

考察了静态变量的默认初始化 以及String的连接 +
静态变量会在类加载过程的linking阶段得到默认初始化 引用类型的静态变量会被默认初始化为null
然后是String 对象的连接 s0 = s1 + s0; 是一个语法糖
会被解糖为 s0 = new StringBuilder.append(s0).append(s1).toString();
StringBulider 根据规范 会把null的字符串 当做”null” 所以最后输出nullnull

TAT 我真是菜哭了….
还要好好学Java

Categories:

Updated: