import java.util.*;
class Apple
{
private static long counter;
private final long id=counter++;
public long id(){return id;}
}
class Orange{}
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());
//apples.add(new Orange());//compile-time error
for(int i=0;i<apples.size();i++)
System.out.println(apples.get(i).id());//0 1 2
for(Apple c : apples)
System.out.println(c.id());
}
}
/* output:
0
1
2
0
1
2*/
为什么输出的结果是这样,我觉得应该是0 1 2 3 4 5.因为counter是static类型的变量。java泛型

解决方案 »

  1.   

    每一个Apple的id是固定的啊!除了new一个Apple的时候取值外,id和counter没关系。。
      

  2.   

    只new了3个Apple,new的时候输出结果是:
    counter:1
    id:0
    counter:2
    id:1
    counter:3
    id:2两个for循环是一样的,输出结果可定是一样的
      

  3.   


    package com.nyohh.test;import java.util.ArrayList;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());
    // apples.add(new Orange());//compile-time error
    } System.out.println("\nmain方法里面第一种id输出:");
    for (int i = 0; i < apples.size(); i++)
    {
    System.out.println(apples.get(i).id());// 0 1 2
    } System.out.println("\nmain方法里面第二种id输出:");
    for (Apple c : apples)
    {
    System.out.println(c.id());
    }

    }}class Apple
    {
    private static long counter;
    private final long id = counter++; public Apple()
    {
    System.out.println("添加进list时候,每个实例化苹果的id:"+id);
    } public long id()
    {
    return id;
    }
    }class Orange
    {
    }代码整理了下,在无参构造里面多添加了一句,这样就很清楚了,
    随后学习完反射时候你还可以在main方法里面直接拿到这边私有的成员变量值,那时候更容易看到
      

  4.   

    只创建了三次Apple,当然是0,1,2。为什么是0,1,2,3,4,5?
      

  5.   

    只new了三次apple对象怎么来你要的答案
      

  6.   

    三个apple对象在new的时候id已经被赋值了。你用get方法得到的id就不可能变了。  System.out.println(c.id());这个好像不能直接访问吧、
      

  7.   

    你的counter变量只是控制ID的增长,只有三个对象,怎么可能是0,1,2,3,4,5?
      

  8.   

    值new了三次,另外你的输出方式的形式不一样而已,只是2中不同的语法,相同的结果的,第二种循环是java5新增的增强for循环而已,本质差不多