final修饰符
  • final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。

1、final关键字基本用法

1.1修饰变量

  • 凡是对成员变量或者局部变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫作final变量。final变量经常和static关键字一起使用,作为常量。
  • final修饰基本数据类型的变量时,必须赋予初始值且不能被改变,修饰引用变量时,该引用变量不能再指向其他对象

例如:

package com.q._final;
/*
* final :
* 表示最终的,不可变的 */
public class FinalData {
public final String s = "abc";
public void test(){
final Object obj = new FinalData();
}
}


当final修饰基本数据类型变量时不赋予初始值以及引用变量指向其他对象时就会报错

当final修饰基本数据类型变量被改变时,就会报错

1.2修饰方法

final也可以声明方法。方法前面加上final关键字,代表这个方法不可以被子类的方法重写。如果你认为一个方法的功能已经足够完整了,子类中不需要改变的话,你可以声明此方法为final。final方法比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定。

3.修饰类

使用final来修饰的类叫作final类。final类通常功能是完整的,它们不能被继承。Java中有许多类是final的,譬如String, Interger以及其他包装类。

2 、深入分析final关键字

1.被final修饰的对象内容是可变的

虽然对象被final修饰对象不可被继承,但其内容依然可以被改变

2.final关键字与static对比

static关键字修饰变量时,会使该变量在类加载时就会被初始化,不会因为对象的创建再次被加载,当变量被static 修饰时就代表该变量只会被初始化一次

package com.q._final;
/*
* final :
* 表示最终的,不可变的 */
public class FinalData {
public final String s = "abc";
public void test(){
final Object obj = new FinalData();
}
public final double a= Math.random();
public static double b= Math.random();
public static final double c= Math.random();

public static void main(String[] args) {
FinalData finalData1 = new FinalData();
FinalData finalData2 = new FinalData();
FinalData finalData3 = new FinalData();
System.out.println(finalData1.a);
System.out.println(finalData2.a);

System.out.println(b);
System.out.println(b);

System.out.println(c);


}
}


例如图中所示,被static修饰的变量j,虽然创建两个对象,对值并没有变化。

final 修饰实例变量 必须在创建对象new 时赋值

系统赋默认值之前就行

我们请看下面的例子:

package com.q._final;
/*
* final :
* 表示最终的,不可变的 */
public class FinalData {
public final String s = "abc";
public void test(){
final Object obj = new FinalData();
}
private final double a= Math.random();
private static double b= Math.random();
private static final double c= Math.random();

public FinalData() {
System.out.println(a);
System.out.println(b);
System.out.println(c);
}

public String getS() {
return s;
}

public double getA() {
return a;
}

public static double getB() {
return b;
}

public static double getC() {
return c;
}
}
class Test {
public static void main(String[] args) {
System.out.println("-------------------");
FinalData finalData1 = new FinalData();
System.out.println("-------------------");
FinalData finalData2 = new FinalData();
System.out.println("-------------------");
FinalData finalData3 = new FinalData();
System.out.println("-------------------");
System.out.println(finalData1.getA());
System.out.println(finalData2.getA());
System.out.println("-------------------");


int i = 100;
final int i0 = i;
System.out.println(i);
System.out.println(i0);
i = 1000;
System.out.println(i);
System.out.println(i0);

}
}


final修饰符_基本数据类型


作者:致非​