您的位置:首页 > 编程语言 > Java开发

Java 编程思想拾零 (第五章)

2010-03-14 15:10 288 查看
第五章 [/b]初始化与清理[/b]

[/b]

[/b]随着计算机革命的发展,“不安全”的编程方式已逐渐成为编程代价高昂的主因之一。[/b]

[/b]

5.1 用构造器确保初始化

在java中,“初始化”和“创建”捆绑在一起,两者不能分离。

5.2 方法重载 Overload

5.2.1 区分重载方法

要是几个方法有相同的名字,Java如何才能知道你指的是哪一个呢?其实规则很简单:每个重载的方法都必须有一个独一无二的参数[/i]类型列表[/i][/b]。

(虽然说,参数顺序的不同也足以区分两个方法,但,Eckle不推荐我们这么做)

class
OverloadOrder{

static
void f(int i, String s){ …… }

static
void f(String s, int i,){ …… }

}
5.2.2 涉及基本类型的重载

如果传入的数据类型(实际参数类型)小于方法中声明的形式参数类型,实际数据类型就会被提升。反之,则必须“穿小鞋”(强制)转换,否则,编译器报错。

(其实,很好理解,想象你穿越回某个古代,摇身一变富贾四方,妻妾成群,算了,不说了。)

5.2.3 以返回值区分重载方法

JVM
say s: Sorry, I think you could ignore the return value.

5.3 默认构造器

要是你没有提供任何构造器,JVM
think : you need a constructor , I make one for u. 如果你自己搞了一个(不论是否有参数),JVM think : you have constructor(s), so you know the law.然后,高喊着“我是打酱油的”跑开。。。

5.4 this关键字

this
: 当前对象的引用。只有当需要明确指出对当前对象的引用时,才需要使用this关键字。

5.4.1 在构造器中调用构造器

this(参数列表); // 同super(), 要写在构造器的第一句,且只能写在构造器内部,且只能写一个。

5.4.2 static关键字

Static方法就是没有this的方法。在没有任何对象的前提下,仅仅通过类本身来调用static方法 --- 这实际上正是static方法的主要用途。

5.5 清理: 终结处理和垃圾回收

垃圾回收器只知道释放那些由“new”分配的内存。

Java允许类中定义finalize()方法,其工作原理(“假定”)是:一旦垃圾回收器准备好释放对象占用的存储空间,将先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

1对象可能永远不被垃圾回收;
2:垃圾回收并不等于“析构”;
3:垃圾回收只于内存有关;
不该,将“finalize”作为通用的清理方法。

之所以有finalize,是由于在分配内存时可能采用了类似C语言的做法,而非java中的通常做法。

不要过多地使用finalize().[/b]

5.5.2 你必须实施清理

无论是“垃圾回收”还是“终结”,都不保证一定会发生。如果Java虚拟机并为面临内存耗尽的情况,它是不会浪费时间去执行垃圾回收以恢复内存的。

5.5.3 终结条件

通常,不能指望finalize(),必须创建其他的“清理”方法,并且明确地调用它们。

finalize()还有一个有趣的用法 à 对象终结条件[/b]验证。

System.gc()
强制进行终结。

super.finalize();

5.5.4 垃圾回收器如何工作

“自适应的、分代的、停止-复制、标记-清扫”式垃圾回收器

5.6 成员初始化

Java尽力保证:所有变量在使用前都能得到恰当的初始化。

类的每个基本类型数据成员保证都会有一个初始值。

5.7 构造器初始化

无法阻止自动初始化[/b]的进行,它将在构造器被调用前发生。

5.7.1 初始化顺序

在类内部,变量定义的先后顺序决定了初始化的顺序。即使变量散布于方法定义之间,它们仍旧会在任何方法(包括构造器)被调用前得到初始化。

5.7.2 静态数据的初始化

初始化的顺序是先静态对象[/b](如果它们尚未因前面的对象创建过程而被初始化)(静态的东西只初始化一次),而后是“非静态”对象[/b]。

构造器实际上也是静态方法。为什么?记住了,静态的东西是属于类的。

5.7.3 显式的静态初始化

“静态子句”

与其他静态初始化一样,静态子句也仅执行一次:当首次生成这个类的一个对象时,或者首次方位属于哪个类的静态成员时。

public class
spoon {

static
int i;

static
{

i = 47;
}
}
5.8 数组初始化

int[]
a1 = {1, 2, 3, 4, 5};

int[]
a2 = a1;

int[]
a3 = new int[5];

Integer[]
a = { new Integer(3), new Integer(6) };

Integer[]
b = new Integer[]

所有的数组都有一个固定成员length.

Arrays
( java.util ) 包中有很多好东西,比如toString(), sort() 还有 asList()等吧。。。很实用的静态方法。

5.8.1 可变参数列表 Java SE5

有了可变参数,就再也不用显式地编写数组语法了,当你指定参数时,编译器实际上会为你去填充数组。你获得的仍旧是个数组。

Eckel[/i][/b]建议[/i][/b]: 你应该总是旨在重载方法的一个版本上使用可变参数列表,或者压根就不使用它。

5.9 枚举类型 Java SE5

public enum
Spiciness {

NOT, MILD, MEDIUM, HOT, FLAMING
}

某main
Spiciness howHot
= Spiciness.NOT;

编译器还会自动赋予一些有用的特新性: toString(), ordinal()方法。。。

Switch可用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: