对象:
在Java中有一句比较流行的话,叫做“万物皆对象”。要理解什么是对象,需要跟类一起结合起来理解。下面这段话引自《Java编程思想》中的一段原话:
“按照通俗的说法,每个对象都是某个类的一个实例,这里,‘类’就是‘类型’的同义词。”
从这一句话就可以理解到对象的本质,简而言之,它就是类的实例,比如所有的人统称为“人类”,这里的“人类”就是一个类(物种的一种类型),而具体到每个人,比如张三这个人,它就是对象,就是“人类”的实例。
对象引用:
在Java中一切都被视为对象。尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“引用“。
Person person = new Person("张三");
有人会说,这里的person是一个对象,是Person类的一个实例。
也有人会说,这里的person并不是真正的对象,而是指向所创建的对象的引用。
Person person;
person = new Person("张三");
这两行代码实现的功能和上面的一行代码是完全一样的。大家都知道,在Java中new是用来在堆上创建对象用的,如果person是一个对象的话,那么第二行为何还要通过new来创建对象呢?由此可见,person并不是所创建的对象,是什么?上面的一段话说的很清楚,“操纵的标识符实际是指向一个对象的引用”,也就是说person是一个引用(引用在底层就是指针,但是Java中不涉及指针),是指向一个可以指向Person类的对象的引用。真正创建对象的语句是右边的new Person("张三");
Person person;
person = new Person("张三");
person = new Person("李四");
这里让person先指向了“张三”这个对象,然后又指向了“李四”这个对象。也就是说,Person person,这句话只是声明了一个Person类的引用,它可以指向任何Person类的实例。也就是说,一个引用可以指向多个对象,而一个对象可不可以被多个引用所指呢?答案当然是可以的。
比如:
Person person1 = new Person("张三");
Person person2 = person1;
person1和person2都指向了“张三”这个对象。
Java中的引用和C++中的引用是不同的:
1、Java中的引用只能是对象,对于内置类型没有引用;
C++可以对任何类型的变量(或称为对象)进行引用。
2、Java中的引用实际上就是一个指针,能指向该类对象的一个指针,但是操作时又把它当成对象对待;
C++中的引用虽然也是一个指针,但是把它当成是被引用对象的一个别名,不开辟空间,对引用的操作与对实际变量的操作相同。