成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java中的Final關(guān)鍵字解析

開(kāi)發(fā) 后端
這篇文章主要講解Java中final關(guān)鍵字的使用,對(duì)于final大家從字面意思就能看出來(lái),主要是“最終的不可改變的意思”。可以修飾類、方法和變量。先給出這篇文章的大致脈絡(luò)。

[[336871]]

這篇文章主要講解Java中final關(guān)鍵字的使用,對(duì)于final大家從字面意思就能看出來(lái),主要是“最終的不可改變的意思”。可以修飾類、方法和變量。先給出這篇文章的大致脈絡(luò)。

首先,先給出final關(guān)鍵字的三種使用場(chǎng)景,也就是修飾類,方法和變量

然后,深入分析final關(guān)鍵字主要注意的幾個(gè)問(wèn)題

最后,總結(jié)一下final關(guān)鍵字

OK,開(kāi)始今天的文章

一、final關(guān)鍵字的基本使用

1、認(rèn)識(shí)final關(guān)鍵字

final可以修飾類、方法、變量。那么分別是什么作用呢?

(1)修飾類:表示類不可被繼承

(2)修飾方法:表示方法不可被覆蓋

(3)修飾變量:表示變量一旦被賦值就不可以更改它的值。java中規(guī)定final修飾成員變量必須由程序員顯示指定變量的值。

2、final關(guān)鍵字修飾類

final關(guān)鍵字修飾類表示這個(gè)類是不可被繼承的,如何去驗(yàn)證呢?

3、final關(guān)鍵字修飾方法

