例1:
1 public class Test { 2 int i = 47; 3 public void call(){ 4 for (i = 0; i < 3; i++){ 5 System.out.print(i+" "); 6 if(i == 2){ 7 System.out.println("\n"); 8 } 9 } 10 } 11 public Test(){ 12 } 13 public static void main(String[] args) { 14 Test t1 = new Test(); 15 Test t2 = new Test(); 16 t2.i = 60; 17 System.out.println(+t1.i); 18 t1.call(); 19 System.out.println(+t2.i); 20 t2.call(); 21 } 22 23 }
运行结果:
47
0 1 2
60
0 1 2
分析:
在上述代码的主方法中首先实例化一个对象,然后使用“.”操作符调用成员变量和成员方法,但是从运行结果可以看到,虽然使用两个对象调用同一个成员变量,结果却不同,因为在打印这个成员变量值之前将该值重新赋值为60,单在赋值使用时的是第二个对象t2对象调用成员变量,所以在第一个对象t1调用成员变量打印该值时仍然是成员变量的初始值。由此可见,两个对象的产生是相互独立的,改变了t2的值,不会影响到t1的 i 的值。在内存中如下图所示:
如果希望成员变量不被其中任何一个对象改变,可以使用static关键字,代码如下:
1 public class Test { 2 static int i = 47; 3 public void call(){ 4 for (i = 0; i < 3; i++){ 5 System.out.print(i+" "); 6 if(i == 2){ 7 System.out.println("\n"); 8 } 9 } 10 } 11 public Test(){ 12 } 13 public static void main(String[] args) { 14 Test t1 = new Test(); 15 Test t2 = new Test(); 16 t2.i = 60; 17 System.out.println(+t1.i); 18 t1.call(); 19 System.out.println(+t2.i); 20 t2.call(); 21 } 22 23 }
运行结果:
60
0 1 2
3
0 1 2
分析:
从上述运行结果中可以看到,由于使用t2.i=60语句改变了静态成员变量的值,使用对象t1调用成员变量的值也是60,这正是i值被定义为静态成员变量的效果,即使使用两个对象对同一个静态成员变量进行操作,依然可以改变静态成员变量的值,因为在内存条中两个对象指向同一块内存区域,t1.i++语句执行后,i的值变为3,当再次调用call()方法时又被重新赋值为0,做循环打印操作。
时间: 2024-12-19 04:55:24