public class T
{
static A[] arr; {
arr = new A[3];
for(A a:arr)
{
a=new A();
}
} public static A[] getArr()
{
return arr;
} public static void main(String[] args)
{
T t = new T();
A[] arr = T.getArr();
for(int j=0;j<3;j++)
{
System.out.println(arr[j]);
}
}
}class A
{
public A()
{
System.out.println("A created");
}
}为什么打印
A created
A created
A created
null
null
null
而将for(A a:arr)
{
a=new A();
}
改成
for(int i=0;i<3;i++)
{
arr[i] = new A();
}
打印的就是
A created
A created
A created
A@...
A@...
A@...
(后面三行不是null值)用foreach循环和for循环为什么有这样的区别?
{
a=new A();
}在 A a : arr时, 引用a 首先指向arr[0],
然后, a = new A();, a 重新指向一个新创建的A对象,而arr[0]没有指向这个新创建的A对象,仍然为null.
同理可推arr[1] arr[2]的情况.
2、当调用a = new A()的时候你改变的是a的引用,不是arr[0];
3、当你再次使用arr[0]时,得到的是null,而此时a的引用确实是一个A类对象,只不过出了for循环这个引用a就被收回了!
这样说来怎么样通过foreach循环来改变 数组中的值?
你可以试试下面的代码,证明不是那个原因public class T
{
static A[] arr; {
arr = new A[3];
for(A a:arr)
{
a=new A();
}
for(int i=0;i <3;i++)
{
arr[i] = new A();
}
}
public static A[] getArr()
{
return arr;
} public static void main(String[] args)
{
T t = new T();
//A[] arr = T.getArr();
/*for(int j=0;j<3;j++)
{
System.out.println(arr[j]);
}*/
}
}class A
{
public A()
{
System.out.println("A created");
}
}以上代码输出的结果就一目了然,而为什么会有A@...这种输出一般是表示对对象的字符串,A@...就是对A描述的字符串,你可以看下面的代码:import java.util.*;
public class text
{
public static void main(String[] args)
{
B b=new B();
System.out.println(b);
}
}
class B
{
public B()
{
}
}
但是你那样的结果,既有null,又出现对象的描述。就不知道是怎么回事,但我想初始化块,变量(你的变量是static),以及构造器有关,现在还没有相通,我也是刚刚学,就只能知道这么一点
{
a=new A();
}
并没有改变arr的值,只是在for each中创建了一个局部变量a