final可以用于修饰属性、方法和类。我从大到小一一说明一下。
修饰类##
被final修饰的类无法被继承
新建立一个finalDemo项目,新建A、B、C三个类。其中B用final修饰,让C分别继承A和B,结果是C继承B时会报错。
public class A {
}
final public class B { //用final修饰的类,无法被继承
}
/*
报错!类B被final修饰了,无法继承
public class C extends B {
}
*/
public class C extends A {
}
修饰方法##
被final修饰的方法有两条规矩。
- 第一,被final修饰的方法被继承后不能被重写。
在类A添加一个show方法,用final修饰。在继承类A的类C里重写show方法,结果报错了,因为show方法被final修饰所以无法被重写。
public class A {
//被final修饰的方法无法被重写
protected final void show() {
}
}
public class C extends A {
/*
报错!show()在父类A里被定义为final,无法被重写
@Override
protected void show() {
super.show();
}
*/
}
- 第二,构造构造方法无法被final修饰
在类A添加以下构造方法将会报错。
/*
报错!构造方法无法被定义为final
public final A() {
}
*/
修饰属性##
被final修饰的变量被赋值后无法再修改值,也就是说fianl变量只能被赋值一次。
用final修饰属性和两种情况讨论,一种是成员变量第二种是局部变量。
- 因为成员变量会自动初始化,例如int默认值为0,double为0.0,boolean为false。也就是说自动初始化已经占用了唯一一次赋值的机会,而0、0.0和false又没什么意义。所以Java要求被final修饰的成员变量必须赋一个初始值。
在类A里添加以下两个final成员变量,其中s1因为赋初始值所以报错。
//final String s1; //报错!成员变量被final修饰必须赋初始值
final String s2 = "赋了初始值就不会报错了";
- 因为局部变量不会自动初始化,所以声明一个被final修饰的局部变量后不会要求立刻赋值。但是随后赋值之后就不能再更改值了,因为被final修饰的变量有且仅有一次赋值的机会。
在类A的show方法里添加成员final局部变量i,先声明不赋初始值程序正常。接着赋一个初始值10,程序正常。
再赋值为20,程序报错,因为final变量一旦初始化后则无法变更值。
final int i; //可以不赋值,因为局部变量不会自动初始化
i = 10; //第一次赋值
//i = 20; //报错!因为final
本文代码下载百度网盘
网友评论