对于刚接触不久面向对象的真小白童鞋来讲,类的对象,对象的实例,对象的引用,引用变量的问题以及莫过于没得对象~虽然博主也没得对象~,本文将逐个逐个讲解!javascript
在Java中有一句比较流行的话,叫作“万物皆对象”,这是Java语言设计之初的理念之一。要理解什么是对象,须要跟类一块儿结合起来理解。下面这段话引自《Java编程思想》中的一段原话: java
“按照通俗的说法,每一个对象都是某个类(class)的一个实例(instance),这里,‘类’就是‘类型’的同义词。”程序员
从这一句话就能够理解到对象的本质,简而言之,它就是类的实例,好比全部的人统称为“人类”,这里的“人类”就是一个类(物种的一种类型),而具体到每一个人,好比张三这我的,它就是对象,就是“人类”的实例。 编程
咱们先看一段话,这段话一样来自于《Java编程思想》: 编程语言
“每种编程语言都有本身的数据处理方式。有些时候,程序员必须注意将要处理的数据是什么类型。你是直接操纵元素,仍是用某种基于特殊语法的间接表示(例如C/C++里的指针)来操做对象。全部这些在 Java 里都获得了简化,一切都被视为对象。所以,咱们可采用一种统一的语法。尽管将一切都“看做”对象,但操纵的标识符实际是指向一个对象的“引用”(reference)。”ui
很显然,从这段话能够看出对象和对象引用不是一回事,是两个彻底不一样的概念。举个例子,咱们一般会用下面这一行代码来建立一个对象:编码
 Person per = new Person("张三");
复制代码
有小白童鞋会说,这里的per
是一个对象,是Person
类的一个实例。也有小白童鞋会说,这里的per
并非真正的对象,而是指向所建立的对象的引用。到底哪一种说法是对的?咱们先不急着纠结哪一种说法是对的,再看两行代码: spa
 Person person;
