1。常量一种特殊的变量,因为编译器把他们当作值(value)而不是域(field)来对待。如果你的代码中用到了常变量(constant variable),编译器并不会生成字节码来从对象中载入域的值,而是直接把这个值插入到字节码中。这是一种很有用的优化,但是如果你需要改变final域的值,那么每一块用到那个域的代码都需要重新编译。 不是所有的final数据都是常量,只有编译期能确定数值的才能算是常量。
2。在接口中,定义的域(field)默认是public static final的
而定义的方法默认是public abstract的。
3。内部类可以在其他类中定义,也可以在一个语句块内部定义,也可以在表达式内部匿名定义。
a。内部类可以使用包含它的类的静态和实例成员变量,即使他们是private的,但是对于局部变量,只有声明为final的才可以被内部类访问。
b。若声明为static,就不能访问其外部类的非静态成员。
c。若想在内部类中声明任何static成员,则该内部类必须声明为static类。
d。非静态的内部类,持有其外部类对象的引用,可以访问其所有成员,而静态内部类不持有其外部类对象的引用,所以只能访问其外部类的静态成员。
4。类成员变量有默认值,因为类成员变量在堆中赋初值。而局部变量必须赋值才能使用,否则会出现编译错误。因为局部变量使用的是栈内存,出于效率考虑,虚拟机不会为栈上的变量设置默认值。
5。类不能同时声明为final和abstract的,否则会编译错误。
6。子类方法只能抛出比父类范围更小的异常(如父类的异常或者其父类异常的子类)。子类方法的可见性不能小于父类。即:子类不能比父类的限制更多,不然在使用父类引用指向子类对象时,可能会发生无法访问或者异常没有被catch的危险。
7。wait notify yield sleep
wait:当前线程进入信号量或者锁的待召队列,并且放弃信号量或者锁,只有等到其他线程发出notify通知后,才能进入就绪队列。
notify:当前线程发出通知,通知当前信号量或者锁的待召队列中的某个线程进入就绪队列,但是当前线程并不会放弃信号量或者锁,继续执行。
yield:当前线程停止执行,放弃执行权,进入就绪队列。
sleep:当前线程停止执行指定的时间,但是不会放弃持有的锁。