1. 程式人生 > 其它 >全網最全fianl關鍵字講解

全網最全fianl關鍵字講解

技術標籤:Java基礎javafianl

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