Java语言首先便假定了我们只希望进行面向对象的程序设计。也就是说,在正式使用它之前,必须将我们的思想转入一个面向对象的思维中,只有这样,与其他的opp语言相比,才能体会到java的易学易用。
一、用句柄(handle)操作对象
在java中,尽管可以将一切“看做”一个对象,但操纵的标识符实际上是指向这个对象的一个句柄(handle),有的人也将这个句柄称作“引用”或者“指针”。我们实际上是通过句柄来操作对象的,就像我们通过遥控板来操作电视一样,句柄是实现我们能够操作对象的一个桥梁。没有对象,句柄可以独立存在。就像没有电视机,遥控板可以独立存在一样。也就是说,只是由于拥有一个句柄,并不表示必须有一个对象同它连接。如:String s;这里这是创建了一个句柄,并没有对象。若此时想s发送一个消息,就出运行出错。一种更安全的做法是:创建一个句柄时,记住无论如何都进行初始化。
二、所有对象都必须创建
new关键字的意思是:把我变成这些对象的一种新类型。
1、数据保存到什么地方
在运行程序时,我们最好要知道我们使用的数据保存在了什么地方。特别要注意内存分配。有六个地方可以保存数据。
寄存器:这是最快的保存区域。它位于处理器内部,且数量十分有限。由编译器根据需要分配,我们没有直接的控制权。
堆栈:特别快,特别有效的保存方式,仅次于寄存器。驻留于常规的RAM中。可通过“堆栈指针”获得处理的直接支持,指针下移,创建新的内存,指针上移,释放那些内存。Java的有些数据保存在其中,比如对象的句柄,但是对象并不放在其中。
堆:和堆栈一样,驻留于常规RAM中,保存了java对象。“内存堆”或“堆”(heap)最吸引人的地方在于编译器不必要知道要从堆里分配多少存储空间,存储的数据要在堆里停留多少时间。用堆保存数据时会有更大的灵活性。不足之处在于:在堆里分配存储空间时会花费更多的时间。
静态存储:静态static是指位于固定位置(虽然也在RAM中)。程序运行期间,静态存储的数据随时等待调用。Static可以指出一个对象的元素是静态的,但是java对象永远不会置入静态存储空间。
常数存储:常数值通常直接置于程序代码内部,这样做是安全的,因为他们永远不会改变。有的常数需要严格的保护,可以考虑将他们置于只读存储器ROM中。
非RAM存储:若数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。这样的数据就可以选择非RAM存储,比如“流式对象”和“固定对象”。
(通过上述内容大致清楚句柄的存储位置在堆栈中,对象的存储位置在堆中,静态对象的存储位置在静态存储中,寄存器是我们无法直接控制的。)2、特殊的情况:主要类型(基本数据类型)
这里的特殊情况,也就是说我们在程序编写过程中用到的一些基本数据类型,因为这些数据类型太常用了,所以就称为主要或者基本或者primitive类型。这些类型不用new创建变量,而是创建一个并非句柄的自动变量,这个变量容纳了具体的值,并置于堆栈中,能够更高效的存取。这些类型有
主类型 |
大小 |
最小值 |
最大值 |
封装器类型 |
boolean |
1bit |
- |
- |
Boolean |
char |
16bit |
Unicode 0 |
Unicode 2^16-1 |
character |
Byte |
8bit |
-128 |
127 |
Byte |
Short |
16bit |
-2的15次方 |
2的15次方-1 |
Short |
Int |
32bit |
-2的31次方 |
2的31次方-1 |
Integer |
Long |
64bit |
-2的63次方 |
2的63次方-1 |
Long |
Float |
32bit |
IEEE754 |
IEEE754 |
Float |
Double |
64bit |
IEEE754 |
IEEE754 |
double |
Void |
- |
- |
- |
Void |
3、java的数组
创建对象数组时,实际创建的是一个句柄数组。而且每个句柄就会自动初始化成一个特殊值,而且带有自己的关键字null,如果java看到null,就知道该句柄并没有指向一个对象,正式使用前,必须为每个句柄就分配一个对象。
三、绝对不要清除对象
在大多数的程序设计语言中,变量的存在时间,lifetime一直是程序员着重考虑的问题。变量应持续多长时间?如何清除他?何时进行?
1、变量variable的作用域
Java中,作用域是由花括号的位置决定的。
2、对象的作用域{
Strings=new String(“abc”);
}
Java对象不具备与主类型一样的存在时间。用new关键字创建一个java对象的时候,它会超出作用域的范围之外。在上述代码中,句柄s会在作用域的的终点消失,但是s指向的对象依然占据着内存空间。在上述代码里,我们没有办法访问对象,因为指向他的唯一一个句柄超出了作用域边界。
Java有一个特殊的“垃圾收集器”,它会查找用new创建的所有对象,并辨别其中那些不再被引用。然后自动释放对象空间。4、新建数据类型:类 class
字段和方法:
字段:数据成员
数据成员为基本类型的时候,及时我们不初始化,系统也会为我们初始化,但是如果局部变量为基本数据类型而没有初始化的时候,运行会出错。
方法:成员函数
5、方法、自变量和返回值Java的方法method决定了一个对象能够接收的消息。Java的方法只能作为类的一部分创建。只能针对某个对象调用一个方法(静态方法可以针对类来调用),而且那个对象必须能够执行那个方法调用。
定义方法的基本格式:返回类型 方法名(自变量列表){方法体}
6、构建一个java程序名字的可见性
为了防止命名的重复和冲突,java引入了一种新的机制,及全部小写的反转域名来为自己的库命名,即包的概念,这样自己的程序就有了自己的空间,不会和别的程序交织冲突
使用其他组件使用import来指示编辑器导入一个包或者一个类库,大多数的时候,我们直接使用来自标准java库的组件,他们是与编译器配套提供的。
static关键字一般在定义一个类之后,除非使用new来创建一个对象,否则实际上并未得到任何东西。只有执行了new之后才会正式生成数据存储空间,并可使用相应的方法。使用static来定义一个类,类的数据和方法就不会和任何对象相关联,及时为创建对象,仍能够调用static方法和变量。
7、嵌入注释文档
注释文档:用于提取注释的工具叫做javadoc,通过javadoc我们就能轻松获得标准的java注释文档。
具体语法:
注释一般都在声明和定义之前,比如一个类的注释会在类定义之前,变量的注释会在变量定义之前,方法的注释会在方法定义之前。Javadoc只能为public和protected成员处理注释文档。Private和友好的成员的注释会被忽略。
@see引入其他类
该标记允许我们引入其他类里的文档。Javadoc会生成相应的html,将其值直接连接到其他的文档,格式如下:
@see 类名
@see 完整类名
@see 完整类名#方法名
类文档标记
@version
@author
方法文档标记
@param格式如下:
@param 参数名 说明
@return 说明(返回值的含义)
@exception完整类名 说明(有关异常的详细情况)
@deprecated(一些旧功能已由改进后的新功能取代)