Java面向對象(高級)-- final關鍵字的使用

文章目錄

  • 一、 final的意義
  • 二、 final的使用
    • (1) final修飾類
    • (2) final修飾方法
    • (3) final修飾變量
      • 1. 修飾成員變量
        • 1.1 舉例1
        • 1.2 舉例2
      • 2. 修飾局部變量
        • 2.1 舉例1
        • 2.2 舉例2
    • (4)final搭配static
    • (5)總結
  • 三、 筆試題
    • (1)題1
    • (2)題2

一、 final的意義

final:最終的,不可更改的

final可以用來修飾的結構:類、方法、變量(成員變量、局部變量)

二、 final的使用

(1) final修飾類

表示這個類不能被繼承,沒有子類。提高安全性,提高程序的可讀性。

例如:String類、System類、StringBuffer類

final class Eunuch{//太監類}
class Son extends Eunuch{//錯誤}

【舉例】

正常情況下:

class A{}class B extends A{}

若此時類A前面有final修飾,則B無法繼承于A。如下:

image.png

💬什么樣的需要用final去修飾呢?

功能不需要再被擴展了,比如String類、StringBuffer類、StringBuilder類。

image.png

會發現String加了一個final修飾:

public final class String...

這就意味著不能去聲明一個類去繼承于String。

image.png

Stirng類用final修飾,沒有必要再進行功能的擴展。

(2) final修飾方法

表示這個方法不能被子類重寫

例如:Object類中的getClass()

class Father{public final void method(){System.out.println("father");}
}
class Son extends Father{public void method(){//錯誤System.out.println("son");}
}

【舉例】

正常情況下:

class C{public void method(){}
}class D extends C{//此時可以public void method(){}
}

若是method()方法前面有final修飾,就不能重寫了。如下:

image.png

💬什么樣的方法需要用final去修飾呢?

這個方法已經設計的很完備了,也沒有擴展的必要性,就可以用final修飾。

比如Object類中的getClass()

可以看一下,首先Ctrl+N調出搜索框,輸入“Object”:

image.png

然后Ctrl+F12,搜索”getClass“:

image.png

然后可以看到getClass被final修飾,表示這個方法不能被重寫了。這個方法的作用就是獲取當前對象所屬的類,不需要重寫。

image.png

native表示調用的是本地的方法,會調用底層C、C++相關的代碼。

native修飾的getClass()方法若是調用的時候,這個方法的棧幀會進入棧中,此時它入的棧叫做本地方法棧

這個本地方法,就是指native修飾的方法。

為啥getClass()方法沒有方法體?因為它調用的是底層的C、C++,不是用java代碼寫的,所以沒有方法體。它會鏈接到相關dll文件中的C、C++代碼。

在早期,Java發展不成熟的時候,會用到native。

(3) final修飾變量

final修飾某個變量(成員變量或局部變量),一旦賦值,它的值就不能被修改,即常量,常量名建議使用大寫字母。

例如:final double MY_PI = 3.14;

如果某個成員變量用final修飾后,沒有set方法,并且必須初始化(可以顯式賦值、或在初始化塊賦值、實例變量還可以在構造器中賦值)

1. 修飾成員變量

1.1 舉例1
public class FinalTest {public static void main(String[] args) {E e=new E();System.out.println(e.MIN_SCORE);    //可以調用}
}class E{//成員變量final int MIN_SCORE=0;
}

常量MIN_SCORE可以被調用,但是不能更改:

image.png

若此時將常量的顯示賦值刪掉,發現不可以:

image.png

沒有默認值嗎?

對于final修飾的成員變量,這時候默認值就不好使了。即使想用默認值0,也需要寫出來。


若用方法賦值,不可以:

image.png

方法需要用對象去調用,而調用對象的時候,這個值該有就應該得有了。

之前說過給類的實例變量賦值的位置,其中默認初始化、顯示初始化、代碼塊中初始化、構造器中初始化,它們在造對象過程中實現;而通過“對象.屬性”或“對象.方法”進行賦值的時候,對象已經有了。

現在我們給常量賦值,意思就是當創建完對象的時候,這些屬性的值就應該要有了。

后續調用方法(比如setRight()方法),體現為修改這個值。

而在聲明它的時候沒有賦值,而在有了對象之后,方法里面又不能修改這個值。

image.png

當對象創建完,屬性的值就應該確定下來了。

💬有哪些位置可以給成員變量賦值?

