日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

12. final修饰符

發布時間:2025/3/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 12. final修饰符 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、final修飾符概述

1. final可以修飾類、變量和方法

2. final修飾的類、變量和方法不可改變

?

二、final成員變量

1. 對于final修飾的成員變量而言,一旦有了初始值,就不能被重新賦值

2. 由于成員變量不一定需要顯式初始化,故那些既沒有在定義時指定初始值,也沒有在初始化塊、構造器中指定初始值的final成員變量的值將一直是系統默認分配的0、'\u0000'、false或null,這些final成員變量也就完全失去了存在的意義,因此Java規定:final修飾的成員變量必須由程序員顯式地指定初始值

  • final類變量:必須在靜態初始化塊中指定初始值或聲明該類變量時指定初始值,而且只能在兩個地方的其中之一指定
  • final實例變量:必須在非靜態初始化塊、聲明該實例變量或構造器中指定初始值,而且只能在三個地方的其中之一指定
// 定義final成員變量時指定默認值final int a = 6;// 下面final成員變量將在構造器或初始化塊中分配初始值final String str;final int c;final static double d;// 下面定義的ch實例變量是不合法的,因為沒有顯式指定初始值// final char ch;// 初始化塊,可對沒有指定默認值的實例變量指定初始值{str = "Hello";}// 靜態初始化塊,可對沒有指定默認值的類變量指定初始值static{d = 3.14;}// 構造器,可對既沒有指定默認值,又沒有在初始化塊中指定初始值的實例變量指定初始值public FinalVariableTest(){c = 5;}

?

三、final局部變量

1. 相比于成員變量,系統不會對局部變量進行初始化,局部變量必須由程序員顯式初始化,因此使用final修飾局部變量時,既可以在定義時指定默認值,也可以不指定默認值

  • 如果在定義時指定了默認值,則后面代碼中不能再對該變量賦值
  • 如果在定義時未指定默認值,則可以在后面代碼中對該final變量賦初始值,但只能一次,不能重復賦值

?

四、final變量→宏變量

1. 當某個final變量滿足以下兩個條件時,它就不再是一個變量,而是相當于一個直接量(即宏變量)

  • 在該final變量定義時指定了初始值
  • 該初始值可以在編譯時就被確定下來

2. 除了為final變量賦值時賦直接量的情況外,如果被賦的表達式只是基本的算術表達式或字符串連接運算,沒有訪問普通變量,也沒有調用方法,Java編譯器同樣會將這種final變量當成“宏變量”處理

// ex:下面定義了4個final“宏變量”final int a = 5; final int b = 3 + 2;final double d = 1.2 / 3;final String str = "我愛" + "China";// 下面的ss變量的值因為調用了方法,所以無法在編譯時被確定下來,ss也就不會被當成“宏變量”處理final String ss = "我愛China" + String.valueOf(1314);

  

五、final方法

1. final修飾的方法不可被重寫,但完全可以被重載

2. 由于子類無法重寫父類的private方法(如果子類中定義一個與父類private方法有相同方法名、相同形參列表、相同返回值類型的方法,也不是方法重寫,只是重新定義了一個新方法),因此即使使用final修飾一個private方法,依然可以在其子類中定義與該方法具有相同方法名、相同形參列表、相同返回值類型的方法

public class PrivateFinalMethodTest {private final void test() {} }class sub extends PrivateFinalMethodTest {// 下面的方法定義不會出現問題public void test() {} }

注:雖然子類和父類都包含了同名的void test()方法,但子類并不是重寫父類的方法,因此即使父類的void test()方法使用了final修飾,子類中依然可以定義void test()方法。

?

六、final類

1. final修飾的類不可以有子類,所以若某個類不想被繼承,則可以使用final修飾該類

public final class FinalClass { }// 下面的類定義將出現編譯錯誤 class Sub extends FinalClass { }

?

七、不可變類

1. 不可變類是指創建該類的實例后,該實例的實例變量是不可改變的

2. Java提供的8個包裝類和java.lang.String類都是不可變類

3. 如果要創建自定義的不可變類,可遵守如下規則:

  • 使用private和final修飾符來修飾該類的成員變量
  • 提供帶參數構造器,用于根據傳入參數來初始化類里的成員變量
  • 僅為該類的成員變量提供getter方法,不要為該類的成員變量提供setter方法
  • 如果有必要,重寫Object類的hashCode()和equals()方法
/** 定義一個不可變類Address*/ public class Address {// 不可變類的實例的實例變量不可改變private final String detail;private final String postCode;public Address(){detail = "";postCode = "";}public Address(String detail, String postCode){this.detail = detail;this.postCode = postCode;}public String getDetail(){return this.detail;}public String getPostCode(){return this.postCode;}// 重寫equals()方法,判斷兩個對象是否相等public boolean equals(Object obj){// ...}public int hashCode(){return detail.hashCode() + postCode.hashCode() * 31;} }

補:對于上面的Address類,當程序創建了Address實例后,將無法修改該Address實例的detail和postCode實例變量。

4. 不可變類的實例在整個生命周期中永遠處于初始化狀態,它的實例變量不可改變,因此對不可變類的實例的控制將更加簡單

  • 不可變類的實例狀態不可改變,可以很方便地被多個對象所共享

?

轉載于:https://www.cnblogs.com/xzxl/p/10998741.html

總結

以上是生活随笔為你收集整理的12. final修饰符的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。