1. 程式人生 > >[Java教程 33] final關鍵字

[Java教程 33] final關鍵字

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);
	}
}