  • 顯式賦值
  • 代碼塊中賦值
  • 構造器中賦值
class E{//成員變量//1.默認賦值--NO//final int MIN_SCORE;//2.顯示賦值--YESfinal int MIN_SCORE=0;//3.代碼塊中賦值--YESfinal int MAX_SCORE;{MAX_SCORE=100;  //一旦賦值就不可以再次賦值}//4.構造器中賦值--YESfinal int LEFT;public E(){ //用此構造器造完對象LEFT就賦完值了LEFT=2;}public E(int left){ //不同構造器都需要對常量LEFT賦值,每造一個對象就會擁有一份LEFT,所以每個對象的LEFT可以不同,但是一旦賦值不可更改LEFT=left;}//5.方法賦值--NO/*final int RIGHT;    //沒有在允許的位置賦值public void setRIGHT(int right){RIGHT=right;    //有了對象之后,不能在方法里面修改常量的值}*/}
1.2 舉例2
public final class Test {public static int totalNumber = 5;public final int ID;public Test() {ID = ++totalNumber; // 可在構造器中給final修飾的“變量”賦值}public static void main(String[] args) {Test t = new Test();System.out.println(t.ID);}
}

2. 修飾局部變量

final修飾局部變量:一旦賦值就不能修改

2.1 舉例1
  • 方法內聲明的局部變量:在調用局部變量前,一定需要賦值。而且一旦賦值,就不可更改。

【舉例】

一般情況下:

class F{public void method(){int num=10;num++;System.out.println(num);}
}

若此時給num加上final,就不可以對num更改了:

image.png

如下:

class F{public void method(){final int num=10;   //寫兩行也沒事,只要在調用它之前賦上值就行,一旦賦值不可更改//num++;System.out.println(num);}
}
  • 方法的形參:在調用此方法時,給形參進行賦值。而且一旦賦值,就不可更改。

【舉例】

一般情況下:

class F{public void method(int num){num++;System.out.println(num);}
}

若是給num加上final,num就是一個常量,這個常量還是在調用的時候賦的,那么賦完值之后就不要更改了。

image.png

如下:

class F{public void method(final int num){//num++;    //賦完值之后就不要更改了System.out.println(num);}
}
2.2 舉例2
public class TestFinal {public static void main(String[] args){final int MIN_SCORE ;MIN_SCORE = 0;final int MAX_SCORE = 100;MAX_SCORE = 200; //非法}
}
  • 錯誤演示:
class A {private final String INFO = "atyuyi";  //聲明常量public void print() {//The final field A.INFO cannot be  assigned//INFO = "雨翼輕塵"; }
}

(4)final搭配static

finalstatic搭配:修飾成員變量時(不能是局部變量,static不能修飾局部變量),此成員變量稱為:全局常量。(只有一個且不能改變

這個變量兼具final和static的特點。

比如:Math的PI (直接通過類來調用且不能變)

在實際寫代碼的時候,若是在修飾類、修飾方法的時候忘記使用不礙事,但是修飾變量的時候記得加上,而且變量名要大寫。

(5)總結

1、 final的理解:最終的

2、final可以用來修飾的結構:類、方法、變量(成員變量、局部變量)

3、具體說明:

  • final修飾:表示此類不能被繼承。
    比如:String、StringBuffer、StringBuilder類

  • final修飾方法:表示此方法不能被重寫
    比如:Object類中的getClass()

  • final修飾變量:既可以修飾成員變量,也可以修飾局部變量。
    此時的"變量"其實就變成了"常量",意味著一旦賦值,就不可更改。

    • final修飾成員變量: 有哪些位置可以給成員變量賦值?
      > 顯式賦值
      > 代碼塊中賦值
      > 構造器中賦值

    • final修飾局部變量:一旦賦值就不能修改
      > 方法內聲明的局部變量:在調用局部變量前,一定需要賦值。而且一旦賦值,就不可更改
      > 方法的形參:在調用此方法時,給形參進行賦值。而且一旦賦值,就不可更改

4、 finalstatic搭配:修飾成員變量時,此成員變量稱為:全局常量。
比如:Math的PI

三、 筆試題

(1)題1

排錯

public class Something {public int addOne(final int x) {//return ++x;	//不可以return x + 1;	//可以,x值沒有變}
}

(2)題2

排錯

public class Something {public static void main(String[] args) {Other o = new Other();new Something().addOne(o);}public void addOne(final Other o) {// o = new Other();o.i++;	//讓i++可以,因為i是變量,o不能變}
}
class Other {public int i;
}

局部變量o指向一個Other對象,Other對象里面有一個i,i沒有用final修飾,表示它是一個變量。

將o加了一個final,意味著它的地址不能變了,而o指向的對象的屬性可以變化。

如下:
image.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/162573.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162573.shtml
英文地址,請注明出處:http://en.pswp.cn/news/162573.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java協程操作mysql數據庫

我的項目: nanshaws/nettyWeb: 復習一下netty,并打算做一個web項目出來 (github.com) 最近在項目中分別添加了虛擬線程操作mysql數據庫,和用協程操作mysql數據庫 同理先跟我這個博客操作一下前面的:就單純代碼的時候進行修改&a…

TikTok與精神健康:社交媒體在壓力時代的作用

在當今數字化和社交化的時代,社交媒體已成為人們生活中不可或缺的一部分。其中,TikTok作為一款備受歡迎的短視頻應用,不僅改變了人們的娛樂方式,也對精神健康產生了深遠的影響。 本文將深入探討TikTok在壓力時代對精神健康的作用…

2023年中國油田工程建設市場規模現狀及行業競爭分析[圖]

油田工程建設是在確定油氣田有開發生產的價值的基礎上,進行系統的工程建設,油田工程建設包括井場建設、管道施工、土石方工程、道路建設及綠化等服務。 油田工程建設主要內容 資料來源:共研產業咨詢(共研網) 油田服務…

oapi-codegen 安裝和使用

背景描述 oapi-codegen 是代碼自動生成工具,其大致邏輯是:(1)編寫遵循 openAPI 規范的 yaml 格式 api 接口文檔;(2)使用 oapi-codegen 使用 yaml 文件生成 gin 框架的 server 端代碼。 除此以…

編輯 | 古代漢語知識

文章目錄 文字通假字古今字異體字(了解) 詞匯古漢語中的單音詞與雙音詞(掌握)詞的本義與引申義的特點和主要差異(掌握)詞的古義與今義的特點和主要差異(掌握)與現代漢語用法相同與現…

反向傳播BP算法

神經網絡的反向傳播 反向傳播機制與代碼微分引擎與代碼原理闡述 如需轉載,請注明出處! 如有幫助點贊收藏關注! 反向傳播機制與代碼 這里主要介紹反向傳播是如何運作的,代碼中會加注釋,便于大家理解。 在訓練神經網絡時…

抖音商城小程序源碼系統 附帶完整的搭建教程

大家好啊,今天小編來給大家分享一款抖音商城小程序源碼系統。這可是當下最熱門的的項目之一。。抖音作為國內最大的短視頻平臺之一,擁有龐大的用戶群體和豐富的社交功能。為了滿足用戶在抖音上購物和交易的需求,抖音商城小程序應運而生。 以…

租車系統開發/多功能租車平臺微信小程序源碼/汽車租賃系統源碼/汽車租賃小程序系統

源碼介紹: 多功能租車平臺微信小程序源碼,作為汽車租賃、摩托車租車平臺系統源碼,是小程序系統。基于微信小程序的汽車租賃系統源碼。 開發環境及工具: 大等于jdk1.8,大于mysql5.5,idea(eclip…

拆解:淘寶客新玩法之微信淘禮金創建怎么做

最近看到一種新的淘寶客玩法,迫不及待的想分享給大家。微信公眾號查券大家都不陌生,也有不少人都在做這個。最近看到有人在做微信公眾號創建淘禮金。之所以說這個玩法新是因為目前大多數淘客還在做返利。返利有周期長、提現有門檻等痛點。 微信公眾號創建…

基于Springcloud微服務框架智慧工地系統源碼

建筑行業快速發展,各建筑工程的建設規模在不斷擴大,各崗位工作人員的工作內容所涉及的方面也越來越廣泛。隨著信息技術水平不斷提高,人工記錄的方式已經不能夠滿足大項目的管理要求,就此,創造出一種新型的施工管理技術——智慧工地…

攜程token

網址:https://flights.ctrip.com/ 記錄一下這個要我狗命的token 原本以為解決驗證碼就能繼續查機票信息,奈何太年輕,或者說原本以為這個頭部信息的token不重要,其實還是很重要的。 關于查價格 ,如果說查詢頻繁之后就…

小型內衣褲洗衣機哪個牌子好?性價比小型洗衣機推薦

內衣內褲應該如何清洗才能實現在不傷衣的同時有能夠洗干凈呢?其實除了使用溫水搭配手洗以外,還有一些清洗方式,那就是選擇一臺專門為內衣定制的內衣洗衣機。目前內衣洗衣機由于精致小巧,方便安裝,方便使用,…

關于內存與實際數據之間一些理解

//// 16位無符號強轉有符號 測試用例// 由于第一位表示正負的位是0,強制轉換有符號后,仍然是0,所以無影響 0-32767 (3276715個1,最左邊符號位仍然是0)之間都是無影響的unsigned short* pUS new unsigned s…

分布式冪等

分布式冪等 在分布式系統、網絡通信和數據庫操作中,冪等性是一個非常重要的概念,特別是在面對可能發生網絡故障、消息重復、或者系統崩潰等情況時。 舉個簡單的例子,考慮一個銀行轉賬的操作。如果轉賬操作是冪等的,那么無論你執…

PC分頁操作以及loading效果

page-size 每頁顯示條目個數 current-page 當前頁數 total 數據總數 current-change【currentPage 改變時會觸發】 切換分頁時會先加載,等在接口數據,接口返回,加載會關閉(在獲取接口數據完畢哪里加上this.loadingfalse&#xff0…

低權限(無權限)時如何在mysql客戶端控制臺的大量輸出中快速定位mysql死鎖或慢sql

查看mysql的查看死鎖的方式很多,但很多時候我們普通開發者的權限比較低,無法執行某命令。比如本次就準備使用 SHOW ENGINE INNODB STATUS;命令,但客戶端提示權限不夠。后來本人找到了另一條低權限的命令 show full PROCESSLIST;但是show fu…

比例減壓閥放大器選型

控制閥型如比例插裝閥、比例方向閥、比例壓力閥、比例流量閥、比例疊加閥等,安裝方式有插式及導軌卡槽式,輸入指令可選0-10V、4-20mA、10V、0-5V,輸出電流可選最大3A,適用各大品牌不帶電反饋常規比例閥匹配度,控制比例…

1553. 吃掉 N 個橘子的最少天數(記憶化+貪心優化)

Problem: 1553. 吃掉 N 個橘子的最少天數 文章目錄 題目思路Code 題目 使得 n 變成0的操作有三種方式 : 吃掉一個橘子。如果剩余橘子數 n 能被 2 整除,那么你可以吃掉 n/2 個橘子。如果剩余橘子數 n 能被 3 整除,那么你可以吃掉 2*(n/3) 個…

易點易動設備管理系統提升設備能耗管理和設備狀態監控效率

如今,能源效率和設備狀態監控對于企業來說變得越發重要。傳統的設備管理方式往往存在能耗浪費和難以實時監控設備狀態的問題。為了解決這些問題,易點易動設備管理系統應運而生。本文將介紹易點易動設備管理系統的功能和優勢,以及如何通過它提…