1. 程式人生 > 其它 >面向物件(11-2):final關鍵字

面向物件(11-2):final關鍵字

面向物件(11-2):final關鍵字

一、final關鍵字的介紹

1、如果父類的東西不想讓子類去繼承:可以使用private修飾或者static
由於繼承方法中有一個現象:方法重寫
所以,當方法可以被重寫的時候,父類原本的方法還在,但呼叫的是子類重寫後的方法;
如果我依舊想保留父類原本的方法,不想讓子類重寫,但想讓子類去用

針對於這樣的情況,java提供了一個關鍵字:final(最終的、不可改變的)

2、使用格式:一般情況下,把final放在訪問許可權修飾後、返回值前
常見的情況下,final不僅可以修飾成員方法,也可以修飾類,變數

案例 :

class Father4{
    //被final修飾的成員方法,不能被子類重寫。
    public final void fun(){
        System.out.println("這是父類的fun方法");
    }
}

class Son4 extends Father4{
/*public void fun(){
        System.out.println("這是父類的fun方法");
    }
    父類中方法中加了final,在子類中重寫會報錯
*/
}

二、final關鍵字的應用

特點

1、被final所修飾的類無法被其他類所繼承

案例:

//建立一個父類
final class Father00{
        }
        
下面這樣寫會報錯
/*
建立一個子類
class Zi00 extends Father00{
}
*/
2、被final所修飾的方法,子類無法重寫;
但是在同一個類中,可以出現同名不同引數列表的且被final修飾的方法,這正是過載
(即、被final所修飾的方法,可以過載,不可重寫)
3、被final修飾的變數變成了常量,無法再重新分配值
	常量:
        A: 字面值常量:
            10,12.34,"hello",'a',true

        B: 自定義常量
            其實就是被final修飾的變數。
            final int a = 10;

三、final關鍵字面試題

1、final修飾區域性變數

(1)被final修飾的區域性變數是基本資料型別的時候,不可以修改值
(2)被final修飾的區域性變數是引用資料型別的時候,該物件的地址值是無法改變的,
    但是引用堆記憶體中的變數是可以發生改變

案例1:

public class FinalDemo2 {
    public static void main(String[] args) {
        //區域性變數,並且a是基本資料型別
        int a = 10;//將10賦值給a
        System.out.println(a);//10
        a = 100;//二次賦值,將100重新賦值給a
        System.out.println(a);//100

		//加final修飾
        final int b = 100;
        System.out.println(b);//100
	//b = 200;前面b被final修飾,不可二次賦值,否則報錯
	//System.out.println(b);
		
//被final修飾的區域性變數是基本資料型別的時候,不可以修改值(也就是不可給他進行二次賦值)

案例2:

class Student{
    int age = 18;
}
public class FinalDemo2 {
    public static void main(String[] args) {

        //建立學生物件
        Student s1 = new Student();
        System.out.println(s1.age);//18
        //final修飾物件
        final Student s2 = new Student();
        System.out.println(s2.age);//地址值無法改變,結果仍是18

        s2.age = 19;
        System.out.println(s2.age);//引用堆記憶體中的變數發生改變,結果是19
    }
}