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
本人基础较差 望详解
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
本人基础较差 望详解
解决方案 »
- 【提问】怎么通过程序让电脑发出报警声音
- 纠结!!!xml实时读取,求解????
- 关于生成对象时,类的初始化顺序的问题
- 难道现在就剩下DONET和java了
- 如何获取JPanel的graphics context?
- JAVA汉化的问题
- 忙了两天了,也不知如何解决! 急,在线等待!!!
- 很简单的问题???
- 我学了JAVA半年了,但没有看见过用JAVA做的大软件,请问哪些软件是JAVA写的,发给我看看!
- java函数传参数有“传值”与“传引用(指针)”之分吗?
- 如何办到可以在jtextarea上移动光标,但是不可以修改其文本内容
- 小弟刚刚学习C语言做了个哈希的统计同学他们班要java的谁能帮忙把我的改成java的?
// 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
打印出0
之后你创建了两个TestField对象,每次创建对象都会调用构造方法,也就是 public TestField方法.应为是i1++和i2++.是先调用后加,所以掉哦那个两次后
我认为i1和i2都应该打印出的是1!!但是可能是调用静态成员变量的时候i1加了一次了,但是为什么加上了我也不知道!等待高手~~~~~~
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);
}
}
i1是类变量 从属于类public TestField(){
i1++;
i2++;
}
为构造函数每次类构造一个对象 i1都加一次 构造了2次 所以是2
i1是静态的,所以i1++了2次,i1变为2 tf1.i1和tf2.i1都=2
i2属于对象的,每个对象都有各自的i2,i2++对于每个对象来说对+了一次
所以tf1.i2和tf2.i2都=1
2、实例变量在创建实例时被分配内存并初始化,所以每个实例都有各自的实例变量
3、同一个类的实例之间共享静态变量
// 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!!!
而且除了这个类的 静态成员以外 每new 一次 这个类的 成员都会初始化 而静态成员的 不受这个类实例化的 影响。
而实例变量不一样,你每次new一个实例就会有一个i2的版本,不同的对象操纵不同的i2,所以 你刚才的程序,应该是加载类的时候static i1=0; 你调用一次构造方法i1++;因为你new了两次,所以i1是2 而对应不同对象的i2都只做了一次++,所以是1啊