person = new Person("张三");
复制代码
这两行代码实现的功能和上面的一行代码是彻底同样的。你们都知道,在Java中new
是用来在堆上建立对象用的,若是per
是一个对象的话,那么第二行为什么还要经过new
来建立对象呢?设计
因而可知,per
并非所建立的对象,是什么?上面的一段话说的很清楚,“操纵的标识符实际是指向一个对象的引用”,也就是说per
是一个引用,是指向一个能够指向Person
类的对象的引用。真正建立对象的语句是右边的new Person("张三")
;所以这里的per
是一个引用,是指向一个能够指向Person
类的对象的引用。指针
简单来讲,对象的引用意思是“定义一个变量,这个变量指向的是一个对象“
Object obj=new Object();
//Object:类
//obj:对象的引用
//new Object():对象
复制代码
首先,没有“对象的实例”这一说法,只有类的实例,而类的实例,指的就是类的对象,说白了就是对象。 可是仍是有不少人这样叫,那怎么理解对象实例呢?好比说人类中有个叫宜春的程序员,宜春就是人类的一个实例
String s = new String("YiChun");
复制代码
s
就是 String
类中的一个实例
关于对象实例官方没有给其概念,其实有不少概念官方都没有给的,什么父类声明指向子类对象、方法签名等概念都是没有的 ,只是人们常常这么用这么说就习惯了。所以关于实例对象大致能够理解为对象引用的意思...
引用变量就是用引用类型声明的变量,这种变量叫引用类型变量。如:
People people; //其中people就是引用变量,People是一个类属于引用类型
复制代码
从对象引用出发:
一个对象引用能够指向零个或一个对象
从对象出发:
一个对象能够被一个或多个对象引用
怎么理解捏?~小白童鞋脑袋逐渐变大...~
首先先来理解第一句话:从对象引用出发:一个对象引用能够指向零个或一个对象
public static void main(String[] args) {
Two t; //一个对象引用能够指向零个对象
t=new Two();//一个对象引用能够指向一个对象
t=new String();//一个对象引用不能够指向 >1个对象
}
复制代码
试想一下这样的代码会出现啥状况?是的,它会编译失败
public static void main(String[] args) {
String str;
str=new String("string1");
str=new String("string2");
}
复制代码
咱们知道,凡是new
都能建立出一个对象,咱们发现上面代码String
对象引用str
一个new
了两次,并且上面代码编译也不报错,的的确确是建立了两个对象,那这怎么说?小白童鞋说完感受把博主按在马桶盖上...
别急,咱们再看看上面代码输出啥
public static void main(String[] args) {
String str;
str=new String("string1");
str=new String("string2");
System.out.println(str);
}
运行结果: string2
复制代码
这说明啥?说明如今str是下一个对象的引用。上一个对象被垃圾回收了,由于上一个对象(也就是string1
)不能被再次使用了。所以上面这个程序能够这样理解:
public static void main(String[] args) {
String str;//一个对象引用str指向零个对象
str=new String("string1");//一个对象引用str指向一个对象string1
str=new String("string2");//注意:这里对象引用str并非指向第二个对象string2,而是将以前指向第一个对象string1的引用从新指向了另外一个对象string2
}
复制代码
对象引用str并非指向第二个对象string2,而是将以前指向第一个对象string1的引用从新指向了另外一个对象string2,所以从对象引用出发:一个对象引用能够指向零个或一个对象!
这个时候,小白童鞋渐渐松开了把博主按在马桶盖上的双手...
咱们再来理解一下第二句话:从对象出发,一个对象能够被一个或多个对象引用
小白童鞋一样不解,因而又用双手把博主按在马桶盖上...
看下面这个程序:
Demo demo1,demo2,demo3;
demo1=new Demo();
demo2=demo1;
demo3=demo2;
复制代码
怎么理解?看的有点晕?会不会感受后面两句代码就是对象引用=对象引用...
其实要弄清除这个,首先你得弄清楚java虚拟机内存,弄清楚变量(对象引用)和对象是如何存储的,对象引用是存储在栈内存中,而对象是存储在堆内存中。分析以下:
Demo demo1,demo2,demo3;//建立多个对象引用,都存储在栈中
demo1=new Demo();//建立一个Demo对象,存储在堆中,并将demo1指向这个对象,至关于加了一个链
demo2=demo1;//demo2与demo1同样,都指向堆中Demo对象
demo3=demo2;//demo3与demo2同样,都指向堆中Demo对象
复制代码
首先,每一个对象只有一个地址值,new Demo()
是建立了一个对象,demo1
是这个对象的地址值,用来找到这个对象,demo2=demo1
是把new Demo()
这个对象的地址值由demo1
改成了demo2
,后面的demo3=demo2
也是只改变了对象的地址值,对象自己的空间大小都没有变化,变的,是这个对象的地址值,也就是c里面所谓的指针。
这个时候,小白童鞋渐渐松开了把博主按在马桶盖上的双手...
最后,咱们再看看一个网上关于对象与对象引用很流行的程序与分析,代码以下:
UserType ut = new UserType(); // ut是引用,实际的对象在内存里。
ut = new UserType(); /*如今ut是另外一个对象的引用,先前的对象被垃圾回收了(由于先前的对象不能被再次使用了)。*/
UserType ut2; // 定义了一个引用ut2,他不引用任何对象,不能使用。。。。
ut2 = new UserType(); // 然ut2成为一个对象的引用。
UserType ut3 = new UserType();
UserType ut4 = new UserType();
ut3 = ut4; // 如今ut3引用ut4的对象,这里不是赋值。。。
int a = 5;
int b = 4;
a = b; // 这里是赋值。 a b 依然引用不一样的对象
复制代码
对于面向对象语言,如java,首先,请小白童鞋相信一句话:一切皆为对象。而后相信另外一句话:变量只是一个零时的储存地点。引用类型的变量只是一个普通变量,储存了引用类型的地址。对象的建立是直接在内存中分配一个内存。
最后再梳理一下
引用类型变量 就 至关于 电脑上的快捷方式; 对象就至关于 你 磁盘里面 安装的游戏,它 实实在在 占用你的空间内存; 而变量 只是快捷方式
说白了基本数据类型变量就像是直接放在柜子里的东西,而引用数据类型变量就是这个柜子对应编码的钥匙。钥匙号和柜子对应。
到这里文章就结束了喔,小白童鞋,你何识着咩啊~
最后,如有不足或者不正之处,欢迎指正批评,感激涕零!
欢迎各位关注个人公众号,一块儿探讨技术,向往技术,追求技术...