public class TestField {
    static int i1 = 0;
    int i2 = 0;
    public TestField(){
     i1++;
     i2++;}
public static void main(String[] args) {
System.out.println(TestField.i1);
TestField tf1 = new TestField();
TestField tf2 = new TestField();
System.out.println(tf1.i1);
System.out.println(tf2.i1);
System.out.println(tf1.i2);
System.out.println(tf2.i2);
}}
为什么打印的是
0
2
2
1
1
本人基础较差 望详解

解决方案 »

  1.   

    public static void main(String[] args) {
    // TODO Auto-generated method stub

    System.out.println(test.i1); 
    test tf1 = new test(); 
    test tf2 = new test(); 
    System.out.println(tf1.i1); 
    System.out.println(tf2.i1); 

    System.out.println(tf1.i2); 
    System.out.println(tf2.i2); 

    i1是一个类的静态变量,类静态变量的意思就是所有属于这个类的实例都是公用一个的也就是说tf1,tf2实际上处理的是相同的一个i1。。
    而i2就不是了,tf1,和tf2各自有各自的i2
      

  2.   

    不错的题啊.我也有些不明白为什么i1=2了?我先把我明白的告诉你!因为i1定义的是static,所以在main方法中不需要创建TestField的对象就可以访问i1,所以 System.out.println(TestField.i1); 
    打印出0
    之后你创建了两个TestField对象,每次创建对象都会调用构造方法,也就是 public TestField方法.应为是i1++和i2++.是先调用后加,所以掉哦那个两次后
    我认为i1和i2都应该打印出的是1!!但是可能是调用静态成员变量的时候i1加了一次了,但是为什么加上了我也不知道!等待高手~~~~~~
      

  3.   

    对于这个问题,关键要弄清楚以下几个问题:
    1.静态成员变量:存储在内存的数据区,为类的所有对象所共有,也就是每一个对象访问它,都可以改变它的值,其它对象再访问的时候
                    其实访问的就是改变后的值;同时静态变量在不创建对象的情况下也可以访问。
    2.普通成员变量: 存储在内存的堆区,只有创建了对象才能访问,而且每个对象拥有该成员变量是相互独立的,也就是说对象A拥有成员变量i2,
                  对象B也拥有成员变量i2,A修改了成员变量,对对象B访问这一成员变量不会产生任何影响。弄清楚上面两个问题后,在来详细讨论你的这个问题:
    public class TestField { 
      static int i1 = 0; 
      int i2 = 0; 
      
      public TestField(){ 
        i1++; 
        i2++;
      }   public static void main(String[] args) { 
        System.out.println(TestField.i1); //访问静态变量初始值为0.
        TestField tf1 = new TestField();  //调用构造函数,静态变量加1后i1=1;tf1.i2=1
        TestField tf2 = new TestField();  //调用构造函数,静态变量再加1,i1=2;tf2.i2=1
        System.out.println(tf1.i1); 
        System.out.println(tf2.i1);  //静态变量为所有的对对象所共用,所以都输出2.
        System.out.println(tf1.i2);  
        System.out.println(tf2.i2); 
      } 

      

  4.   

    i2是实例变量 从属于对象
    i1是类变量 从属于类public TestField(){ 
        i1++; 
        i2++;

    为构造函数每次类构造一个对象 i1都加一次  构造了2次 所以是2
      

  5.   

    static变量属于类变量,只加载一次。
      

  6.   

    调用了两次构造函数
    i1是静态的,所以i1++了2次,i1变为2 tf1.i1和tf2.i1都=2
    i2属于对象的,每个对象都有各自的i2,i2++对于每个对象来说对+了一次
    所以tf1.i2和tf2.i2都=1
      

  7.   

    这是静态类变量和非静态类变量的问题,静态变量可以理解为全局变量,在类中始终保留一份,所有对象共享一份内存,所以无论声明多少对象,各对象引用的数值都是一样的。非静态变量对于每个对象都会新开辟一块内存,在各对象中各占一块内存,大家互不干扰。建议把java编程思想看看吧,里面写的很详细。
      

  8.   

    static变量独立于对象,属于类,一个对象对该变量的改变会影响所有其它的对象!
      

  9.   

    i1是静态变量,i2是普通变量,i1属于类,只有一份拷贝,i2属于对象,可以有多个拷贝。
      

  10.   

    类变量即静态变量,指static修饰的变量。静态变量与实例变量的区别:1、静态变量在装载类的时候被分配内存并初始化,类只能被装载一次,所以静态变量在内存中只有一个拷贝
    2、实例变量在创建实例时被分配内存并初始化,所以每个实例都有各自的实例变量
    3、同一个类的实例之间共享静态变量
      

  11.   

    public static void main(String[] args) { 
    // TODO Auto-generated method stub System.out.println(test.i1); 
    test tf1 = new test(); 
    test tf2 = new test(); 
    System.out.println(tf1.i1); 
    System.out.println(tf2.i1); System.out.println(tf1.i2); 
    System.out.println(tf2.i2); 

    i1是一个类的静态变量,类静态变量的意思就是所有属于这个类的实例都是公用一个的 也就是说tf1,tf2实际上处理的是相同的一个i1。。 
    而i2就不是了,tf1,和tf2各自有各自的i2
    以上2楼说的已经很清楚了!
    问题的关键是这里“static int i1 = 0; ”   这是所有对象公用的变量,即使被别的类引用并修改了,也会影响到本类的对象。    i1就是传说中的类变量。而i1,是类的一个域,没有个类都有自己专门的自己的i1,不同的对象都操作的自己的“i1”,大家互不影响!就是static在作怪了!
    另外两个建议:1、楼主注意结贴啊,你的结贴率太低了,(及时结贴是对回帖人最起码的尊重 呵呵

    2、代码按论坛的格式来,要不看着乱
    good luck!!!
      

  12.   

    静态成员首先程序运行的时候 就在  一块区域分配了一个空间, 而实例 每用new的时候调用类本身的构造器 就会重新再 分配一块区域 
    而且除了这个类的 静态成员以外 每new 一次  这个类的 成员都会初始化  而静态成员的 不受这个类实例化的 影响。
      

  13.   

    i1是一个类的静态变量,i1是属于类的,只有一个,跟你创建多少对象毫无关系! 即你创建了n个对象,那么你用这n个对象去操纵i1都是同一个i1  
      而实例变量不一样,你每次new一个实例就会有一个i2的版本,不同的对象操纵不同的i2,所以 你刚才的程序,应该是加载类的时候static i1=0;  你调用一次构造方法i1++;因为你new了两次,所以i1是2   而对应不同对象的i2都只做了一次++,所以是1啊