项目代码
https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/final_
一、final关键字基本介绍
final可以修饰类、属性、方法和局部变量,
在某些情况下,程序员可能有以下需求,就会使用到final
1)当不希望类被继承时,可以用final修饰
2)当不希望父类的某个方法被子类覆盖/重写(override)时,可以用final关键字修饰
3)当不希望类的的某个属性的值被修改,可以用final修饰.
4)当不希望某个局部变量被修改,可以使用final修饰
public class Final01 {public static void main(String[] args) {E e = new E();// e.TAX_RATE = 0.09;}}final class A{}// class B extends A{} 1)当不希望类被继承时,可以用final修饰.class C{// public final void hi(){ //2)当不希望父类的某个方法被子类覆盖/重写(override)时,可以用final关键字修饰// System.out.println("C类的hi方法");// }}class D extends C{public void hi(){System.out.println("重写了子类的hi方法");}}class E{public final double TAX_RATE = 0.08;}class F{public void cry(){final double NUM = 0.01;// NUM = 0.9;System.out.println(NUM);}}
二、final关键字使用注意事项和细节讨论
1.final修饰的居性又叫常量,一般用XX_XX_XX_X来命名
2.final修饰的属性在定义时必须赋初值并且以后不能再修改,赋值可以在如下位置之一
①定义时:如public final double TAX RATE=0.08;
②在构造器中
③代码块中。
class AA{public final double TAX_RATE1 = 0.08;public final double TAX_RATE2;public final double TAX_RATE3;//①定义时:如public final double TAX RATE=0.08;// //②在构造器中// //③代码块中。public AA(){TAX_RATE2 = 1.1;}{TAX_RATE3 = 10.0;}}
3.如果final修饰的属性是静态的,则初始化的位置只能是
①定义时②在静态代码块不能在构造器中赋值。
4.final类不能继承,但是可以实例化对象。
5.如果类不是final类,但是含有final方法,则该方法虽然不能重写,但是可以被继承。
public class FinalDetail01 {public static void main(String[] args) {new AA();new EE().cal();}}class DD{public final void cal(){System.out.println("cal()方法");}}class EE extends DD{}
5.一般来说,如果类已经是final类了,就不需要再将方法修饰成final
6.final不能修饰构造器方法(构造器)
7.final和static往往搭配使用,效率更高,不会导致类加载底层编译器做了优化处理。
public class FinalDetail02 {public static void main(String[] args) {System.out.println(BBB.num);}}class BBB{public final static int num = 10000;//去掉final会执行BBB代码块初始化//final和static往往搭配使用,效率更高,不会导致类加载底层编译器做了优化处理。static {System.out.println("BBB代码块被执行");}}
8.包装类(Integer, Double,Float, Boolean等都是fina),String也是final类.
三、final关键字的练习
1.
请编写一个程序,能够计算圆形的面积。要求圆周率为3.14.赋值的位置3个方式都写一下.
public class FinalExercise01 {public static void main(String[] args) {Cirle cirle = new Cirle(6);System.out.println(cirle.cal());}}class Cirle{private double radius;private final double PI = 3.14;public Cirle(double radius) {this.radius = radius;}public double cal(){return radius * radius * PI;}}
其实正常来说应该做成静态方法,不创建对象也能计算,但考虑到可能要保存实例的属性,用上面的也对
下面给个static的
public class FinalExercise01 {public static void main(String[] args) {System.out.println(Cirle.cal(6));}}class Cirle{private final static double PI = 3.14;public static double cal(double radius){return radius * radius * PI;}}
2.
下面的那个对return x + 1 是+符号没有在改变x