Java编程思想学习心得(二)Java中的对象

来源:互联网 发布:床上用品知乎 编辑:程序博客网 时间:2024/04/27 14:14

Java语言是一种比较纯粹的面向对象语言,面向对象的思想就是入门的基本功,在Java中(几乎)一切都是对象。那么在Java中如何操纵对象呢?

在Java中,我们是通过引用来操纵对象的。任何语言操纵内存中元素的方式都不一样,而且这些元素的类型也不一样,是直接操纵这些元素还是通过一种基于特殊语法的间接表示来操纵,这些都是问题。在Java中,既然一切都是对象,那么我们索性也把这些元素都当成对象,这样一来我们就可以使用一种固定的语法。尽管一切都是对象,但是我们操纵对象的标识符实际上是对象的一个引用。就像下面这种方式:

Object obj = new Object();

这种方式是Java一般初始化一个对象的方式,在这条语句中,实际的对象是new出来的那个Object,obj这个标识符只是这个对象的一个引用,如何理解这件事呢?我们还是举自然界中的例子,这就好比一个遥控器和一台电视,遥控器是引用,电视是具体的对象,可以通过操纵遥控器(引用)来操纵电视(对象),不管是更换频道还是增大减小音量,只要操纵遥控器就可以让电视实现。同理,在程序中,obj这个标识符就相当于遥控器,new出来的那个Object对象就相当于电视,只要操纵obj就可以让new出来的那个Object对象做出改变。再联想到自然界,我们只生产了一个遥控器,但是并没有让它指向任何一台电视,那么这个遥控器就无法使用。同理,在程序中,如果只创建了引用,就像下面这样:

Object obj;
我们这个obj并没有指向任何对象,那么它只是一个引用,无法使用,如果此时向obj发送任何消息(就相当于用遥控器来使电视换频道),就会出现一个Java运行时的错误。这个很好理解,如果你没有电视,只拿着遥控器在那瞎按,那什么作用也不起,别人只会把你当成疯子(运行时错误)。

在Java中对象是怎么来的呢?答案是我们必须自己创建对象。通常我们通过“new”操作符来实现这一目的,在上面我们已经看到了如何使用这一操作符。

在Java中我们创建的这些引用啊,对象啊对存储到什么地方呢?这些引用和对象其实都是数据,一般有五个不同的地方存储这些数据:

1、寄存器。最快的存储区,位于处理器内部,在Java中不能直接控制,也不能感觉到寄存器存在的迹象。

2、堆栈。位于通用RAM(随机访问存储器)中,通过堆栈指针来操纵,指针向下移动分配新内存,向上移动释放那些内存,这种分配方式快速有效。但是创建程序时,Java系统必须知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针。这样一来约束性就比较大,限制了程序的灵活性,所以只有一部分数据存储在堆栈中,比如引用,再比如boolean,int等基本类型的数据,Java对象并不存储于此。

3、。位于RAM区,是一种通用的内存池,所有的Java对象都存在堆中。和堆栈不同,编译器不需要知道存储的数据在堆里存活多长时间。所以在堆里分配存储有很大的灵活性,但是这种灵活性也是有代价的:用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多时间。

4、常量存储。常量值通常直接存放在程序代码内部,永远不会被改变。比如字符串池,所有字面常量字符串和具有字符串值的常量表达式都自动是内存限定的,并且会置于特殊的静态存储区中。

5、非RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在,两个基本的例子是流对象和持久化对象。在流对象中,对象转化成字节流,通常被发送给另一台机器。在持久化对象中,对象被存放于磁盘上,因此即使程序终止了,它们也可以保持自己的状态。


通过以上的介绍,我们可以知道,在Java中,引用和基本类型数据存在堆栈中,对象存在堆中,常量值存在常量存储。

0 0
原创粉丝点击