第2章:一切皆是对象

用引用操控对象

java中一切皆被视为对象,因此可采用单一固定的语法.尽管一切都看作对象,但是操纵的标识符实际上是对象的一个引用(reference).可以将这一情形看作是遥控器(引用)来操纵电视机(对象).只要握住遥控器,就能保持与电视机的连接. 此外没有电视机,遥控器亦可独立存在,也就是说,你拥有一个引用,并不一定需要有一个对象与它关联 当没有对引用进行初始化的时候,使用引用在运行的时候会报错,建议创建一个引用的时候便对引用进行初始化

创建对象

创建的对象存储到什么地方?
1. 寄存器:
这是最快的存储区,因为它位于处理器内部,但是寄存器的数量极其有限,所以寄存器根据需求进行分配,不能直接控制,也不能在程序中感觉到任何的迹象(C或C++可以通过编译器建议寄存器的分配方式)
2. 栈(堆栈):
位于通用的RAM(随机访问存储器)中,但是通过堆栈指针可以从处理器那里获得直接支持,堆栈指针若向下移动,则分配新的内存,若向上移动,则释放那些内存,这是一种快速有效的分配存储的方法,仅次于寄存器.创建程序时,JAVA系统必须知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针.这一约束限制了程序的灵活性,所以虽然某些JAVA数据存储于堆栈中–特别是对象引用,但是JAVA对象并不存储于其中
3. 堆:
一种常用的内存池(也位于RAM中),用于存储JAVA对象.堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里面存活多久.因此,在堆里分配存储有很大的灵活性.当需要一个对象时,只需要new一个.当执行到这段代码的时候,会自动在堆里面进行存储分配.当然这种灵活需要付出相应的代价,用堆进行存储分配和清理可能会比栈需要更多的时间.
4. 常量存储:
常量值通常直接存放在程序代码内部,这样是安全的,因为它们永远不会被改变.有时,在嵌入式系统中,常量本身会和其他部分,隔离分开,所以这种情况下,可以选择将其存放在ROM(只读存储器)中
5. 非RAM存储:如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行的时候也可以存在,其中两个基本的例子就是流对象和持久化对象

基本类型

  • 八种基本类型:
    在程序设计中经常使用到一系列基本类型,它们需要特殊对待,可以把它们想象成基本类型.之所以特殊对待,是因为new将对象存储在”堆”里面,故用new创建一个特别小的对象简单的变量,往往不是很有效.因此,对于这些基本类型,不用new来创建变量,而是创建一个并非引用的”自动”变量.这个变量直接存储值,并置于”栈”中,因此更加高效.
  • java要确定每种基本类型所占用的存储空间的大小.这种所占存储空间大小的不变性使其更具有可移植性的原因之一.
  • 所有的数值类型都有正负号,所以不要去寻找无符号的数值类型.
  • 基本类型具有包装类,使得可以再堆中创建一个非基本对象,用来表示对应的基本类型:
char c='x';
Character ch = new Character(c);
//也可以这样使用
Character ch = new Character('x');
//java自动保证功能将自动地将基本类型转换为包装器类型
Character ch='x';
//并可以反向转换
char c =ch;
  • 高精度数字:
    java提供了2个高精度计算的类BigDecimalBigInteger,虽然他们大体上属于包装器类型,但是他们没有对应的基本类型,不过这2个类包含的方法,提供的操作与对基本类型所能执行的操作相似,也就是说能作用于int或float的操作,也能作用于BigDecimalBigInteger,只不过通过方法调用换取运算符方式.所以速度会慢一些.这里以速度换精度

  • 数组: java确保数组会被初始化,而且不能在它的范围之外被调用.这种范围检查,是以每个数组上少量的内存开销及运行时的下标检查作为代价的,因此换来的是安全性和效率的提高.当创建了一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会被自动初始化一个特定值,该值拥有自己的关键字null.一旦java看见null就知道这个引用还没有指向某个对象,在使用任何引用前,必须为其指定一个对象.否则会报错.

  • 对象的作用域:java对象不具备和基本类型一样的生命周期.当用new创建一个对象的时候,它可以存活于作用域之外.由new创建出来的对象,只要你需要就会一直保留下去.
  • 类中的成员变量是基本数据类型的,即使没有进行初始化也会给一个默认值.当变量作为类的成员变量使用时,才会有默认值. 注意:(“\u0000”.length()==1)
    这里写图片描述
  • static关键字: 通常来说,当创建类时,就是在描述那个类的对象的外观和行为.除非用new创建那个类的对象,否则,实际上并未获得任何对象.执行new来创建对象时,数据存储空间才被分配,其方法才供外界调用.当声明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起.使用类名是引用static变量的首选方式,这不仅是因为它强调了变量的static结构,而且在某些情况下它还为编译器进行优化提供了机会.(尽管static作用于某个字段时,肯定会改变数据创建方式,因为一个static字段对每个类来说都只需要一份存储空间,而非static字段则是每个对象有一个存储空间,但是如果static 作用于某个方法,差别却没有那么大).static方法的一个重要用法就是在不创建任何对象的前提下就可以调用它.
  • 注释文档:javadoc便是用于提取注释的工具,javadoc只能为public和protected成员进行文档注释.可以通过特殊标记 -private 把private成员的注释也包括在内.

`

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章