《Think in Java》(三)——一切都是对象


  作者在该章开始的时候比较了Java与C++,两者都是杂合语言,但前者的OOP思 想更加明显,以至于作者得出:Java乃至Java程序内的一切都是对象。

       

         3.1          用句柄操作对象

       

句柄的意思相对于C来说就是指针名,是可以通过这个句柄来间接操控Java中的对象。如果单单声明一个句柄,则不能进行任何操作,所以Java中也就有了对象初始化的概念,通过对象初始化来使得句柄与具体的对象联系起来。注意,对于句柄来说,对象必须创建。

 

         3.2         保存到什么地方

作者提到了六个存储的地方,其中除了“寄存器”我们无法操作,只能由编译器自行调用之外,其他的诸如“栈”、“堆”、“静态存储”、“常数存储”、“非RAM存储”这5类都是可以被我们间接或直接操作的。

我们在声明一个句柄并且初始化的时候,句柄跟初始化对象存放的地址是不同的,前者(即句柄)存放在栈中,而后者(即初始化new的对象)存放在堆中,这是因为栈向上或者向下移动指针的需要知道所有数据的“长度”以及“存在时间”(通过这种方式可以很方便的进行进行数据保存),而可执行这个过程的前提却是需要Java进行代码生成,这样造成的结果就是影响了程序的灵活性。

反之,在堆中,编译器不需要知道要从堆里获得多少的内存空间以及停留时间,也就不需要Java生成相应的代码,这也就是为什么初始化的对象被存放在堆中的原因。

另外,我们在编写程序的时候,往往会用到static的关键字,这些关键字所声明的资源其实都存放在静态存储中。而常数存储一般存储不会变更的常量,其中包括自趺床常量与基本类型常量。又因为常数存储的不需要变更特性,也就存放在了ROM的只读寄存器中,相对于static的静态存储(因仍旧可变),它被放置于RAM的可读寄存器中。

至于“非RAM存储”,一般存储在永久的硬盘空间中,但是也有一种情况是在程序运行过程中产生的“流数据”,这些“流数据”可能传给其他设备使用。而存储在硬盘空间最典型的例子就是数据库了。

 

          3.3          Java中的基本类型

 

Java中存在最基本的类型,包括boolean、char、byte、short、int、long、float、double、void。

这里将void也列为了基本类型。

Java中将这些基本类型都封装成了对象,但是,对于Java来讲,基本类型是直接在堆栈中存放的,它是不需要用new来创建一个变量,使用基本类型更加高效。

 

Java中存在的数据组C++/C中的数组不同,根据作者的话,后者可以访问到数据所存在的数据块之外的数组。而前者则不同,Java对数组进行了封装,它加入了确保数组被初始化和不被范围外访问的安全策略,更加安全(付出了一定的代价)。

 

          3.4         永远不需要销毁对象

 

作者在书上描述过C/C++语言存在作用域,且可以将一个较大作用域的变量“隐藏”,而Java中却是不允许的。这里其实有个前提,这个变量必须在同一个方法内,如果一个为局部的方法变量,一个则为全局的类变量,虽然名字相同,但是Java中仍旧可以存在,只不过遵循的是就近原则

 

Java在建立一个对象之后,它所被引用的句柄一旦失效,并不会连通它所指向的对象也一并失效,对象仍旧占有空间,会一直存储下去。

在书中,作者描述了Java存在一个垃圾回收器,这个东西是用来监视new创建的所有对象,并通过辨别哪些不会再被引用,从而进行回收处理,释放空间。

Java的这种解决方案解决了内存泄漏的问题,程序员并不需要担心对象何时会被回收,提高了开发的效率。

 

另外,Java中的方法之间的区别是通过方法名和参数列表来进行的,这两个组合起来可以称为方法签名

          3.5          关于static

 

Static作为静态的关键字,不管是对象还是方法,都会放置在静态存储区,而且静态方法不需要依赖于具体的某个对象而存在。

如果在初始化一个对象的过程中两次都声明了一个相同的静态变量,那么它们是指向同一个存储控件。

 

          3.6          关于注释

 

Javadoc只对于protected和public方法有效,如果在private上进行注释,那么将会被忽略掉。如果想要在private上注释,可以使用能够-private进行标记。

 

你可能感兴趣的:(IT,《Think,in,Java》感想)