thinking in java (一) ----- 万物皆对象

reference是控制对象的钥匙

在java中,一切的事物都被称为对象,我们用于操控对象的标志符号,实际上只是“reference”(引用)。reference和对象之间的关系,就好比是遥控器和电视的关系一样。对电视进行换台调节音量等,实际上是对遥控器进行的操作。

 

数据存储在哪儿

1,寄存器(Registers)

这是速度最快的存储场所,程序员不仅无法直接触碰寄存器,也没办法在程序里面感受到寄存器的存在。

2,栈(Stack)

位于一般的RAM中,处理器经由stack pointer提供直接支持。当程序分配一块新的内容的时候,stack指针便往后移。释放内存的时候,指针就往前移回。由于JAVA编译器有责任产生这种“将stack指针前后移动”的代码,所以它必须掌握程序中“存在stack指针中所有数据的大小和存活时间”。由于这个限制,尽管我们可以将reference存放在stack中,但是却不能将一般的对象存放在stack中。

3,堆(Heap)

Heap是一种通用性质的内存存储空间(也存在与RAM中),用来置放所有的java对象,Heap胜过Stack之处是,编译器不需要知道从Heap分配的空间需要多大,也不需要知道空间存活时间,因此,heap分配内存有高度的弹性。当需要产生对象的时候,只需在程序中new,那么执行的时候,便会自动heap分配空间。

4,静态存储空间(Static storage)

静态指的是“在固定位置上”(也是在RAM中),中间存放着“程序执行期间”一直存在的数据。可以用static关键字,将对象内的某个特定成员设为静态,但是java对象本身是不可能在静态区中,

5,常量存储空间(Constant storage)

常量值不会变,所以是安全的。也可以放到只读内存ROM中。

6,Non-RAM存储空间

没有见过,暂且不表

 

基本类型

byte,short,int,long,float,double,boolean,char

如果使用new来产生基本类型这一简单极小的便令,会因为将对象置于heap中而导致效率不佳,因此基础类型不使用reference形式,而是产生一种所谓的“automatic”变量,此类变量直接放置在stack中,因此效率较高。

为了让基础类型也有面向对象的特性,加入了包装类。生成的包装类的对象一样的存放在heap中,reference放在stack中。包装类中有一系列属性和方法,丰富了基本类型的操作。另外在ArrayList,HashMap中放置东西的时候,也只能放置对象。

Byte,Short,Integer,Long,Float,Double,Boolean,Character。

class:定义新的数据类型

class其实就是在描述对象的外观长相行为举措,除非new产生对象,否则并不存在实际的对象,产生对象以后,存储空间才会分配出来,对象才可以被外界使用。

定义class的时候,其中有数据成员函数成员,当class中的基本类型没有提供初始值的时候,java会赋予其一个缺省值(像区域变量就不会给缺省值)。

关键字static

当你某个数据成员或者函数成员被static修饰的时候,他就不局限于所属的class object中了,即使没有产生object,外界还是可以使用class名调用static data。被static修饰的函数或者成员变量在类加载的时候就被执行,并且只执行一次,这时候构造函数没有执行,对象没有被产生,而non-static数据/函数都是和对象绑定的,因此被static修饰的函数不能调用non-static的数据/函数。既然没有对象,也没有this关键字

static修饰的数据成员被全局共享,只有一个。

 

猜你喜欢

转载自blog.csdn.net/sinat_38430122/article/details/82960608