final关键字
final基本介绍
- final是最终的意思,可以修饰类,属性,方法,局部变量
- 什么时候会要使用到final呢?
1.想要类不被继承时
2.不希望类的某个属性的值被改变时
3.不想父类的某个方法被子类重写时
4.不想某个局部变量被修改时
代码演示:
java
public class Final01 {
public static void main(String[] args) {
E e = new E();
//e.TAX_RATE = 0.9;TAX_RATE 被final修饰,值不能改变
}
}
final class A{//1.不希望被继承的时候用final修饰,这样B就不能继承A了
}
//class B extends A{ }A被final修饰,不能被继承
class C{
public final void tao(){//3.不想被子类重写此方法,用final修饰此方法
//加了final的NUM也可以被叫做局部常量,不能修改
final double NUM = 0.9;//4.如果不想局部变量被修改,用final修饰
//NUM = 1.00;NUM被final修饰,值不能被改变
}
}
class D extends C {
// @Override
// public void tao() {//重写C的方法
// super.tao();
// }
// tao()被final修饰,不能被子类重写
}
class E{
public final double TAX_RATE = 0.8;//2.不希望类的某个属性被修改,用final修饰
}
final的使用细节
- final修饰的属性也可以叫常量,一般用XX_XX来命名
- final修饰的属性在被定义时必须要初始化 并且不能修改,初始化可以写在三个位置:
1.定义属性时
2.在构造器中初始化
3.在代码块中初始化 - 如果final修饰的属性是静态 的,那么只有两个位置可以初始化
1.定义属性时
2.在代码块中初始化
(不能在构造器中初始化,因为静态属性在类加载的时候就要被初始化,而构造器在实例化对象时才会被调用) - final类不能被继承,但是可以实例化对象
- 一个非final类含有final修饰的方法,这个方法虽然不能被子类重写,但是可以被子类继承并使用
代码演示:
java
public class FinalDetail01 {
public static void main(String[] args) {
CC cc = new CC();//Final类虽然不能被继承,但是可以实例化对象
new EE().show();//父类没有被Final修饰,但是父类方法被Final修饰,
// 虽然该方法不能被子类重写,但是可以被子类继承
System.out.println(GG.n1);
}
}
//final属性在定义时就必须赋值,并且之后不能在修改
//1.可以在定义属性时赋值
//2.可以在构造器中赋值
//3.可以在代码块中赋值
class AA{
public final double TAX = 0.05;//定义属性时赋值
public final double TAX2;
public final double TAX3;
public AA() {
TAX2 = 0.09;
}//构造器中赋值
{
TAX3 = 0.4;
}//代码块中赋值
}
//如果Final修饰的属性是静态的,那么初始化的位置只能有:
//1.定义时赋值
//2.静态代码块中
class BB{
public static final double TAX4 = 0.6;
public static final double TAX5;
public BB() {
//TAX5 = 0.7;赋值失败
//因为是在加载静态属性,并不是在加载实例属性,所以不能在构造器中赋值
//静态属性在类加载的时候就要被初始化,而构造器在实例化对象时才会被调用
}
static{
TAX5 = 0.8;
}//静态代码块中赋值成功
}
final class CC{ }
class DD{
public final void show() {
System.out.println("show()");
}
}
class EE extends DD{ }
final class FF{
public final void hi(){}
//其实这个类已经是Final类了,这个方法就没有必要被修饰成Final方法了
//因为这个方法不能被继承,所以不能被重写
}
class GG{
String s1 = "hello";//String是Final类,不能被继承
public static final int n1 = 10;
//当static和Final搭配使用时,调用这个属性,不会导致类被加载,所以下面静态代码块中的语句不会被执行
static{
System.out.println("静态代码块被调用...");
}
}