Java Tips

Published: 09 Sep 2014 Category: 技术

初始化

  • 变量

方法局部变量如果不初始化却又使用了,出编译错误。类变量不初始化,会给默认值。

类的所有静态变量都在类的所有普通变量之前初始化。

  • 继承

下面这个示例来自 酷壳.

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 接口,就很难有这样的 效果。

泛型

  • 什么是泛型,有什么好处

泛型将类型参数化。好处是使得类,方法,接口更通用。同时提供编译期的类型推断,避免强制类型转化。提供编译期类型检查,避免 出现类型不匹配。