1.第一个自变量传递给方法f(),而且那个自变量是准备操作的那个对象的句柄。Banana.f(a, 1),Banana.f(a,2)这是内部的表达形式。假设我们在一个方法的内部,并希望获得当前对象的句柄。由于那个句柄是编译器"秘密"传递的,所以没有标识符可用。this关键字(注意只能在方法内部使用)可为已调用了其方法的那个对象生成相应的句柄。可象对待其他对象句柄一样对待这个句柄。
public class Leaf {
private int i = 0;
Leaf increment() {
i++;
return this;
}
public static void main(String[] args) {
Leaf x = new Leaf();
x.increment().increment().print();
}
}
2.对象的创建过程:
类型为Dog的一个对象首次创建时,或者Dog类的static方法/static字段首次访问时,java解释器必须找到Dog.class(在事先设好的类路径里搜索)。
找到Dog.class后(它会创建一个Class对象),它的所有static初始化模块都会运行。因此,static初始化仅发生一次——在Class对象首次载入的时候。
创建一个new Dog()对象时,Dog对象的构建进程首先会在内存堆里为一个Dog对象分配足够多的存储空间。
这种存储空间会清为零,将Dog中的所有基本类型设为它们的默认值。
进行字段定义时发生的所有初始化都会执行。
执行构建器。这实际可能要进行相当多的操作。
3.首次生成那个类的一个对象时,或者首次访问属于那个类的一个static成员时(即便从未生成那个类的对象)
4.编译器不允许我们告诉它一个数组有多大。数组一旦超过边界,就会产生一个运行期错误,当然,由于需要检查每个数组的访问,所以会消耗一定的时间和多余的代码量,而且没有办法把它关闭。这意味着数组访问可能成为程序效率低下的重要原因。