初始化
1、用构造器确保初始化
创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造器,从而保证了初始化的进行。
如何命名这个方法?
问题:所取的名字可能与类的某个成员名称相冲突;调用构造器是编译器的责任,所以必须让编译器知道应该调用哪个方法。故Java采用了与类相同的名称作为构造器。
2、方法重载
方法名相同,形参不同。
如果传入的数据类型(实际参数类型)小于方法中声明的形式参数类型,实际类型就会自动提升。char型略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升至int型。
如果方法接受较小的基本类型作为参数。如果传入的实际参数较大,就得通过类型转换执行窄化处理。
3、默认构造器
如果类中没有写构造器,则编译器自动会帮你创建一个默认构造器。
4、this关键字
this关键字只能在方法内部使用,表示对"调用方法的那个对象”的引用。
当需要返回对当前对象的引用时,就常用return this;
this关键字将当前对象传给外部其他方法也很有用。
在构造器中调用构造器,避免重复。
5、static关键字
在static方法的内部不能调用非静态方法。
6、初始化
静态初始化只在Class对象首次加载的时候进行一次。
清理
7、垃圾回收
finalize()调用,并非总是被垃圾回收。
- 对象可能不被垃圾回收
- 垃圾回收并不等于"析构“
- 垃圾回收只与内存有关
之所以要有finalize(),是由于在分配内存时可能采用了类似C语言中的做法,这种情况主要发生在“本地方法”的情况下,本地方法是一种在Java中调用非Java代码的方式。
finalize()还有一个有趣的用法,就是对对象终结条件的验证。
了解:引用计数,停止-复制,标记-清扫,Java HotSpot技术采用了惰性评估,意思就是即时编译器只在必要的时候才编译代码。这样,从不会被执行的代码也许压根不会被JIT所编译。代码每次执行的时候都会做一些优化,所以执行的次数越多,他的速度就会越快。
8、枚举类型
enum有一个特别实用的特性,即它可以在switch中使用。
枚举变量必须大写。使用枚举是要创建该类型的引用,并将其赋给某个实例。
程序举例:
public enum Spiciness{
NOT,MILD,MEDIUM,HOT,FLAMING
}
public class Burrito {
Spiciness degree;
public Burrito(Spiciness degree) { this.degree = degree;}
public void describe() {
System.out.print("This burrito is ");
switch(degree) {
case NOT: System.out.println("not spicy at all.");
break;
case MILD:
case MEDIUM: System.out.println("a little hot.");
break;
case HOT:
case FLAMING:
default: System.out.println("maybe too hot.");
}
}
public static void main(String[] args) {
Burrito plain = new Burrito(Spiciness.NOT),
greenChile = new Burrito(Spiciness.MEDIUM),
jalapeno = new Burrito(Spiciness.HOT);
plain.describe();
greenChile.describe();
jalapeno.describe();
}
} /* Output:
This burrito is not spicy at all.
This burrito is a little hot.
This burrito is maybe too hot.