final修飾的方法不能被重寫(xiě)。但是可以重載。下面給出了一個(gè)代碼例子。主要注意的是:父類中private的方法,在子類中不能訪問(wèn)該方法,但是子類與父類private方法相同的方法名、形參列表和返回值的方法,不屬于方法重寫(xiě),只是定義了一個(gè)新的方法。

  1. public class FinalClass{ 
  2.      public final void test(){} 
  3.      public final void test(int i){} 

4、final關(guān)鍵字修飾變量

final關(guān)鍵字修飾變量,是比較麻煩的。但是我們只需要對(duì)其進(jìn)行一個(gè)分類介紹就能理解清楚了。

(1)修飾成員變量

  • 如果final修飾的是類變量,只能在靜態(tài)初始化塊中指定初始值或者聲明該類變量時(shí)指定初始值。
  • 如果final修飾的是成員變量,可以在非靜態(tài)初始化塊、聲明該變量或者構(gòu)造器中執(zhí)行初始值。

(2)修飾局部變量

系統(tǒng)不會(huì)為局部變量進(jìn)行初始化,局部變量必須由程序員顯示初始化。因此使用final修飾局部變量時(shí),即可以在定義時(shí)指定默認(rèn)值(后面的代碼不能對(duì)變量再賦值),也可以不指定默認(rèn)值,而在后面的代碼中對(duì)final變量賦初值(僅一次)。

下面使用代碼去驗(yàn)證一下這兩種情況

  1. public class FinalVar { 
  2.     final static int a = 0;//再聲明的時(shí)候就需要賦值 
  3.     public static void main(String[] args) { 
  4.         final int localA;   //局部變量只聲明沒(méi)有初始化,不會(huì)報(bào)錯(cuò),與final無(wú)關(guān)。 
  5.         localA = 0;//在使用之前一定要賦值 
  6.         //localA = 1;  但是不允許第二次賦值 
  7.     } 

(3)修飾基本類型數(shù)據(jù)和引用類型數(shù)據(jù)

  • 如果是基本數(shù)據(jù)類型的變量,則其數(shù)值一旦在初始化之后便不能更改;
  • 如果是引用類型的變量,則在對(duì)其初始化之后便不能再讓其指向另一個(gè)對(duì)象。但是引用的值是可變的。

修飾基本類型的數(shù)據(jù),在上面的代碼中基本上能夠看出,下面主要是描述引用類型的變量

  1. public class FinalReferenceTest{ 
  2.     public static void main(){ 
  3.         final int[] iArr={1,2,3,4}; 
  4.         iArr[2]=-3;//合法  
  5.         iArr=null;//非法,對(duì)iArr不能重新賦值 
  6.  
  7.         final Person p = new Person(25); 
  8.         p.setAge(24);//合法 
  9.         p=null;//非法  
  10.     }    

二、final關(guān)鍵字需要注意的幾個(gè)問(wèn)題

1、final和static的區(qū)別

其實(shí)如果你看過(guò)我上一篇文章,基本上都能夠很容易得區(qū)分開(kāi)來(lái)。static作用于成員變量用來(lái)表示只保存一份副本,而final的作用是用來(lái)保證變量不可變。下面代碼驗(yàn)證一下

  1. public class FinalTest { 
  2.     public static void main(String[] args)  { 
  3.         AA aa1 = new AA(); 
  4.         AA aa2 = new AA(); 
  5.         System.out.println(aa1.i); 
  6.         System.out.println(aa1.j); 
  7.         System.out.println(aa2.i); 
  8.         System.out.println(aa2.j); 
  9.     } 
  10. //j值兩個(gè)都一樣,因?yàn)槭?span id="owocgsc" class="keyword">static修飾的,全局只保留一份 
  11. //i值不一樣,兩個(gè)對(duì)象可能產(chǎn)生兩個(gè)不同的值, 
  12. class AA { 
  13.     public final int i = (int) (Math.random()*100); 
  14.     public static int j = (int) (Math.random()*100); 
  15. //結(jié)果是 65、23、67、23 

2、為什么局部?jī)?nèi)部類和匿名內(nèi)部類只能訪問(wèn)局部final變量?

為了解決這個(gè)問(wèn)題,我們先要去使用代碼去驗(yàn)證一下。

  1. public class Test { 
  2.     public static void main(String[] args)  {      
  3.     }    
  4.     //局部final變量a,b 
  5.     public void test(final int b) { 
  6.         final int a = 10; 
  7.         //匿名內(nèi)部類 
  8.         new Thread(){ 
  9.             public void run() { 
  10.                 System.out.println(a); 
  11.                 System.out.println(b); 
  12.             }; 
  13.         }.start(); 
  14.     } 

上段代碼中,如果把變量a和b前面的任一個(gè)final去掉,這段代碼都編譯不過(guò)。

這段代碼會(huì)被編譯成兩個(gè)class文件:Test.class和Test1.class。默認(rèn)情況下,編譯器會(huì)為匿名內(nèi)部類和局部?jī)?nèi)部類起名為Outter1.class。

原因是為什么呢?這是因?yàn)閠est()方法里面的參數(shù)a和b,在運(yùn)行時(shí),main線程快要結(jié)束,但是thread還沒(méi)有開(kāi)始。因此需要有一種機(jī)制,在使得運(yùn)行thread線程時(shí)候能夠調(diào)用a和b的值,怎辦呢?java采用了一種復(fù)制的機(jī)制,

也就說(shuō)如果局部變量的值在編譯期間就可以確定,則直接在匿名內(nèi)部里面創(chuàng)建一個(gè)拷貝。如果局部變量的值無(wú)法在編譯期間確定,則通過(guò)構(gòu)造器傳參的方式來(lái)對(duì)拷貝進(jìn)行初始化賦值。

三、總結(jié)

final關(guān)鍵字主要用在三個(gè)地方:變量、方法、類。

  1. 對(duì)于一個(gè)final變量,如果是基本數(shù)據(jù)類型的變量,則其數(shù)值一旦在初始化之后便不能更改;如果是引用類型的變量,則在對(duì)其初始化之后便不能再讓其指向另一個(gè)對(duì)象。
  2. 當(dāng)用final修飾一個(gè)類時(shí),表明這個(gè)類不能被繼承。final類中的所有成員方法都會(huì)被隱式地指定為final方法。
  3. 使用final方法的原因有兩個(gè)。第一個(gè)原因是把方法鎖定,以防任何繼承類修改它的含義;第二個(gè)原因是效率。在早期的Java實(shí)現(xiàn)版本中,會(huì)將final方法轉(zhuǎn)為內(nèi)嵌調(diào)用。但是如果方法過(guò)于龐大,可能看不到內(nèi)嵌調(diào)用帶來(lái)的任何性能提升(現(xiàn)在的Java版本已經(jīng)不需要使用final方法進(jìn)行這些優(yōu)化了)。類中所有的private方法都隱式地指定為final。

好了,final關(guān)鍵字就寫(xiě)到這里,喜歡的還請(qǐng)大家給個(gè)關(guān),謝謝支持,如有不對(duì)的地方還請(qǐng)批評(píng)。

本文轉(zhuǎn)載自微信公眾號(hào)「愚公要移山」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系愚公要移山公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: 愚公要移山
相關(guān)推薦

2024-11-20 15:55:57

線程Java開(kāi)發(fā)

2021-01-05 10:26:50

鴻蒙Javafinal

2024-01-15 10:41:31

C++關(guān)鍵字開(kāi)發(fā)

2012-06-02 00:53:39

Javafinally

2023-11-28 21:50:39

finalstaticvolatile

2012-03-13 14:41:41

JavaJVM

2009-12-17 13:57:15

Ruby關(guān)鍵字

2025-04-22 08:16:37

refC#參數(shù)

2009-12-08 18:02:06

PHP final關(guān)鍵

2022-05-06 08:32:40

Pythonwith代碼

2019-08-28 16:38:49

finalJava編程語(yǔ)言

2025-01-09 10:30:40

2023-11-19 22:52:42

2012-03-01 12:50:03

Java

2011-06-14 13:26:27

volatile

2025-02-24 00:04:00

C#參數(shù)機(jī)制

2023-12-25 07:28:24

PythonSelf對(duì)象編程

2009-07-31 16:34:17

dynamicC# 4.0

2017-10-20 11:12:12

數(shù)據(jù)類型關(guān)鍵字對(duì)象

2024-02-23 18:04:37

C++const關(guān)鍵字
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品久久国产精品 | 在线午夜| 午夜寂寞影院在线观看 | 91在线观看| 亚洲国产成人精品女人久久久 | 一级特黄网站 | 精品伊人 | 欧美日韩在线观看一区二区三区 | 久久专区| 亚洲 中文 欧美 日韩 在线观看 | 国产一二区在线 | 国产乱码精品一区二区三区忘忧草 | 国产精品精品视频一区二区三区 | 欧美性生交大片免费 | av大片| 欧美日韩中文字幕在线播放 | 青青久久 | 成人a在线| 欧美精品欧美精品系列 | 日日碰狠狠躁久久躁96avv | 亚洲iv一区二区三区 | 91久久精品一区二区二区 | 免费在线观看一区二区 | 日本中文字幕在线观看 | 亚洲综合一区二区三区 | 国产精品国产三级国产aⅴ入口 | 国产精品爱久久久久久久 | 亚洲视频一区在线 | 国产精品免费观看视频 | 亚洲视频一区 | 麻豆亚洲| 羞羞网站在线观看 | 人妖videosex高潮另类 | 国产精品成人一区二区三区吃奶 | 亚洲视频一 | 伊人伊人伊人 | 成年女人免费v片 | 一区二区免费看 | a精品视频| 欧美freesex黑人又粗又大 | 亚洲 欧美 在线 一区 |