§5.1.2和§5.6.2没有提到常量的数字推广和扩展工作.
以下给出了预期的错误:
short a = 2;
short b = 3;
short s = a + b; // error: incompatible types: possible lossy conversion from int to short
Run Code Online (Sandbox Code Playgroud)
但如果它们被宣布为final,则编译没有错误:
final short a = 2;
final short b = 3;
short s = a + b; // no error
Run Code Online (Sandbox Code Playgroud)
这是为什么?规格的哪一部分解释了这一点?
我的猜测是它们是编译时常量,因此被视为整数.
我运行以下代码并获得评论中显示的结果.我知道之间的差异==和.equals().我不明白的是为什么我的第二行代码与第三行代码的结果不同.
String de = "de";
// String abcde = "abc" + "de"; // abcde == "abcde" reture true
String abcde = "abc" + de; // abcde == "abcde" reture false;
System.out.println();
System.out.println(abcde=="abcde");
System.out.println(de=="de");
Run Code Online (Sandbox Code Playgroud)
在尝试调试时,我使用了javap -c命令并为第一个字符串连接获得了以下输出'code':
Code:
0: ldc #9; //String de
2: astore_1
3: new #10; //class java/lang/StringBuilder
6: dup
7: invokespecial #11; //Method java/lang/StringBuilder."<init>":()V
10: ldc #4; //String abc
12: invokevirtual #12; //Method java/lang/StringBuilder.append:(Ljava/lang
String;)Ljava/lang/StringBuilder;
15: aload_1
16: invokevirtual #12; //Method java/lang/StringBuilder.append:(Ljava/lang
String;)Ljava/lang/StringBuilder;
19: invokevirtual …Run Code Online (Sandbox Code Playgroud)