项目代码

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