在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。下面就从这三个方面来了解一下final关键字的基本用法。
(1)修饰类
当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
(2)修饰方法
子类无法覆盖该方法;
(3)修饰变量
对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。重新赋值会出现错误。
(1)final修饰会在编译时替换常量
String a = "hello2";
final String b = "hello";//被final修饰的常量字符串
String d = "hello";
String c = b + 2;
String e = d + 2;
System.out.println((a == c));//true
System.out.println((a == e));false
因为b被final修改,所以b不可以再指向其他常量字符串,b的值就固定了。所以在编译阶段,c就被优化为字符常量“hello2”,a/c同时指向常量池中字符串“hello2”。而e会在堆上上创建对象。创建的是
(2)使用方法返回时不会在编译时被优化替换
public class Test {
public static void main(String[] args) {
String a = "hello2";
final String b = getHello();
String c = b + 2;
System.out.println((a == c));//false
}
public static String getHello() {
return "hello";
}
}
只有在编译期间能确切知道final变量值的情况下,编译器才会进行这样的优化。
(3)final修饰的引用变量指向的对象内部变量可以变
public class Test {
public static void main(String[] args) {
final MyClass myClass = new MyClass();//指向的对象不能变
System.out.println(++myClass.i);//对象内部的变量值可以变
}
}class MyClass {
public int i = 0;
}
final修饰的变量,表示只能在定义或者构造函数中初始化赋值,赋值后不能修改。不同的对象可以初始化为不同的值。Static则表示一个类创建的所有对象都共享这一个静态变量,任何一个对象对这个共享变量进行修改,其他对象使用该变量时值都会是改变后的值。
MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();
System.out.println(myClass1.i);//i不同,两个对象有两个final值
System.out.println(myClass2.i);
System.out.println(myClass1.j);//j相同,静态变量只第一次创建对象时初始化值;
System.out.println(myClass2.j);
class MyClass
{
public final double i = Math.random();//final变量
public static double j = Math.random();//静态变量
原文:https://www.cnblogs.com/bclshuai/p/10509517.html