Java初始化和清除

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()最有用处的地方之一是观察垃圾收集的过程

你可能感兴趣的:(Java初始化和清除)