《编程思想》5.初始化与清理

方法重载:

1. 当创建一个对象时,也就给此对象分配到的存储空间取一个名字。所谓方法则是给某个动作取的名字。通过使用名字,你可以引用所有的对象和方法

2.每个重载的方法都必须有一个独一无二的参数类型列表。参数顺序的不同也足以区分两个方法。不过一般情况下别这么做,因为这会使代码难以维护。

3.涉及基本类型的重载:

如果传入的数据类型(实际参数类型)小于方法中声明的形式参数类型,实际数据类型就会被提升。char型略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升到int型

如果传入的实际参数较大,就得通过类型转换来执行窄化转换。如果不这样做,编译器就会报错  f1((float)x)

this关键字:

1.this关键字只能在方法内部使用,表示对”调用方法的那个对象“的引用。this的用法和其他对象引用并无不同。

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

1.假定你的对象(并非使用new)获得了一块”特殊"的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道该如何释放改对象的这块“特殊"内存。

2.用finalize(),就能在垃圾回收时刻做一些重要的清理工作。例如:java调用C的代码

垃圾回收如何工作

1.Java虚拟机中,堆的实现截然不同:它更像一个传送带,每分配一个新对象,它就往前移动一格。这意味着对象存储空间的分配速度非常快。Java的”堆指针“只是简单地移动到尚未分配的区域,其效率比得上C++在堆栈上分配空间的效率。

构造器初始化

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

class Window {

    Window(int marker){
        print("Window(" + marker + ")");
    }
}

class House {
    Window w1 = new Window(1);  //Before constructor
    House() {
      //Show that we're in the constructor:
      print("House()");
      w3 = new Window(33);  //Reinitialize w2
    }

    Window w2 = new Window(2); //After constructor
    void f() {
        print("f()");
    }

    Window w3 = new Window(3); //At end
    
}

public class OrderOfInitialization {
    public static void main(String[] args) {
        House h = new House();
        h.f();
    }

}


/*Output:
Window(1)
Window(2)
Window(3)
House()
Window(33)
f()
*/

静态数据的初始化

无论创建多少个对象,静态数据都只占用一份存储区域。static关键字不能应用于局部变量,因此它只能作用于域。如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初值;如果它是一个对象引用,那么它的初始值就是null

public class StaticInitialization {
    public static void main(String[] args) {
        print("Createint new Cupboard() in main");
        new Cupboard();
        print("Createing new Cupboard() in main");
        new Cupboard();
        table.f2(1);
        cupboard.f3(1);
    }
    static Table table = new Table();
    static Cupboard cupboard = new Cupboard();
}

class Bowl {

    Bowl(int marker) {
        print("Bowl(" + marker + ")");
    }

    void f1(int marker) {
        print("f1(" + marker + ")");
    }

}

class Table {
    static Bowl bowl1 = new Bowl(1);
    Table(){
        print("Table()");
        bowl2.f1(1);
    }
    
    void f2(int marker) {
        print("f2(" + marker + ")");
    }
    static Bowl bowl2 = new Bowl(2);
}

class Cupboard {
    Bowl bowl3 = new Bowl(3);
    static Bowl bowl4 = new Bowl(4);
    Cupboard() {
        print("Cupboard()");
        bowl4.f1(2);
    }
    void f3(int marker) {
        print("f3(" + marker + ")");
    }
    static Bowl bowl5 = new Bowl(5);
}

/*
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
Createing new Cupboard() in 
Bowl(3)
Cupboard()
f1(2)
Creatint new Cupboard() in
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)
*/

显式的静态化初始化

Java

猜你喜欢

转载自blog.csdn.net/weixin_42763504/article/details/82775955