1 用构造器确保初始化
构造器采用与类相同的名字。主类的名字和文件名要相同。
从概念上讲,初始化 和 创建 是彼此独立的,然而,在JAVA中,初始化 和 创建 是捆绑在一起的,两者不能分离。
构造器是一种特殊类型的方法,因为它没有返回值。这与返回值为空(void)明显不同。对于返回值为空,尽管方法本身不会自动返回什么,但是仍可选择让它返回别的东西。构造器则不会返回任何东西。
2 方法重载
构造器是强制重载方法名的另一个原因。
区分重载的方法:每个重载的方法都必须有一个独一无二的参数类型列表。参数顺序也可以区分两个方法,但是不推荐这么做。
基本数据类型从较小的类型自动提升至一个较大的类型。但是如果传入的实际参数较大,就要通过强制类型转换进行窄化转换。
转换顺序为:char -> int -> long -> float -> double; byte -> short -> int ......
3 默认构造器
又称为无参构造器。
如果已经定义了一个构造器(无论是否有参数),编译器就不会帮你自动创建默认构造器。
4 this关键字
this关键字返回了对当前对象的引用。通常写this的时候,都是指”这个对象“或”当前对象“,而且它本身表示对当前对象的引用
应用情景:
1 将当前对象传递给其他方法2 在构造器中调用构造器 除构造器之外,编译器禁止在其他任何方法中调用构造器
5 static
- static方法就是没有this的方法。在static方法的内部不能调用非静态方法,但是反过来可以。
- 可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法
6 清理:终结处理和垃圾回收
垃圾回收器只知道释放那些经由new分配的内存,所以它不知道该如何释放该对象的这块特殊内存,因为 这块内存不是通过创建获得的。
finalize()方法:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。所以要是你打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作。
注:在C++中,对象一定会被销毁(析构函数),而Java中的对象却并非总是被垃圾回收。需要注意三点:
- 对象可能不被垃圾回收
- 垃圾回收并不等于“析构”
- 垃圾回收只与内存有关
总结一句话,finalize()函数不是进行普通的清理工作的合适场所,因为它的使用情况非常特殊。
一个例子,之前在不应该的地方糊涂的:
class WebBank { boolean loggedIn = false; WebBank(boolean logStatus) { loggedIn = logStatus; } void logIn() { loggedIn = true; } void logOut() { loggedIn = false; } protected void finalize() { if(loggedIn) System.out.println("Error: still logged in"); // Normally, you'll also do this: // super.finalize(); // Call the base-class version }}public class TerminationConditionEx { public static void main(String[] args) { WebBank bank1 = new WebBank(true); WebBank bank2 = new WebBank(true); // Proper cleanup: log out of bank1 before going home bank1.logOut(); // Drop the reference, forget to cleanup: new WebBank(true); // Force garbage collection and finalization: System.gc(); } }上面的代码之所以会有error警告输出,是因为new WebBank(true);出来的对象没有引用(虽然Java的垃圾回收技术不是简单地检查引用数,这个接着就会讲到),所以在强制进行垃圾回收的时候,会检测它的loggedIn状态,另外两个不会。
Java不允许创建局部对象,必须使用new创建对象。
垃圾回收机制
引用记数是一种简单但速度很慢的垃圾回收技术。并且不能处理循环引用这种情况。
Java的垃圾回收所依据的思想为对任何“活”的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用。
Java的垃圾回收机制的概括可以为:自适应的、分代的、停止-复制、标记-清扫式垃圾回收器。