目錄1.修飾類時2.修飾方法時3.修飾屬性和局部變數時3.1修飾局部變數時3.2修飾成員變數時3.3修飾類變數時4.final與普通變數的區別5.final用於引用 1.修飾類時 1.只能是公共的(public)就算不寫也是public 2.被final修飾的類不可以被繼承 //前面預設有個publ ...
目錄
1.修飾類時
1.只能是公共的(public)就算不寫也是public
2.被final修飾的類不可以被繼承
//前面預設有個public 寫不寫都行
final class A{
}
2.修飾方法時
1.方法不能不能覆蓋
2.被final修飾的方法,JVM會嘗試將其內聯,以提高運行效率
3.修飾屬性和局部變數時
3.1修飾局部變數時
1.要賦值
2.不能被改變
public class Test01 {
public static void main(String[] args) {
go();
}
public static void go(){
// 方式一:初始化的時候賦值
// final int age = 10;
// 方式二:先初始化後賦值
final int age;
age = 10;
System.out.println(age);
}
}
3.2修飾成員變數時
1.必須在系統賦預設值之前賦值
2.不可更改
public class Test01 {
// 1.寫法一報錯未在創建時聲明對象
// final int a;
// a =10;
// 2.寫法二正確
// final int a = 10;
// 3.寫法三正確
final int a;
// 趕在系統賦預設值之前賦值就行,系統賦預設值在構造方法執行的時候
public Test01() {
this.a =0;
}
}
final String name = "qy";
//報錯
name = "ym";
final Object obj = new Object();
//報錯
obj = new Object();
3.3修飾類變數時
1.與static結合使用修飾的變數是常量
2.常量要符合命名規範,全部大寫,可以用下劃線連接
3.被final修飾的常量,在編譯階段會存入常量池中
public class Main {
// final 放前放後都一樣
// final static double PI = 3.1415926;
static final double PI = 3.1415926;
}
4.final與普通變數的區別
public class Test1 {
public static void main(String[] args) {
String a = "hello2";
final String b = "hello";
String d = "hello";
String c = b + 2;
String e = d + 2;
System.out.println((a == c));
System.out.println((a == e));
}
}
//結果
//true
//false
public class Test2 {
public static void main(String[] args) {
String a = "hello2";
final String b = getHello();
String c = b + 2;
System.out.println((a == c));
}
public static String getHello() {
return "hello";
}
}
//結果
//false
通過上面兩個例子,我們可以發現在Test1中被final修飾的變數在進行字元串串接的時候,地址沒變,但是在Test2中通過方法調用後就變了,也就是說間接的賦值會改變地址。
5.final用於引用
如果修飾引用,那麼表示引用不可變,引用指向的內容可變。
public class Test02 {
public static void main(String[] args) {
final Student stu = new Student("小芊",18);
//可以修改裡面的值
stu.setName("芊嵛");
// 不能再new
// stu = new Student("ff",5);
}
}