作用域问题,每个作用域都有自己单独的存储空间,存储空间分栈和域,栈必须唯一。你给的案例中,s1存在栈里面,new students分配了空间存在域里面。
单次循环是一个作用域,for循环外面又是一个作用域。
感谢解答
应该是与访问权限有关,你可以搜一下 成员变量和局部变量,static和非static等等的区别。 当for循环里的s创建之后也是只有在{}里面才能访问的到,当你第二次循环已经出了{},再次进入{}相当于一个新对象了。
但是循环Arraylist却能累计
感谢解答
关键词变量作用域
你给的代码for里也并没有创建同名对象
for() {
students s = new students();
students s = new students();
}
才等价于你下面的2个 students s1 = new students();
作用域的问题嘛?
@戈壁老王-: 是的 {}
就是一个代码块,一个代码块内不能重复,所谓的for循环在循环到第2次时已经是新的代码块了。你的代码循环3次就好比
{
students s = new students();
}
{
students s = new students();
}
{
students s = new students();
}
@复制粘贴机器人: 还有个问题,ArrayList对象的变量在循环里面为什么可以累加啊?
@戈壁老王-: 你的意思是在for循环中add(s)?
@复制粘贴机器人: 是的,还是说不是变量类型ArrayList的功能,是这个add方法的功能?
@戈壁老王-: 都无关。就相当于
{
students s = new students();
list.add(s);
}
{
students s = new students();
list.add(s);
}
{
students s = new students();
list.add(s);
}
@复制粘贴机器人:
但是我每次循环都给s对象成员变量赋值了,最后数组是个3个对象而不是1个
@戈壁老王-: 我上面不是给代码了么,就相当于那段代码的效果。3个代码块,每个代码块里新定义了一个s,并把s加入到数组里去
@复制粘贴机器人: 感谢解答
这确实是一个很初级的问题。涉及到不同的作用域。案例中for循环内部与外部是不同的作用域。外部s1属于同名变量。但是你想让他们指向不同的内存地址,这是不合理的。而for内部属于每次新建一个变量从新负值。是安全的。合理的。
– CallMeEureka 1年前@CallMeEureka: 感谢解答
– 戈壁老王- 1年前