《java编程思想系列之1》 一切都是对象

来源:互联网 发布:ug钻孔编程后处理 编辑:程序博客网 时间:2024/05/23 00:09
一、用引用操纵对象

java中(几乎)一切都是对象。尽管一切都看做对象,但是操纵的标识符实际上是对象的一个“引用”(reference)。

可以将这一情形想象成为用遥控器(引用)来操纵电视机(对象)。只要握住这个遥控器,就能保持与电视机的连接。当有人想改变频或者减小音量的时候,实际操控的是遥控器(引用),再有遥控器来调控电视机(对象)。如果想在房间里四处走动,同时仍能够调控电视机,那么只需要携带遥控器(引用)而不是电视机(对象)。

没有电视机,遥控器也可以独立存在。也就是说,你拥有一引用,并不一定需要一个对象与之关联。

例子: String s
这里所创建的只是一个引用,并不是对象。如果此时向s发送一个消息,就会返回一个运行时错误。因为此时海明诶有任何事物与之关联。一种安全的做法是:创建一个引用的同时便进行初始化。
String s = "asf"

一旦创建了一个引用,就希望它能够与一个新的对象相关联。通常用new操作符来实现这一目的。new关键字的意思是“给我一个对象”:
String s = new String("asf")

二、必须由你创建所有的对象


1、数据存储


(1)寄存器:最快的存储区,位于处理器内部。但是寄存器的数量及其有限,所以寄存器根据需求进行分配。你不能直接控制,也不能再程序中感觉到寄存器存在的任何迹象。(c和c++允许你向编译器建议寄存器的分配方式
(2)堆栈:位于RAM(随机访问存储器)中,通过堆栈指针可以从处理器获得直接支持。java系统必须知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些java数据存放在堆栈中--特别是对象引用,但是java对象并不存储在其中。
(3)堆:一种通用的内存池(也位于RAM),用于存储java对象。堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间。
(4)常量存储区:存放在ROM(只读存储器)
(5)非RAM存储:如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行的时候也可以存在。其中两个基本的例子是流对象和持久化对象。

2、特例:基本类型

在程序设计中进场用到一系列的类型,他们需要特殊对待。可以把它们想象成”基本“类型。之所以特殊对待,是因为new将对象存储在堆里,故用new创建一个对象---特别是小的、简单的变量,往往不是很有效。因此对于这些类型,java采取和c相同的方法。也就说,不用new来创建变量,而是创建一个并非是引用的”自动“变量。这个变量直接存储”值“,并置于堆栈中,因此更加有效。

java中基本类型的存储空间大小固定

基本类型具有包装器类,使得可以在堆中创建一个非基本对象,用来表示对应的基本类型:
char c = "x"
Character ch = new Character(c);

3、java中的数组

(1)数组确保会被初始化
(2)不能再它的范围之外被访问

当创建一个数组对象时候,实际上就是创建了一个引用数组,并且每个引用都会自动的被初始化为一个特定值,该值拥有自己得关键字null

三 、永远不要销毁对象

1、作用域

java中不能隐藏外层作用域的变量。

2、对象的作用域

引用s的作用域终点就消失了,然而,s指向的String对象仍然占据内存空间。

事实证明,由new创建的对象,只要你需要,就会一种保留下去。

java中有一个垃圾回收器,用来监视用new创建的所有对象,并辨别哪些对象不会再被引用。随后,释放这些对象的内存空间,以便供其他新的对象使用。


四、创建新的数据类型:类

1、字段和方法

基本成员的默认值:
若类的某个成员是基本数据类型,即使没有进行初始化,java也会确保它有一个默认值。
当变量作为类的成员使用时,java才确保给定其默认值,以确保那些是基本类型的成员变量得到初始化(c++没有此功能
然而上述确保初始化的方法并不适用于局部变量,即并非是某个类的字段。

0 0
原创粉丝点击