学习过程:
定义:
final 关键字
使用final关键字做标识有“最终的”含义
final 可以修饰类、方法、属性和变量
1、final 修饰类,则该类不允许被继承
2、final 修饰的引用类型的数据,那么指的是地址不可变,但是对象中的元素或者属性值可以改变
3、final 修饰方法,则该方法不允许被覆盖(重写)
4、final 修饰属性
则该类的属性不会进行隐式的初始化(类的初始化属性必须有值)
或在构造方法中赋值(只能选其一)
5、final 修饰变量,则该变量的值只能赋值一次,即变为常量。
6、对于成员常量要求在对象创建完成之前给值;对于静态常量而言要求在类加载完成之前给值
注意:常量的存储和方法区中的运行时常量池有关
public class A { private final int i; /* { i = 4; } */ public A(){ // this(5); this.i = 0; } // 无参构造中未初始化常量i public A(int i){ this.i = i; // 常量的二次赋值 } }
实例1:
final 修饰类,则该类不允许被继承
public final class Animal { //final修饰的父类, public int age = 10; public String name; public void eat() { System.out.println("动物具有吃东西的方法"); } }
此时如果子类要继承用final修饰的类就会报错
实例2:
final 修饰方法,则该方法不允许被覆盖(重写)
public class Animal { public int age = 10; public String name; public final void eat() { //final修饰的父类的方法 System.out.println("动物具有吃东西的方法"); } }
父类的方法被final定义之后,子类是不可以重写父类的方法的,编译会报错。
实例3:
final 修饰变量,则该变量的值只能赋值一次,即变为常量
被final修饰的变量是不可以再次赋值的,所以报错。
实例4:
final 修饰属性
则该类的属性不会进行隐式的初始化(类的初始化属性必须有值)
或在构造方法中赋值(只能选其一)
上面图是一个不赋值的操作。
上图是一个定义常量之后在构造方法里面赋值的方式。
实例5:
final 修饰方法提内部的变量