刚学java时,书上的名词对我来说每一个都是十分难理解的,又不敢查,因为害怕查一个词又会出现更多不懂的词汇。也正因此在很长一段时间里,总觉得基本概念十分模糊。尤其当进入到第六章的学习后,老是把对象和对象的引用混为一谈。可是我发现,如果分不清对象与对象引用,那实在没法很好地理解下面的面向对象技术。所以我把自己对二者的理解写下来,希望能帮助刚学到这里同学更好的理解二者的区别。
首先,咱们先创建一个类
class Person{
public String name;
public String sex;
public int age;
}
通过这个类创建一个对象:
Person per1 = new Person();
仔细看上面这句话,它包含了四个内容:
一是“Person per”,这表示什么意思?它创建了“Person”类的引用变量,这个变量名叫“per1”;
二是“new Person”,他表示新建一个对象,并在堆内存中开辟一个空间用来存放这个对象;
三是“()”,表示创建这个对象的同时也调用了它的无参构造方法,如果你没给这个类定义构造方法,系统会自动为我们生成一个无参的构造方法;
四是“=”,表示左边建的引用变量指向了新建的对象;
我们来这样写:
Person per1;
per1 = new Person();
这样看起来会更清晰点,但我现在有一个问题,这个对象叫什么名字?它叫“per1”吗?不对,“per1”是变量名,是一个变量,“per1”这个变量现在指向的是咱们新建的这个对象,但这个对象不叫“per1”。那它叫“Person”吗?也不对,“Person”是类名,咱们之后创建的对象不止一个,不能每一个都叫“Person”。那这个对象它就没有名字,它是一个抽象的东西。我们引用它就只能通过对象引用变量“per1”(暂时先不管匿名对象)。
今天开会牛燕尾学长讲了类比的概念,我印象很深,因为类比也是我用来理解新事物最常用的方法。

那我们就把对象实例类比成气球,把对象引用变量类比成系在气球上的线。那上面的代码中第一句话表示定义了一根线,第二句话则新建了一个气球并让这根线系在这个气球上。现在再定义一个类变量:
Person per2;
现在这个变量不指向任何一个变量,也就是没有气球给它系;
per2 = per1;
这个是什么意思呢?第二根线系上了第一根线,或者说两根线系上了同一个气球;
per2 = new Person();
新建了第二个气球,并用第二根线系在这个气球上;
per1 = per2;
这个呢?第一根线系在了第二个气球上;那第一个气球呢?它飞走了。对象本身就没有名字,而本来指向它的引用变量也指向了第二个对象。但是它并没有消失。前面咱们说新建一个对象需要在堆内存中开辟一个空间,用来存放这个对象。这个对象现在还在这个内存空间内,但是没有名字,没有引用变量的它已经失去了价值和意义。也就成了垃圾,最终会被Java的垃圾回收机制回收。
嗯,,,文章写的不太好,有点虎头蛇尾。不过还是希望能给需要的同学们带来些许启发。