对象和对象引用

在学习到面对对象的时候,大家对对象和对象引用可能不是太理解,这里简单的给大家说一下

为方便说明,先定义一个简单的类:

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)右边的“new Pet()”,是以Pet类为模板,在堆空间里创建一个Pet类对象(也简称为Pet对象)。

  大家可以试一下直接用new Pet()点的方式也是可以调用里面的属性和方法的

public class TestPet {
    public static void main(String[] args) {
        System.out.println(new Pet("二哈",1,100).name);
        new Pet().show();
    }
}

上面的代码运行的结果是:

二哈
哈哈

 

2)左边的“Pet pet1”创建了一个Pet类引用变量。所谓Pet类引用,就是以后可以用来指向Pet对象的对象引用。

在学习变量的时候,我们在声明一个变量时,往往是这样写的:int a = 1;或者int a;  a =1;

这样来看的话其实创建一个对象和声明一个变量是类似的,这里的Pet其实可以看做一个Pet类型

3)“=”操作符使对象引用指向刚创建的那个Pet对象。

我们可以把这条语句拆成两部分:

  Pet pet1;

  pet1= new Pet();

  效果是一样的。这样写,就比较清楚了,有两个实体:一是对象引用变量,一是对象本身。

在堆空间里创建的实体,与在数据段以及栈空间里创建的实体不同。尽管它们也是确确实实存在的实体,但是,我们看不见,也摸不着。不仅如此,我们仔细研究一下第二句,找找刚创建的对象叫什么名字?有人说,它叫“Pet”。不对,“Pet”是类(对象的创建模板)的名字。一个Pet类可以据此创建出无数个对象,这些对象不可能全叫“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的垃圾回收机制回收了。这不确切。正确地说,它已成为垃圾回收机制的处理对象。至于什么时候真正被回收,那要看垃圾回收机制的心情了。

posted @ 2020-08-04 18:13  脸鼓达人  阅读(107)  评论(0)    收藏  举报