Java初始化和清除
2018-12-25 本文已影响0人
酥酥肉
Java初始化和清除
初始化 和 清除
对于现成的库,若用户不知道如何初始化库的一个组件,就往往会出现这一类的错误。
清除是另一个特殊的问题,因为用完一个元素后,由于不再关心,所以很容易把它忘记。这样一来,那个元素占用的资源会一直保留下去
用构建器自动初始化
构建器的名字与类名相同。 这样一来,可保证象这样的一个方法会在初始化期间自动调用
class Rock {
Rock() { // This is the constructor
System.out.println("Creating Rock");
}
}
public class Main {
public static void main(String[] args) {
for(int i = 0; i < 10; i++)
new Rock();
}
}
一旦创建一个对象:new Rock();就会分配相应的存储空间,并调用构建器。这样可保证在我们经手之前,对象得到正确的初始化
方法过载
1、为了让相同的方法名伴随不同的自变量类型使用,“方法过载”是非常关键的一项措施。
class Tree {
int height;
Tree() {
prt("Planting a seedling");
height = 0;
}
Tree(int i) {
prt("Creating new Tree that is "
+ i + " feet tall");
height = i;
}
void info() {
prt("Tree is " + height
+ " feet tall");
}
void info(String s) {
prt(s + ": Tree is "
+ height + " feet tall");
}
static void prt(String s) {
System.out.println(s);
}
}
2、每个过载的方法都必须采取独一无二的自变量类型列表
主类型的过载
1、主(数据)类型能从一个“较小”的类型自动转变成一个“较大”的类型
void f3(short x) { prt("f1(short)"); }
void f4(int x) { prt("f1(int)"); }
void f5(long x) { prt("f1(long)"); }
void f6(float x) { prt("f1(float)"); }
void f7(double x) { prt("f1(double)"); }
void testConstVal() {
prt("Testing with 5");
byte b = 5;
f3(b);
}
}
主数据为byte类型,形参为short类型,所以从较小转到了较大类型
若我们的自变量“大于”过载方法期望的自变量,这时又会出现什么情况呢?
void f2(byte x) { prt("f1(byte)"); }
void testConstVal() {
float d = 5;
f3(d); erro
f3((byte)d); 明确强转
}
答案:编译器会报错
大家可注意到这是一种“缩小转换”。也就是说,在造型或转型过程中可能丢失一些信息。这正是编译器强
迫我们明确定义的原因—— 我们需明确表达想要转型的愿望
this 关键字
假定我们在一个方法的内部,并希望获得当前对象的句柄。
由于那个句柄是由编译器“秘密”传递的,所以没有标识符可用
针对这一目的有个专用的关键字: this。 this 关键字
1. 在构建器里调用构建器
若为一个类写了多个构建器,那么经常都需要在一个构建器里调用另一个构建器,以避免写重复的代码。可
用 this 关键字做到这一点
public class Flower {
private int petalCount = 0;
private String s = new String("null");
Flower(int petals) {
petalCount = petals;
System.out.println(104
"Constructor w/ int arg only, petalCount= "
+ petalCount);
}
Flower(String s, int petals) {
this(petals);
//! this(s); // Can't call two!
this.s = s; // Another use of "this"
System.out.println("String & int args");
}
}
finalize ( ) 用途何在
1、垃圾收集只跟内存有关! 垃圾收集器存在的唯一原因是为了回收程序不再使用的内存
2、之所以要使用 finalize()
需要采取与 Java 的普通方法不同的一种方法,通过分配内存来做一些具有 C 风格的事情,
free()是一个 C 和 C++函数,所以我们需要在 finalize()内部的一个固有方法中调用它
3、finalize()最有用处的地方之一是观察垃圾收集的过程