随着计算机革命的发展,“不安全”的编程方式已逐渐成为编程代价高昂的主因之一。
用构造器确保初始化
构造器是一种特殊类型的方法,因为它没有返回值。方法本身不会自动返回什么,但可以选择让它返回别的东西。
this关键字:
this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。如果在方法内部调用同一个类的另一个方法,就不必使用this,直接调用就可以了。只有明确指出对当前对象的引用时,才需要使用this关键字。例如:当需要返回当前对象的引用时:
public class leaf{
int i = 0;
leaf increment(){
i++;
return this;
}
void print(){
System.out.println("i = "+i);
}
public static void main(String[] args){
leaf x = new leaf();
x.increment().increment().increment().print();
}
}
除构造器之外,编译器禁止其他任何方法调用构造器,只能是构造器调用构造器
static关键字:
static(静态)方法中没有this关键字的方法,在static方法的内部除非使用引用否则不能调用非静态方法;如果你传递一个对象的引用到静态方法里(静态方法可以创建其自身的对象),然后通过这个引用(和this效果相同),你就可以调用非静态方法和访问非静态数据成员了。
清理:
finalize()方法:工作原理:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。finalize并非析构函数。
Java对象并非总是被回收。1、对象可能不被垃圾回收。2、垃圾回收并不等于“析构”。3、垃圾回收只与内存有关。
无论是“垃圾回收”还是“终结”,都不保证一定会发生。
finalize()可能使用的方式:
class Book{
boolean checkedOut = false;
Book(boolean checkOut){
checkedOut = checkOut;
}
void checkIn(){
checkedOut = false;
}
protected void finalize(){
if(checkedOut)
System.out.println("Error:checked out");
}
}
public class TerminationCondition{
public static void main(String[] args){
Book novel = new Book(true);
novel.checkIn();
new Book(true);
System.gc();
}
}
本例中的终结条件是:所有的Book对象在被当作垃圾回收前都应该被签入(check in),System.gs()用于强制进行终结动作。
垃圾回收:
引用计数:一种简单但速度很慢的垃圾回收技术。每个对象都含有一个引用计数器,当有引用连接至对象时,引用计数加1,当引用离开作用域或被置为null时,引用计数减1.当发现某个对象的引用计数为0时,就释放其占用的空间。
停止-复制(stop-and-copy):先暂停程序的运行,然后将所有存活的对象从当前堆中复制到另外一个堆中,没有被复制的全部是垃圾。缺点:首先有两个堆,在两个堆之间进行执行;当程序稳定状态是,复制式回收期仍然将所有内存自一处复制另一处。
标记-清扫(mark-and-sweep):遍历所有存活对象,并在标记完成所有对象后执行清理动作。
自适应技术:自适应的、分代的、停止-复制、标记-清扫。
枚举类型:
枚举类型的关键字为enum,创建enum时编译器会自动添加一些有用的特性:toString()方法,以便可以很方便的显示某个enum实例的名字;ordinal()方法,用来表示某个特定enum常量的声明顺序;static values()方法,用来按照enum常量的声明顺序,产生由这些常量构成的数组。
enum关键字经常和switch语句使用。