[Java教程 33] final關鍵字
阿新 • • 發佈:2018-12-13
final關鍵字引入
final關鍵字是最終的意思。可以修飾類、成員方法、成員變數。
/* 繼承的程式碼體現: 由於繼承中方法有一個現象:方法重寫。 所以,父類的功能,就會被子類給覆蓋。 有些時候,我們不想讓子類去覆蓋掉父類的功能,只能讓他使用。 這個時候,Java就為我們提供了一個關鍵字:final final:最終的意思。常見的它可以修飾類、方法、變數。 */ class Fu{ public final void show(){ System.out.println("絕密檔案,任何人不能修改"); } } class Zi extends Fu{ public void show(){ System.out.println("這是什麼鬼,看不懂,撕掉!"); } } public class ZiDemo{ public static void main(String[] args){ Zi z = new Zi(); z.show(); } }
final關鍵字修飾特點
- 修飾類,該類不能被繼承。
- 修飾方法,該方法不能被重寫(覆蓋)。
- 修飾變數,變數就變成了常量,只能被賦值一次。
/* fianl可以修飾類、方法、變數 特點: final可以修飾類,該類不能被繼承。 final可以修飾方法,該方法不能被重寫(覆蓋) final可以修飾變數,該變數不能被重新賦值,因為這個變數其實是常量。 常量: A:字面值常量 "hello",10,true B:自定義常量 final int x = 10; */ //final class Fu //無法從最終Fu進行繼承 class Fu{ public int num = 10; public final int num2 = 20; /*public final void show(){ }*/ } class Zi extends Fu{ public void show(){ num = 100; System.out.println(num); num2 = 200;//無法為最終變數num2分配值 System.out.println(num2); } } public class FinalDemo{ public static void main(String[] args){ Zi z = new Zi(); z.show(); } }
final修飾區域性變數的問題
/* 面試題:final修飾區域性變數的問題 基本型別:基本型別的值不能發生改變。 引用型別:引用型別的地址值不能發生改變,但是,該物件的堆記憶體的值是可以改變的。 */ class Student{ int age = 10; } public class FinalTest{ public static void main(String[] args){ //區域性變數是基本資料型別 int x = 10; x = 100; System.out.println(x); final int y = 10; //無法為最終變數y分配值 //y = 100; System.out.println(y); System.out.println("-------------------"); //區域性變數是引用型別 Student s = new Student(); System.out.println(s.age); s.age = 100; System.out.println(s.age); System.out.println("-------------------"); final Student ss = new Student(); System.out.println(ss.age); ss.age = 100; System.out.println(ss.age); //重新分配記憶體空間 //無法為最終變數ss分配值 ss = new Student(); } }
final修飾變數的初始化時機
/*
final修飾變數的初始化時機
A:被final修飾的變數只能賦值一次。
B:在構造方法完畢前(非靜態變數)
*/
class Demo{
int num = 10;
final int num2;
//final int num2 = 20;
{
num2 = 10;
}
public Demo(){
num = 100;
num2 = 200;
}
}
public class FinalTest2{
public static void main(String[] args){
Demo d = new Demo();
System.out.println(d.num);
System.out.println(d.num2);
}
}