import java.util.*;
class Apple {
private static long counter;
private final long id = counter++;
public long id() {return id;}
}public class ApplesAndOrangesWithGenerics {
public static void main(String[] args) {
ArrayList<Apple> apples = new ArrayList<Apple>();
for (int i = 0; i < 3; i++) 
apples.add(new Apple());
for (int i = 0; i< apples.size(); i++) 
System.out.println(apples.get(i).id());
for (Apple c : apples )
System.out.println(c.id());
}
}这里的id()方法返回的id是个final long就应该是个常量,不能被改变吧?
可是为什么会输出0,1,2三个呢?
实在费解啊?
 

解决方案 »

  1.   

    final的意思是从第一次赋值起不能被改变。id这个变量是类的非静态成员变量,每次一个Apple对象被创建的时候初始化,而每次初始化都是counter++,当然又三个不同的值了。
      

  2.   

    你是声明为final了,但是你每次都创建新的对象了,所以并没有对同一对象的id进行操作,counter你声明为static那么它就归类所有,而不归类实例所有,它是可变的。
      

  3.   

    最后输出的结果是 0 1 2 0 1 2
    你声明的id的内存地址是初始地址也是最终地址,但是每调用一次id方法counter++,地址始终不变,改变的是id的值。
    我记得这个案例很像以前一个案例,
    问:String到底变了没有?
        String s=“hello”;
               s=s+“world!”;
    我觉得你说的问题和这个问题有相同性。s原先指向一个String对象,内容是“hello”,然后我们对s进行了“+”操作,s指向的对象并没有发生改变。这时,s不指向原来那个对象了,而指向了另外一个对象,内容为“hello world!”,原来那个对象还存在于内存之中,只是s引用这个变量不再指向它了。