final定义的变量可以看做一个常量,不能被改变;
final定义的方法不能被覆盖;
final定义的类不能被继承。
final static 就是再加上static的特性就可以了
final:
final可修饰类、域(变量和常量)、方法 (而static不修饰类)
1、final修饰类,表示该类不可被继承。
如定义了一个final类:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
final
class
SnowBird{
int
i;
String s;
static
void
fly(){
System.out.println(
"snowbird is flying"
);
}
}
//现在定义一个类,试图继承SnowBird类:
public
class
Bird
extends
SnowBird{
public
static
void
main(String[] args){
SnowBird.fly();
}
}
|
把上面的两个类拷贝到文件中,文件名保存为Bird.java ,现在编译看看会出现什么问题?
出错信息是:cannot inherit from final SnowBird
表明final 类不可被继承。
那么,final修饰变量是怎么样呢?
2、final修饰变量
程序中经常需要定义各种类型的常量,如:3.24268,"201"等等。这时候我们就用final来修饰一个类似于标志符名字。如:
final String connectNumber = "201";
final表明 connectNumber是一个常量,它的取值在整个过程都不会改变。
如果把final 去掉则connectNumber就成为变量了。
有时我们为了节省空间,常量通常声明为 static .因为如上所说的 static 用的是类的内存空间。
3、修饰方法:
final修饰的方法,称为最终方法。最终方法不可被子类重新定义,即不可被覆盖。
如父类定义了public void fly(){ ....}
则子类就不能定义
public void fly(){。。。。。。}
但注意覆盖与重载的区别。不能被覆盖并不是不能被重载,如你还可以定义
public void fly(int i){.....},
举个例子如下:
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
|
class
FinalValue {
static
final
int
i =
1
;
final
void
fly(){
System.out.println(
"SnowBird is flying over FinalValue "
);
}
}
class
TestFinal
extends
FinalValue {
int
i =
2
;
void
fly(){
System.out.println(
"SnowBird is flying over TestFinal"
);
System.out.println(
"In class FinalValue static Final i = "
+ FinalValue.i);
System.out.println(
"In class TestFinal i = "
+ i);
}
void
fly(String s){
System.out.println(
"fly("
+ s +
")"
);
}
}
public
class
Test {
public
static
void
main(String args[]){
TestFinal tf =
new
TestFinal();
tf.fly();
tf.fly(
"ok"
);
System.out.println(tf.i);
}
}
|
把上面的程序保存为Test.java编译看看,出现什么错误?
然后,把TestFinal类中的 void fly(){ ... } 注解掉
即 如下
1
2
3
4
5
|
/* void fly(){
System.out.println("SnowBird is flying over TestFinal");
System.out.println("In class FinalValue static Final i = "+ FinalValue.i);
System.out.println("In class TestFinal i = "+ i);
}*/
|
现在再编译看看通过了吗? 可见重载与覆盖的区别了吧。 还发现 FinalValue中的 i 与 TestFinal中的 i 没关系 。因为对于变量而言,重定义只是父类的同名域被隐藏了而已。