目录
一、final简述
- java语言中的关键字
- 表示最终的,不可变得
- 可以修饰变量、方法、类等
- final与abstract不能联合使用
1.1 final修饰的变量:
1.1.1 修饰局部变量
下面这段代码是一个错误的例子 ,是不能二次赋值的,k=300出错
final int k =200;
k=300;
但是下面这个例子是正确的
final int k ;
k=300;
综上所述:一旦给final修饰的变量赋值,便不可修改,不可重新修改,
简言之,final修饰的变量只能赋一次值
1.1.2 修饰引用:永远指向该对象
该引用只能指向一个对象,并且它永远指向该对象,无法再指向其他对象,但是该对象内部的数据可以被修改,说到底只要对象的地址不变即可
并且在该方法执行过程中,该引用指向该对象之后,该对象不会被垃圾回收器回收,直到当前方法结束才会释放空间
下面这两段代码都是错误的
简言之,final修饰的变量只能赋一次值
final Person p = new Person(30);
p= new Person(40);
final Person p = new Person(30);
p= new Person(30);
如下图所示,但是指向不能改动,那 int age 能改成其他数么?答案是可以的!
1.1.3 修饰实例变量:必须手动赋值
万变不离其宗:final修饰的变量只能赋值一次
但是当我们不主动赋值的话,系统会赋默认值,那这样后我们还能手动赋值么?
其实并不是我们想想的那样,就比如下一段代码,我们会出现编译时异常
public class User{
final int age;
}
final修饰的实例变量,系统不管赋默认值,因final修饰的变量只能赋值一次(SUN公司设计)
当我们使用final修饰实例变量的时候,我们需要手动赋予他一个默认值,否则会出现编译时异常
1.2 final修饰的方法:无法被子类覆盖与重写
使用方式:
public final void doSome(){
System.out.println("doSome.....");
}
1.3 final修饰的类:无法被继承
我们最熟悉的引用数据类型String类,就被final修饰,也就是说String不能被继承
具体的解释在下面这篇博客当中
被修饰的类无法被继承,比如 final class A,public final String
二、常量
final修饰的实例变量一般添加static修饰,联合修饰的变量称为常量
常量名建议全部大写,每个单词之间采用下划线连接
常量和静态变量都存储在方法区,并且都是在类加载时初始化
因为final修饰的实例变量一旦改变之后便不可更改,这样的话当我们new100个对象时,这个final修饰的实例变量全是一模一样的,这样很占用内存,不如与static共同修饰实例变量
public static final double PI =3.1415926;
常量一般是公开的,因为公开之后你也无法修改