再来个in java题目

skyair2004 2009-07-09 10:43:39
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三个呢?
实在费解啊?
...全文
26 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
JACKY_fFENG 2009-07-09
  • 打赏
  • 举报
回复
最后输出的结果是 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引用这个变量不再指向它了。
zuoguodang 2009-07-09
  • 打赏
  • 举报
回复
你是声明为final了,但是你每次都创建新的对象了,所以并没有对同一对象的id进行操作,counter你声明为static那么它就归类所有,而不归类实例所有,它是可变的。
jinxfei 2009-07-09
  • 打赏
  • 举报
回复
final的意思是从第一次赋值起不能被改变。

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

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