JavaSE——final关键字与常量

一、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;

常量一般是公开的,因为公开之后你也无法修改

经验分享 程序员 微信小程序 职场和发展