Java Tips
初始化
- 变量
方法局部变量如果不初始化却又使用了,出编译错误。类变量不初始化,会给默认值。
类的所有静态变量都在类的所有普通变量之前初始化。
- 继承
下面这个示例来自 酷壳.
class Base {
Base() {
preProcess();
}
void preProcess() {
}
}
class Derived extends Base {
public String whenAmISet = "set when declared";
@Override
void preProcess() {
whenAmISet = "set in preProcess()";
}
}
初始化顺序
1) 进入Derived 构造函数。
2) *Derived 成员变量的内存被分配, 并清0*
3) Base 构造函数被隐含调用。
4) Base 构造函数调用Derived的preProcess()。
5) Derived 的preProcess 设置whenAmISet 值为 “set in preProcess()”。
6) *Derived 的成员变量初始化被调用*,初始化顺序为按照声明次序,先静态变量,后普通变量。
7) 执行Derived 构造函数体。
关键字
- final
1) final 表示只初始化一次。并不代表编译时就能确定 final 数据的值。
final int x = rand.nextInt(20);
2) static 与 final
static 代表只有一份, final 表示只初始化一次,但static只在类加载时初始化,非 static 在生成对象时初始化。
final int x = rand.nextInt(20);
static final int y = rand.nextInt(20);
y
作为一个静态变量,在类被加载时初始化一次。而 x
是普通变量,在每次生成新对象时都会初始化。
3) final 表示引用不变,并不代表引用的对象不变
final int[] a = {2, 3};
// a = new int[1]; error
a[0] = 1; // correct
多态
适用范围 多态是针对非static, 非private方法的, private方法, static方法,域,都不具有多态的特性。
构造器内 在构造器内调用一个多态的方法,实际调用的应该是覆盖后的方法,但是这种行为可能造成难以预料的后果,因为构造器是用来构造对象的, 对象还没有初始化完毕,就调用它的一个方法,可能会使对象处于不正确的状态。
接口
接口中的方法都是 public
的,因为它本来就是提供给外界使用的。 接口中的域都是 static final
的。
一个类可以实现多个接口。一个接口可以继承其它接口。一个接口可以嵌套在其它接口或者类中。
内部类
内部类实现了一个 public 接口,这时外部就可以通过这个接口使用内部类的功能,而外部对内部类的实现一无所知。 同时,内部类还拥有访问外部类所有字段的特性,并且内部类的每个对象都有自己的状态。 参考 JDK 中 ArrayList 的 Iterator 的实现方式。 一个 List 可以有多个迭代器,每个都有不同的状态,处于 List 的不同位置。 如果 ArrayList 直接实现 Iterator 接口,就很难有这样的 效果。
泛型
- 什么是泛型,有什么好处
泛型将类型参数化。好处是使得类,方法,接口更通用。同时提供编译期的类型推断,避免强制类型转化。提供编译期类型检查,避免 出现类型不匹配。
- List, List<?>, List
使用 List 时编译器不会进行类型检查,使用后两者是则会。 List<?> 表示某种特定类型的 List, List
public void foo(List list) {
}
public void bar(List<?> list) {
}
public void git(List<Object> list) {
}
public void test() {
List<Integer> list = new ArrayList<>();
foo(list);
bar(list);
// The method git(List<Object>) in the type Generic is not applicable for
// the arguments (List<Integer>)
// git(list);
}
语法坑
- Double 中的 0.0 与 -0.0
Double d1 = new Double(0.0);
Double d2 = new Double(-0.0);
d1.equals(d2); // false
0.0 == -0.0; // true