全網最全fianl關鍵字講解
阿新 • • 發佈:2020-12-23
final引入
在繼承關係中,有時候父類中的功能方法不想讓子類覆蓋或者重寫,必須提供一個關鍵字
-------- final:最終的,無法更改的!!!
注意:父類中的並不是所有的功能都必須使用final修飾,某些功能方法需要用fianl修飾確保功能的安全性!!
//父類
class Fu{
public final void show(){
System.out.println("這裡是絕密資源,任何人都不得更改...") ;
}
}
//子類
class Zi extends Fu{
public void show (){ //Zi中的show()無法覆蓋Fu中的show() ,因為父類的show方法被final修飾了
System.out.println("這是一堆垃圾...") ;
}
}
//測試類
class FinalDemo{
public static void main(String[] args){
//建立子類物件
Zi zi = new Zi();
zi.show() ;
}
}
final的應用
可以修飾類,無法被繼承!
可以修飾變數,此時這個變數是常量,被final修飾的變數,只能賦值一次!
可以修飾成員方法,此時該方法不能被重寫!
/*
常量的分類
1)字面值常量
"hello",10,3.13,true...,'A','0','a'
2)自定義常量
public final int num2 = 100 ;
*/
class Fu{
public int num = 10 ;
public final int num2 = 30 ;
//被final修飾的成員方法
public final void method(){ //Zi中的method()無法覆蓋Fu中的method()
System.out.println("method fu...") ;
}
}
//class Zi extends Fu{ //無法從最終Fu進行繼承
class Zi extends Fu{
public void show(){
//num2 = 300 ;錯誤: 無法為最終變數num2分配值
System.out.println(num) ;
System.out.println(num2) ;
}
public void method(){
System.out.println("method zi...") ;
}
}
//測試
class FinalDemo2{
public static void main(String[] args){
//建立子類物件
Zi zi = new Zi() ;
zi.show() ;
//zi.num2 = 200 ;
System.out.println("-----------") ;
zi.method() ;
}
}
final修飾基本資料型別和引用資料型別的區別
final可以修飾基本資料型別的變數,當前該變數的值不能被改變!
final可以修飾引用資料型別,當前該類物件的地址值不能被改變!
//學生類
class Student{
int age = 20 ;
public Student(){}
}
//測試類
class FinalTest{
public static void main(String[] args){
//定義一個區域性變數
//int num = 10 ;
//System.out.println(num) ;
//num = 100 ;
int num ;//定義了
num = 100 ;
System.out.println(num) ;
//final int num2 = 50 ; //num2此時常量 (常駐記憶體),只能初始化一次
//final修飾基本資料型別
final int num2 = 20 ;
num2 = 200 ;
System.out.println(num2) ;
System.out.println("---------------------");
//建立一個學生物件
//Student s = new Student() ;
//s.age = 38 ;
//System.out.println(s.age) ;
//final修飾的引用資料型別
final Student ss = new Student() ;
ss.age = 50 ;
System.out.println(ss.age) ;
//ss = new Student() ; //重新申請堆記憶體空間 錯誤: 無法為最終變數ss分配值
ss.age = 60 ;
System.out.println(ss.age) ;
}
}
final修飾變數的初始化時機:
變數只能被初始化一次
當前變數只是定義了,在構造方法執行之前必須初始化
class Student{
//public final int num = 100 ; //final修飾了
public final int num ; //定義
//構造程式碼塊
//{
// num = 50 ; //變數只能被初始化一次,多次初始化,編譯不通過!
//}
public Student(){
//對num進行資料初始化
num = 100 ;
System.out.println("構造方法的作用就是資料初始化") ;
}
}
//測試
class FinalTest2{
public static void main(String[] args){
Student s = new Student() ;
System.out.println(s.num);
}
}