【JAVA基础】引用变量

来源:互联网 发布:sql cursor用法 编辑:程序博客网 时间:2024/06/05 10:22

   对象和对象的引用,是不是一回事?答:不是;

1、定义一个类,做模板:

class Vehicle {       int passengers;             int fuelcap;        int mpg;                }

2、创建对象

  Vehicle veh1 = new Vehicle();

  创建一个对象,包含了四个动作,我们语句拆分进行解释:

  Vehicle veh1;

  Veh1=new Vehicle();

1newVehicle:以Vehicle类为模板,在堆空间里创建一个Vehicle类对象(也简称为Vehicle对象)。

2)末尾的():在对象创建后,立即调用Vehicle类的构造函数,对刚生成的对象进行初始化。构造函数是肯定有的。如果你没写,Java会给你补上一个默认的构造函数。

3)Vehicle veh1:创建了一个Vehicle类引用变量

所谓Vehicle类引用,就是以后可以用来指向Vehicle对象的对象引用,也只能指向用Vehicle模板实例化的对象。

4)“=”:指向

   使对象引用(Vehicleveh1)指向刚创建的那个Vehicle对象(newVehicle)。

在这个过程中,有两个实体:对象引用变量,对象本身。一个Vehicle类可以据此创建出无数个对象,这些对象不可能全叫“Vehicle”。为了访问我们创建的对象,只能通过对象引用来间接访问对象。


3、举个例子:

   汽车厂生产的汽车相当于创建的对象,没有指明要用去做什么;

   现在需要为由北京开往上海的路途配置汽车,由北京开往上海的汽车是一个引用变量。我们将汽车厂生产的汽车用作由北京开往上海的汽车。这个过程就是“=”发挥作用的过程。

              

   而如果只执行了  Vehicle veh1,还没执行第二条,此时创建的引用变量veh1还没指向任何一个对象,它的值是null。引用变量可以指向某个对象,或者为null。就相当于我们只是提出了需要配置从北京开往上海的汽车,但此时并没有汽车,这时候,空指针异常就出现了。

 

4、推理:

1Vehicle veh2;

    veh2 = veh1;

    此时,发生了复制。但是,要说明的是,对象本身并没有被复制,被复制的只是对象引用。结果是,veh2也指向了veh1所指向的对象。

              

(2)继续执行

    veh2 = new Vehicle();

    引用变量veh2改指向第二个对象。

                       

(3)继续执行

    veh1 = veh2;

    按上面的推断,veh1也指向了第二个对象。这个没问题。问题是第一个对象呢?

    答:它已成为垃圾回收机制的处理对象。

 

5、探索:

   照这样的推理,newVehicle()的存在,就是不合理的,因为,生产了汽车,但是没有用。。。“费车”?

   答:NO,如果我们仅仅为了打印而生成一个对象,就不需要用引用变量来指向它。最常见的就是打印字符串:

 

    System.out.println(“I am Java!”);

 

   字符串对象“I amJava!”在打印后即被丢弃。有人把这种对象称之为临时对象。对象与引用的关系将持续到对象回收,Java在运行时才处理别名引用。



原创粉丝点击