值类型就是基本类型。这道题考察的知识点很有意思,但题目答案是错的。
正确答案应该是,值类型产生了0个或1个数值类型。
产生了1个数值类型
数值类型: public static void main(String[] args) {
int a = 200;
println(a);
}
static void println(int a){}
反编译class文件: public static void main(java.lang.String[]);
Code:
0: sipush 200
3: istore_1
4: iload_1
5: invokestatic #7 // Method println:(I)V
8: return
static void println(int);
Code:
0: return
sipush将16位带符号整数压入栈,istore_1将int类型值存入局部变量1,iload_1从局部变量1中装载int类型值,然后调用println方法。
整个过程只产生了0个对象和1个数值类型。
产生了0个数值类型 public static void main(String[] args) {
int a = 1;
println(a);
}
static void println(int a){}
反编译class文件: public static void main(java.lang.String[]);
Code:
0: iconst_1
1: istore_1
2: iload_1
3: invokestatic #7 // Method println:(I)V
6: return
static void println(int);
Code:
0: return
iconst_1 将int类型常量1压入栈,istore_1将int类型值存入局部变量1,iload_1从局部变量1中装载int类型值,然后调用println方法。
在我的运行环境中,0-5的数值都将取常量值。
这里是从常量池中取出了常量1,整个过程产生了0个对象和0个数值类型。
局部变量表佐证
代码: static void simple() {
int a = 1;
}
static void test() {
int a = 200;
println(a);
}
static void println(int a){}
static void printlnB(int a){}
反编译class文件: {
static void simple();
descriptor: ()V
flags: ACC_STATIC
Code:
stack=1, locals=1, args_size=0
0: iconst_1
1: istore_0
2: return
LineNumberTable:
line 12: 0
line 13: 2
LocalVariableTable:
Start Length Slot Name Signature
2 1 0 a I
static void test();
descriptor: ()V
flags: ACC_STATIC
Code:
stack=1, locals=1, args_size=0
0: sipush 200
3: istore_0
4: iload_0
5: invokestatic #7 // Method println:(I)V
8: return
LineNumberTable:
line 6: 0
line 7: 4
line 8: 8
LocalVariableTable:
Start Length Slot Name Signature
4 5 0 a I
static void println(int);
descriptor: (I)V
flags: ACC_STATIC
Code:
stack=0, locals=1, args_size=1
0: return
LineNumberTable:
line 9: 0
LocalVariableTable:
Start Length Slot Name Signature
0 1 0 a I
static void printlnB(int);
descriptor: (I)V
flags: ACC_STATIC
Code:
stack=0, locals=1, args_size=1
0: return
LineNumberTable:
line 10: 0
LocalVariableTable:
Start Length Slot Name Signature
0 1 0 a I
}
println方法时被调用的并传入了参数,printlnB是未被调用的;二者的反编译代码几乎一致,局部变量表也一致且长度都为1,而simple方法的局部变量表长度也为1。
更多分析可以去我的博客看:
Update 20200814 Description: 删除原有回答
重新发布答案
删除了其它详细分析
添加了局部变量表佐证