Java关于引用和对象的详解

来源:互联网 发布:vscode golang 格式化 编辑:程序博客网 时间:2024/05/16 17:55

在我初次接触JAVA的时候,对引用和对象的理解还处于一知半解的混沌认知当中,在经过半年的学习之后,当我回头再来重识引用和对象的时候,则有了更深刻的理解。

1.       用引用操作对象

在JAVA中,一切都被视为对象。但是在实际操作中,你操作的是对象的引用,而不是对象本身。就好比你在家里用遥控器(引用)对电视机(对象)进行操作,当你想切换频道的时候,实际操作的时遥控器(引用),在通过遥控器(引用)操作电视机(对象)。此外,即使没有电视机,遥控器也可以单独存在。也就是说,你可以拥有一个引用,但是不与他将电视机关联。因此,当你想创建一个字符串是,可以这样:

String s;

这里只是创建了引用,并没有把它与对象进行关联。此时象s发送消息将会返回一个运行时异常。所以为了避免异常,通常需要使s与对象进行关联:

String s=”abc”;
这样我们对s进行了赋值,并完成了初始化。

2.       创建所有对象

上述的例子还可以使用new关键字来进行创建:

String s=new String(”abc”);
这句话的意思是创建一个全新的对象,并赋值给s。

那创建的对象和引用时如何在计算机中存储的呢?回答这个问题我们先来看一下计算机中5种存储数据的地方:

1)寄存器:寄存器位于CPU内部,是最快的存储区域,但是其存储空间极其有限,所以计算机会按需分配,你无法直接进行操作,也无法感受到其存在的迹象。

2)堆栈:堆栈位于内存(RAM)中,其速度仅次于寄存器。引用往往被存储与堆栈,但对象并不在其中。

3)堆:一种通用内存池,也位于内存(RAM)中,堆不同于堆栈的好处在于:编译器不需要知道存储在堆中的数据存活多长时间。因此,在堆内分配空间具有很大的灵活性。但是这种灵活性也需要付出代价:用堆进行存储分配和清理可能比用堆栈需要花费更多时间。

4)常量存储:常量通常直接存储在程序代码内,这样做是安全的,因为他们永远不会被改变。在嵌入式系统中,常量一般与其他部分隔离开,所以在这种情况下,可以将它存储在只读存储器(ROM)中。

5)非RAM存储:如果数据完全存活于程序之外,那么他可以不受程序的约束,在程序没有运行时也可以存在。典型的例子就是“流对象”和“持久化对象”。

但是在JAVA中的基本类型属于特例,之所以特殊对待,是因为new的对象存储与堆当中,当用new创建一个特别小、简单的变量不是特别有效。因此,对于这种对象,不用new来创建,而是创建一个并非是引用的“自动”变量,这个变量直接存储值,并存储与堆栈中,因此将更加高效。


3.       何时销毁对象

当你使用new关键字创建了一个对象之后,对象就将存储在内存当中,那怎样才能防止内存被对象填满而阻塞你的程序呢?在JAVA中引入了垃圾回收器,他会时刻监视你的程序,当你的对象将不再被使用的时候,它将自动清理,释放内存,以供新的对象使用。所以在JAVA中,你完全不需要关心何时去销毁对象,这一切在JAVA设计之初就已经被考虑进去了。

0 0