对象和对象引用
在学习到面对对象的时候,大家对对象和对象引用可能不是太理解,这里简单的给大家说一下
为方便说明,先定义一个简单的类:
public class Pet { public String name; public int age; public int health; public Pet() { super(); } public Pet(String name, int age, int health) { super(); this.name = name; this.age = age; this.health = health; } public void show(){ System.out.println("哈哈"); } }
Pet pet1 = new Pet();
通常把这条语句的动作称之为创建一个对象,其实,它可以分解为三个步骤:
1)
public class TestPet { public static void main(String[] args) { System.out.println(new Pet("二哈",1,100).name); new Pet().show(); } }
上面的代码运行的结果是:
二哈
哈哈
2)
在学习变量的时候,我们在声明一个变量时,往往是这样写的:int a = 1;或者int a; a =1;
这样来看的话其实创建一个对象和声明一个变量是类似的,这里的Pet其实可以看做一个Pet类型
3)“=”操作符使对象引用指向刚创建的那个Pet对象。
Pet pet1;
pet1= new Pet();
效果是一样的。这样写,就比较清楚了,有两个实体:一是对象引用变量,一是对象本身。
对象连名都没有,没法直接访问它。我们只能通过对象引用来间接访问对象。
为了形象地说明对象、引用及它们之间的关系,可以做一个或许不很妥当的比喻。对象好比是一只很大的气球,大到我们抓不住它。引用变量是一根绳,可以用来系汽球。
如果只执行了第一条语句,还没执行第二条,此时创建的引用变量pet还没指向任何一个对象,它的值是null。引用变量可以指向某个对象,或者为null。它是一根绳,一根还没有系上任何一个汽球的绳。执行了第二句后,一只新汽球做出来了,并被系在pet这根绳上。我们抓住这根绳,就等于抓住了那只汽球。
再来一句:
Pet pet2;
就又做了一根绳,还没系上汽球。如果再加一句:
pet2= pet1;
系上了。这里,发生了复制行为。但是,要说明的是,对象本身并没有被复制,被复制的只是对象引用。结果是,pet2也指向了pet1所指向的对象。两根绳系的是同一只汽球。
这里就要说一下和基本数据类型的区别
基本数据类型:int a=1; int b=a; a=2; 打印出来a是2,b是1即a后面的变动不影响b的值
但是这里: pet1.name:=”二哈“; pet2= pet1; pet1.name="小黑"; 打印出来的pet2.name的值是会变化的(因为这里他们指向的是同一个对象)
如果用下句再创建一个对象:
pet2= new Pet();
则引用变量pet2改指向第二个对象。
从以上叙述再推演下去,我们可以获得以下结论:(1)一个对象引用可以指向0个或1个对象(一根绳子可以不系汽球,也可以系一个汽球);(2)一个对象可以有N个引用指向它(可以有N条绳子系住一个汽球)。
如果再来下面语句:
pet1= pet2;
按上面的推断,pet1也指向了第二个对象。这个没问题。问题是第一个对象呢?没有一条绳子系住它,它飞了。多数书里说,它被Java的垃圾回收机制回收了。这不确切。正确地说,它已成为垃圾回收机制的处理对象。至于什么时候真正被回收,那要看垃圾回收机制的心情了。
浙公网安备 33010602011771号