Contents
  1. 1. 1. 对于基本类型
  2. 2. 2. final参数:
  3. 3. 3. final方法:
  4. 4. 4. final和private:
  5. 5. 5. final类:
  6. 6. 补:
  7. 7. 补:空白final:

1. 对于基本类型

  final使数值恒定不变,而对于对象引用,final使引用恒定不变(只能引用这个对象),但引用的对象是可以变的。相当于c++中的 const Person *p = p1;// p里的地址不能变,而地址对应的内容可以变。

2. final参数:

在参数列表中以声明的方式将参数指明为final,这意味着无法在方法中更改引用变量,但引用变量所指向的对象的内容是可以变的。

3. final方法:

一般只有在想明确禁止重写(覆盖)时,才将方法设置为final的。也可以这样理解,为了保留此参数列表形式的方法, 在继承此类时,可以通过重载此方法的名字,衍生出更多的形式,但仍可以通过super关键字调用父类的此方法。

4. final和private:

类中所有的private方法都隐式地指定为是final的。由于无法取用private方法,所以也就无法重写(覆盖)它。可以对private方法添加final修饰词,但这并不能给该方法增加任何额外的意义。

5. final类:

当将某个类的整体定义为final时,就表明了你不允许继承该类,相应的类方法也就是final的了,不能被继承嘛。换句话说,出于某种考虑,你对该类的设计永不需要做任何变动,或者出于安全的考虑,你不希望它有子类。 这个要慎用。

补:

现代java的容器库用ArrayList替代了Vector。ArrayList要合理的多
HashMap替代了Hashtable

补:空白final:

  所谓空白final是指被声明为final但又未给定初始值的域。

  不管什么情况,编译器都确保空白final在使用前必须被初始化。但空白final在关键字final的使用上提供了更大的灵活性,为此,一个类中的final域就可以做到根据对象而有所不同,却又保持其恒定不变的特性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Person{
private int i;
Person() { }
Person(int i){
this.i = i;
}
}

class BlankFinal{ //用了组合
private final int i = 1; //Initialized final
private final int j; //Blank final
private final Person p; //Blank final reference

BlankFinal(){ //在构造器里对final变量进行初始化
j = 2;
p = new Person(10);
}

BlankFinal(int p1){
j = 2;
p = new Person(p1);
}
}

public class lianxix {
public static void main(String[] args)
{

new BlankFinal();
new BlankFinal(100);
}
}
必须在域的定义处或者每个构造器内用表达式对final进行赋值(staic代码块中也行)。
final域在使用前总是被初始化。
Contents
  1. 1. 1. 对于基本类型
  2. 2. 2. final参数:
  3. 3. 3. final方法:
  4. 4. 4. final和private:
  5. 5. 5. final类:
  6. 6. 补:
  7. 7. 补:空白final: