java 值类型与引用类型_下面这段java代码,当 T 分别是引用类型和值类型的时候,...

值类型就是基本类型。这道题考察的知识点很有意思,但题目答案是错的。

正确答案应该是,值类型产生了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: 删除原有回答

重新发布答案

删除了其它详细分析

添加了局部变量表佐证

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值