物件導向-final關鍵字

ZHOU_VIP發表於2017-05-06

final關鍵字(掌握)

(1)是最終的意思,可以修飾類,方法,變數。

(2)特點:

    A:它修飾的類,不能被繼承。

    B:它修飾的方法,不能被重寫。

    C:它修飾的變數,是一個常量。

(3)面試相關:

    A:區域性變數

        a:基本型別 值不能發生改變

        b:引用型別 地址值不能發生改變,但是物件的內容是可以改變的

    B:初始化時機

        a:只能初始化一次。

        b:常見的給值

            定義的時候。(推薦)

            構造方法中。


/*
	繼承的程式碼體現
	
	由於繼承中方法有一個現象:方法重寫。
	所以,父類的功能,就會被子類給覆蓋調。
	有些時候,我們不想讓子類去覆蓋掉父類的功能,只能讓他使用。
	這個時候,針對這種情況,Java就提供了一個關鍵字:final
	
	final:最終的意思。常見的是它可以修飾類,方法,變數。
*/
class Fu {
	public final void show() {
		System.out.println("這裡是絕密資源,任何人都不能修改");
	}
}

class Zi extends Fu {
	// Zi中的show()無法覆蓋Fu中的show()
	public void show() {
		System.out.println("這是一堆垃圾");
	}
}

class ZiDemo {
	public static void main(String[] args) {
		Zi z = new Zi();
		z.show();//異常
	}
}


/*
	final可以修飾類,方法,變數
	
	特點:
		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 {
	//報錯:Zi中的show()無法覆蓋Fu中的show()
	public void show() {
		num = 100;
		System.out.println(num);
		
		//報錯:無法為最終變數num2分配值
		//num2 = 200;
		System.out.println(num2);
	}
}

class FinalDemo {
	
	public static void main(String[] args) {
		Zi z = new Zi();
		z.show();
	}
	
}

面試題:final修飾區域性變數的問題:

/*
	面試題:final修飾區域性變數的問題
		基本型別:基本型別的值不能發生改變。
		引用型別:引用型別的地址值不能發生改變,但是,該物件的堆記憶體的值是可以改變的。
*/
class Student {
	int age = 10;
}

class FinalTest {
	public static void main(String[] args) {
		//區域性變數是基本資料型別
		int x = 10;
		x = 100;
		System.out.println(x);//100
		
		final int y = 10;
		//y = 100;
		System.out.println(y);//報錯:無法為最終變數y分配值

		
		//區域性變數是引用資料型別
		Student s = new Student();
		System.out.println(s.age);//10
		s.age = 100;
		System.out.println(s.age);//100

		
		final Student ss = new Student();
		System.out.println(ss.age);//10
		ss.age = 100;
		System.out.println(ss.age);//100
		
		//重新分配記憶體空間,就是給新的地址值
		ss = new Student();//報錯:無法為最終變數ss分配值
		
	}
}

final修飾變數的初始化時機:


列印的是100


報錯:無法為最終變數num2分配值,因為常量不能重新賦值


/*
	final修飾變數的初始化時機
		A:被final修飾的變數只能賦值一次。
		B:在構造方法完畢前。(僅僅針對非靜態的常量,因為靜態的早就載入了)
*/
class Demo {
	
	int num;
	final int num2;
	
	{
		//num2 = 10;
	}
	
	public Demo() {
		num = 100;
		num2 = 200;
	}
}

class FinalTest2 {
	
	public static void main(String[] args) {
		Demo d = new Demo();
		System.out.println(d.num);
		System.out.println(d.num2);
	}
	
}


相關文章