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循环为什么有这样的区别?

解决方案 »

  1.   

    for(A a:arr)
            {
                a=new A();
            }在 A a : arr时, 引用a 首先指向arr[0],
    然后, a = new A();, a 重新指向一个新创建的A对象,而arr[0]没有指向这个新创建的A对象,仍然为null.
    同理可推arr[1] arr[2]的情况.
      

  2.   

    用forEach循环的时候发生了几件事,我给你按顺序列出来:1、创建一个引用a,指向arr[0],即A a = arr[0];
    2、当调用a = new A()的时候你改变的是a的引用,不是arr[0];
    3、当你再次使用arr[0]时,得到的是null,而此时a的引用确实是一个A类对象,只不过出了for循环这个引用a就被收回了!
      

  3.   

    你遍历的时候最终结果是看引用 arr[0]、arr[1]、arr[2]有没有指向对象,所以你改成arr[i]=new A()之后,它们就确实有指向对象了!你输出默认是调用对象的toString()方法看到A@...
      

  4.   

    似乎应该是这样的。
    这样说来怎么样通过foreach循环来改变 数组中的值?
      

  5.   

    这并不是for和foreach的原因,你的代码里那个getArr()是不起任何作用,你声明的变量是全局的,而且方法调用都是在一个类里
    你可以试试下面的代码,证明不是那个原因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),以及构造器有关,现在还没有相通,我也是刚刚学,就只能知道这么一点
      

  6.   

      for(A a:arr)
            {
                a=new A();
            }
    并没有改变arr的值,只是在for each中创建了一个局部变量a
      

  7.   

    还是第一次听说这个foreach循环呢!