为了账号安全,请及时绑定邮箱和手机立即绑定

for循环造对象,造了很多重复的s对象,为什么不报错?

for循环造对象,造了很多重复的s对象,为什么不报错?

眼眸繁星 2019-03-14 14:14:57
查看完整描述

6 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

// 循环执行 10 次,会产生 10个 {} 代码块,互不冲突

for (int i = 0;i < 10;i ++) { // ↓

    int s = i; // 中间这一部分是 s 的作用域,出了作用域 s 是不存在的

} // ↑


查看完整回答
反对 回复 2019-04-24
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

  1. 首先s是int类型,属于基本类型,不是Object类型,因此不存在“创建很多重复的s对象”之说

  2. 这里创建的是int类型的变量,这个变量是存在栈里的

  3. 即使你把循环次数设置成Integer.MAX_VALUE,也不会报错,具体原因不知道,不过编译器会优化代码,使得实际上每次使用的都是同一块内存区域,而不是每次都开辟一块新的内存区域


查看完整回答
反对 回复 2019-04-24
?
开满天机

TA贡献1786条经验 获得超13个赞

你可以试试Integer 哈哈


查看完整回答
反对 回复 2019-04-24
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

1、首先你要理解的是这里并没有一个名叫s的对象,代码中的s,以及i,只不过是对象的引用,相当于C语言中的指针,它只是指向这个对象空间的一个标志。
2、你的每次的for循环,都在声明一个同名的引用,那么这时候编译器是能够分辨出来这些同名的引用的,所以无论循环多少次,实际上你只拥有一个名叫‘s’的引用。而且它初始化在第一次for循环,以后的每次循环都是在给这个同名的引用赋值。
3、如果想看打印结果,把system.out放到局部变量的有效域内。

查看完整回答
反对 回复 2019-04-24
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

1.这段代码没造对象,int是基本数据类型,不是对象。
2.这段代码会被编译器优化,结果我猜可能是 int s = 9;这样的形式,你可以javap一下看看

查看完整回答
反对 回复 2019-04-24
?
ITMISS

TA贡献1871条经验 获得超8个赞

int何来的对象,只不过不断改变栈的值而已


查看完整回答
反对 回复 2019-04-24
  • 6 回答
  • 0 关注
  • 588 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信