首页 > 代码库 > 访问对象属性和方法

访问对象属性和方法

例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,做循环打印操作。

 

访问对象属性和方法