Java编程思想(四) 初始化与清理
2022-06-05 本文已影响0人
kaiker
1、用构造器确保初始化
- 通过构造器,类的设计者可确保把每个对象都会得到初始化。
- 创建对象时,如果具有构造器,Java就会在用户有能力操作这个对象之前自动调用相应的构造器。
- 在Java中初始化与创建是不能分开的。
2、方法重载
- 通过参数列表来区分同名的方法
- 不能通过返回值来区分,比如int f() 和void f() 调用f() 就不知道到底用的是哪个。
- 如果传入数据类型小于方法中声明的形式参数类型,实际数据类型就会被提升。char如果不能被接收,会被提升成int。
- 如果传入数据类型大于接受类型,需要进行类型转换才能传。
3、默认构造器
- 如果没写构造器,编译器会自动创建。
4、this关键字
- this关键字智能在方法内部使用,表示对“调用方法的那个对象”的引用
- 只有当需要明确指出当前对象的引用时,才需要使用this关键字。
public class Leaf {
int i = 0;
Leaf increment() {
i++;
return this;
}
}
在构造器中调用构造器
- 通常this都是指当前对象,表示对当前对象的引用。
- 如果this添加了参数列表,表示某个构造器的调用。
static的含义
- static方法就是没有this的方法。在static方法内部不能调用非静态方法。
5、清理:终结处理和垃圾回收
- Java里的对象并非总是被垃圾回收。
- 垃圾回收不等于析构。
- 垃圾回收只与内存有关。
- 如果Java虚拟机并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。
垃圾回收器如何工作
- 当它工作时,将一面回收空间,一面使堆中的对象紧凑排列,这样堆指针就可以很容易移动到靠近开始的地方。
- 引用记数是一种简单但速度很慢的垃圾回收记数。每个对象都含有一个引用计数器,当有引用连接至对象时,引用计数加1,当离开作用域或置位null时,引用计数减1。
- 有一种做法名为停止-复制。先暂停程序运行,然后将所有存活对象从当前堆复制到另一个堆,没有复制的都是垃圾。
- “标记-清扫” 从堆栈和静态存储区出发,遍历所有的引用,进而找出所有存活的对象。每找到一个存活对象,就给对象设一个标记,当所有标记完成,清理开始,生效的堆空间不连续。
- 所有的内存分配以较大的块为单位。每个块用相应的代数来记录它是否还存活。
- 如果所有对象很稳定,垃圾回收器效率降低,切换到标记-清理;如果出现很多碎片,就会切换为停止-复制。
6、成员初始化
- 在类里定义一个对象引用时,如果不将其初始化1,此引用就会获得一个特殊值null。
7、构造器初始化
- 无法阻止自动初始化的进行,它将在构造器被调用之前发生。
初始化顺序。
- 变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义间,它们仍旧会在任何方法被调用之前得到初始化。
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 w3
}
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(); // Shows that construction is done
}
} /* Output:
Window(1)
Window(2)
Window(3)
House()
Window(33)
f()
静态数据初始化
- 无论创建多少个对象,静态数据都只占用一份存储区域。
- 静态初始化只有在必要时刻才会进行。
- 初始化的顺序是先静态对象,而后是非静态对象。
一个对象创建的过程,
- 即使没有显示使用static关键字,构造器实际也是静态方法。首次创建Dog对象或Dog的静态方法、域首次被访问,Java解释器必须找到类路径以定位Dog.class。
2、载入Dog.class,有关静态初始化所有动作都会执行。因此静态初始化只在Class对象首次加载时候进行一次。 - new Dog()创建对象时,在堆上为Dog对象分配足够的存储空间。
- 这块存储空间被清零,基本类型设为默认,引用设为null。
- 执行所有出现于字段定义处的初始化动作。
- 执行构造器。
8、数组初始化
- 数组知识相同类型的、用一个标识符名称封装到一起的一个对象序列或基本类型数据序列。
- 编译器不允许制定数组大小。为了给数组创建相应的存储空间,必须写初始化表达式。
- int[] a1 获取的是数组的引用。
- 可变参数列表,当你指定参数时,编译器实际上会为你去填充数组。
new Object[]{"one", "two"};