Java访问对象的属性和行为

用户使用new操作符创建一个对象后,可以使用“对象.类成员”来获 取对象的属性和行为。前文已经提到过,对象的属性和行为在类中是通 过类成员变量和成员方法的形式来表示的,所以当对象获取类成员时, 也相应地获取了对象的属性和行为。

【例】在项目中创建TransferProperty类,在该类中说明对象是 如何调用类成员的。

public class TransferProperty {
	int i = 47; // 定义成员变量
	
	public void call() { // 定义成员方法
		System.out.println("调用call()方法");
		for (i = 0; i < 3; i++) {
			System.out.print(i + " ");
			if (i == 2) {
				System.out.println("\n");
			}
		}
	}
	
	public TransferProperty() { // 定义构造方法
	}
	
	public static void main(String[] args) {
		TransferProperty t1 = new TransferProperty(); // 创建一个对象
		TransferProperty t2 = new TransferProperty(); // 创建另一个对象
		t2.i = 60; // 将类成员变量赋值为60
		// 使用第一个对象调用类成员变量
		System.out.println("第一个实例对象调用变量i的结果:" + t1.i++);
		t1.call(); // 使用第一个对象调用类成员方法
		// 使用第二个对象调用类成员变量
		System.out.println("第二个实例对象调用变量i的结果:" + t2.i);
		t2.call(); // 使用第二个对象调用类成员方法
	}
}

在Eclipse中运行上述代码,结果如图所示。

使用对象调用类成员运行结果
使用对象调用类成员运行结果

在上述代码的主方法中首先实例化一个对象,然后使用“.”操作符调 用类的成员变量和成员方法。但是在运行结果中可以看到,虽然使用两 个对象调用同一个成员变量,结果却不相同,因为在打印这个成员变量 的值之前将该值重新赋值为60,但在赋值时使用的是第二个对象t2调用 成员变量,所以在第一个对象t1调用成员变量打印该值时仍然是成员变 量的初始值。由此可见,两个对象的产生是相互独立的,改变了t2的i 值,不会影响到t1的i值。在内存中这两个对象的布局如图所示。

内存中t1、t2两个对象的布局
内存中t1、t2两个对象的布局

如果希望成员变量不被其中任何一个对象改变,可以使用static关键 字(前文曾经介绍过一个被声明为static的成员变量的值可以被本类或其 他类的对象共享)将上述代码改写为例的形式。

【例】在项目中创建AccessProperty类,该类举例说明对象调用 静态成员变量。

public class AccessProperty {
	static int i = 47; // 定义静态成员变量
	
	public void call() { // 定义成员方法
		System.out.println("调用call()方法");
		for (i = 0; i < 3; i++) {
			System.out.print(i + " ");
			if (i == 2) {
				System.out.println("\n");
			}
		}
	}
	
	public AccessProperty() { // 定义构造方法
	}
	
	public static void main(String[] args) { // 定义主方法
		AccessProperty t1 = new AccessProperty(); // 创建一个对象
		AccessProperty t2 = new AccessProperty(); // 创建另一个对象
		t2.i = 60; // 将类成员变量赋值为60
		// 使用第一个对象调用类成员变量
		System.out.println("第一个实例对象调用变量i的结果:" + t1.i++);
		t1.call(); // 使用第一个对象调用类成员方法
		// 使用第二个对象调用类成员变量
		System.out.println("第二个实例对象调用变量i的结果:" + t2.i);
		t2.call(); // 使用第二个对象调用类成员方法
	}
}

在Eclipse中运行上述代码,结果如图所示。

对象调用静态成员变量运行结果
对象调用静态成员变量运行结果

从上述运行结果中可以看到,由于使用t2.i=60语句改变了静态成员变量的值,使用对象t1调用成员变量的值也为60,这正是i值被定义为静 态成员变量的效果,即使使用两个对象对同一个静态成员变量进行操 作,依然可以改变静态成员变量的值,因为在内存中两个对象同时指向 同一块内存区域。t1.i++语句执行完毕后,i值变为3。当再次调用call() 方法时又被重新赋值为0,做循环打印操作。

发表评论