**
final关键字
**
1.final是一个关键字,表示最终的,不变的
2.final修饰的类无法被继承 //例如String类是使用final修饰,不能使用class MyString extends String
//编译报错 java: 无法从最终Hello.FinalTest进行继承
class Test2 extends FinalTest{
}
final class FinalTest
{
}
3.final修饰的方法无法被覆盖
//编译报错 java: Hello.Test2中的mm()无法覆盖Hello.FinalTest中的mm()被覆盖的方法为final
class Test2 extends FinalTest{
void mm()
{
}
}
class FinalTest
{
final void mm()
{
}
}
4.final修饰的变量一旦赋值后,不能被修改
final int k = 10;
k = 20; //编译报错 java: 无法为最终变量k分配值
final int k;
k = 20; //可以第一次赋值
k = 20 //编译报错 java: 无法为最终变量k分配值
5.final修饰的实例变量,必须手动赋值,不可二次赋值
class FinalTest
{
//final int age; //java: 变量 age 未在默认构造器中初始化
final int age2 = 10; //解决方案一
//***** //解决方案二
final int num;
public FinalTest()
{
num = 1;
}
//*****
}
6.final修饰的引用,一旦指向某一个对象,不可以再次指向其他对象,它指向的对象无法被垃圾回收器回收
class Test2 {
int id;
public Test2(int id_)
{
this.id = id_;
}
}
class FinalTest
{
public static void main(String[] args) {
final Test2 t = new Test2(10);
//t = null; //编译出错:java: 无法为最终变量t分配值
t.id=20; //正确,虽然final修饰的引用指向某个对象后不可以指向其他对象,但是它指向的对象的内部内存是可以修改的
}
}
7.final修饰的实例变量,一般和static联合使用,称为常量
class Chinese
{
//国籍
//需求:每一个中国人的都是中国,而且国籍无法改变,为了防止国籍被改变,建议加上final修饰
//final修饰的实例变量是不可变的,这种变量一般和static联合使用,称为常量【如果不加static,每次创建一个对象都会申请一个内存,造成空间浪费】
//语法格式是: public static final 类型 常量名 = 值;eg:public static final double PI = 3.1415926;
//JAVA中常量名要求却不大写,单词之间用下划线隔开
public static final String GUO_JI = "中国";
}
class Math
{
public static final double PI = 3.1415926;
}