问题描述
for(inti=0;i<8;i++){String[]s=newString[i];}在java中,数组不是不可以同名的,但是在这个循环里,可以运行,不是每循环一次都从新NEW一个同名数组出来,为什么允许这样子来的,还有,这样子来新产生的数组跟之前产生的数组到底是个什么样子的关系,是包含,还是覆盖?如果是覆盖,那之前产生的数组里的内容是不是就废了???
解决方案
解决方案二:
s是局部变量,其作用域就是从定义的地方开始到for结束。所以每次循环结束时,在这次循环中定义的s已经变成垃圾了,也就是说变量s不指向该数组了。
解决方案三:
不是包含也不是覆盖。。。只是将将变量s指向了新分配的String数组的内存空间。。之前的丢失的内存JVM会自动回收
解决方案四:
每次循环都new一个新的数组覆盖,之前的会被回收掉~
解决方案五:
每次都会new,因此在堆里面会重新建立一块区域,新建的s和之前的是没有关系的,只是每次大小在变大,这个既不是包含,也不是覆盖。publicclassaaa{publicstaticvoidmain(String[]args){for(inti=0;i<8;i++){String[]s=newString[i];System.out.println(Arrays.toString(s));}}}
下面是打印结果:[][null][null,null][null,null,null][null,null,null,null][null,null,null,null,null][null,null,null,null,null,null][null,null,null,null,null,null,null]
解决方案六:
String[]s=newString[i];这句里s不是数组的名字,它只是一个变量,用来接收后面new出来的数组对象的引用。你每次new出来的数组的引用会覆盖前面的引用,导致以前的数组无法访问。短期内以前的数组还会存在于堆中,知道gc回收它。新数组跟以前的数组没有关系!~
解决方案七:
每次都产生一个新的数组,前面的string[]s只是一个引用,每次引用内存中产生的一个新的对象,前面的一个对象就成为了垃圾,等待jvm的垃圾回收机制自动回收。
解决方案八:
程序里面定义的S是一个局部变量啊,出了大括号就没意义了,下一次在new的时候不是前一次的s了,写出的代码:importjava.util.Arrays;publicclassTest{publicstaticvoidmain(String[]args){for(inti=0;i<8;i++){String[]s=newString[i];System.out.println(Arrays.toString(s));}}}输出地结果是:[][null][null,null][null,null,null][null,null,null,null][null,null,null,null,null][null,null,null,null,null,null][null,null,null,null,null,null,null]
解决方案九:
引用1楼hudie1234567的回复:
s是局部变量,其作用域就是从定义的地方开始到for结束。所以每次循环结束时,在这次循环中定义的s已经变成垃圾了,也就是说变量s不指向该数组了。
楼上准确
解决方案十:
string类是不可修改的类,不管你同不同名,在String池中都会new出来,但是表面上看起来是同名的,实际上有着不同的名字,如同C++的指针、引用一样
解决方案十一:
不是说数组不能有同名,而是在一定的范围内不能有重复的变量名程序设计语言有这样的规定,是因为重复的变量名会引起歧义