国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > Java > 正文

Java中final作用于變量、參數(shù)、方法及類該如何處理

2024-07-13 10:14:25
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

Java中方法用final修飾參數(shù)的作用

在方法參數(shù)前面加final關(guān)鍵字就是為了防止數(shù)據(jù)在方法體重被修改。

主要分為兩種情況:第一,用final修飾基本數(shù)據(jù)類型;第二,用final修飾引用數(shù)據(jù)類型。

第一種情況,修飾基本數(shù)據(jù)類型,這時(shí)參數(shù)的值在方法體內(nèi)是不能被修改的,即不能被重新javascript/13407.html">賦值。否則編譯就不通過(guò)。

第二種情況,修飾引用類型。這時(shí)參數(shù)java/221873.html">變量所引用的對(duì)象是不能被改變的。但是對(duì)于引用數(shù)據(jù)類型,如果修改其屬性的話是完全可以的。

所以,final這個(gè)關(guān)鍵字,想用的話就用基本數(shù)據(jù)類型,還是很有作用的。

final變量:

對(duì)于基本類型使用final:它就是一個(gè)常量,數(shù)值恒定不變

對(duì)于對(duì)象引用使用final:使得引用恒定不變,一旦引用被初始化指向一個(gè)對(duì)象,就無(wú)法再把 它改為指向另一個(gè)對(duì)象。然而,對(duì)象自身卻是可以被修改的,java并沒(méi)有提供使任何對(duì)象恒定不變的途徑。這一限制同樣也使用數(shù)組,它也是對(duì)象。

例子:

class Value{ int i; public Value(int i){  this.i = i; }}public class FinalData { private static Random random = new Random(47); private String id;  public FinalData(String id){  this.id = id; }  private final int valueOne = 9; private static final int VALUE_TWO = 99; public static final int VALUE_THREE = 39; private final int i4 = random.nextInt(20); static final int INT_5 = random.nextInt(20);  private Value v1 = new Value(11); private final Value v2 = new Value(22); private static final Value VAL_3 = new Value(33);  private final int[] a = {1, 2, 3, 4, 5, 6}; public String toString(){  return id + ": " + "i4 = " + i4 + ", INT_5 = " + INT_5; }   public static void main(String[] args) {  FinalData fd1 = new FinalData("fd1");  //! fd1.valueOne++; // 因?yàn)関alueOne是基本類型常量,其數(shù)值恒定不變  fd1.v2.i++; //final修飾的對(duì)象的內(nèi)容可以改變  fd1.v1 = new Value(9);  for(int i = 0; i < fd1.a.length; i++)   fd1.a[i]++;  //! fd1.v2 = new Value(0); // 因?yàn)関2是final修飾的引用類型,其引用不能被修改指向另一個(gè)對(duì)象  //! fd1.VAL_3 = new Value(1); // 表示占據(jù)一段不能改變的內(nèi)存空間  //! fd1.a = new int[3]; // final修飾的數(shù)組  System.out.println(fd1);  System.out.println("Creating new FinalData");  FinalData fd2 = new FinalData("fd2");  System.out.println(fd1);  System.out.println(fd2); }}/*output:fd1: i4 = 15, INT_5 = 18Creating new FinalDatafd1: i4 = 15, INT_5 = 18fd2: i4 = 13, INT_5 = 18*/

分析:

對(duì)于fd1,fd2兩個(gè)對(duì)象,其中i4是唯一的,即每個(gè)對(duì)象都有一個(gè)i4,但I(xiàn)NT_5被聲明為static,即是類共享的,fd1和fd2共享INT_5,在裝載時(shí)已經(jīng)被初始化,而不是每次創(chuàng)建新對(duì)象時(shí)初始化(例如i4);但它同時(shí)被設(shè)置成final,所以它的引用是不可改變的,即不能被修改指向另一個(gè)對(duì)象。

空白final:

被聲明為final但又沒(méi)有給定初值。必須在域的定義或者每個(gè)構(gòu)造器中使用表達(dá)式對(duì)final進(jìn)行賦值,這正是final域在使用前總是初始化的原因。

final參數(shù):

這意味著你無(wú)法在方法中更改參數(shù)引用,使其指向另一個(gè)參數(shù),但可以修改final對(duì)象所指向的內(nèi)容

例子:

class Gizmo{ int i = 0; public void spin(){}}public class FinalArguments { void with(final Gizmo g){  //! g = new Gizmo(); // 無(wú)法修改final修飾的引用,使它指向另一個(gè)對(duì)象  g.i++; // 但可以修改final對(duì)象所指向的內(nèi)容 } void without(Gizmo g){  g = new Gizmo();  g.spin(); } // int g(final int i){//  //! i++; //因?yàn)閰?shù)i是常量值// }  int g(final int i){  return i + 1; }  public static void main(String[] args) {  FinalArguments bf = new FinalArguments();  bf.without(null);  bf.with(null); }}

分析:

參數(shù)被聲明為final,若是基本參數(shù),那它就是一個(gè)常量,不能被修改;若是一個(gè)引用變量,那么它就不能被修改指向另一個(gè)對(duì)象,但可以修改該引用所指對(duì)象的內(nèi)容。

fianl方法:

使用原因:

  • 把方法鎖定,以防任何繼承類修改它的含義,即該方法不會(huì)被繼承的類覆蓋
  • 效率,若一個(gè)方法指明為final,那么就同意編譯器將針對(duì)該方法的所有調(diào)用轉(zhuǎn)為內(nèi)嵌調(diào)用。

類中所有的private方法都隱式地指定為final,由于無(wú)法取用private方法,所以也就無(wú)法覆蓋它。可以對(duì)private方法添加final修飾詞,但這并不會(huì)給該方法帶來(lái)任何額外的意義。

例子:

class WithFinals{ private final void f(){  System.out.println("WithFinals.f()"); } private void g(){  System.out.println("OverridingPrivate.f()"); }}class OverridingPrivate extends WithFinals{ private final void f(){  System.out.println("OverridingPrivate.f()"); } private void g(){  System.out.println("OverridingPrivate.g()"); }}class OverridingPrivate2 extends OverridingPrivate{ /*  * 當(dāng)使用Override注解強(qiáng)制使f()方法覆蓋父類的f()方法時(shí),會(huì)報(bào)錯(cuò)  * 因?yàn)樗恢栏割愂欠裼性摲椒ǎ瑢?duì)于g()方法來(lái)說(shuō),它只是生成了一個(gè)新的方法,  * 并沒(méi)有覆蓋掉父類中的g()方法。  */ //@Override public final void f(){  System.out.println("OverridingPrivate2.f()"); } public void g(){  System.out.println("OverridingPrivate2.g()"); }}public class FinalOverridingIllusion{ public static void main(String[] args) {  OverridingPrivate2 op2 = new OverridingPrivate2();  op2.f();  op2.g();    // 可以向上轉(zhuǎn)型  OverridingPrivate op = op2;  //! op.f(); // 父類中final方法對(duì)子類來(lái)說(shuō)是不可見(jiàn)的  //! op.g();  WithFinals wf = op2;  // wf.f();  // wf.g(); }}/*output:OverridingPrivate2.f()OverridingPrivate2.g()*/

分析:

覆蓋何時(shí)發(fā)生:

  1,子類中出現(xiàn)與父類完全一致的方法

  2. 子類可以通過(guò)向上轉(zhuǎn)型為父類,并調(diào)用父類中的那個(gè)方法

若父類中某個(gè)方法被聲明為final或者private,那么這個(gè)方法對(duì)子類來(lái)說(shuō)是不可見(jiàn)的,就算在子類中創(chuàng)建了與父類一模一樣的方法,這也是一個(gè)新的方法,而不是從父類中覆蓋的方法。

final類:

即該類不能被繼承,不管是你還是別人,也就是這個(gè)類不需要做任何變動(dòng),也不需要任何子類,例如String類。

例子:

class SmallBrain{}final class Dinosaur{ int i = 7; int j = 1; SmallBrain x = new SmallBrain(); void f(){}}// error: The type Further cannot subclass the final class Dinosaur// Dinosaur類不能有子類// class Further extends Dinosaur{}public class Jurassic { public static void main(String[] args) {  Dinosaur n = new Dinosaur();  n.f();  n.i = 40;  n.j++; }}

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JAVA教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安宁市| 富源县| 江门市| 长岭县| 应城市| 临沧市| 赣州市| 新泰市| 八宿县| 太仆寺旗| 辛集市| 托里县| 井冈山市| 云南省| 孟州市| 平舆县| 公安县| 句容市| 北安市| 青河县| 镇江市| 理塘县| 三门县| 渭源县| 息烽县| 葵青区| 阿拉善左旗| 玛曲县| 毕节市| 措勤县| 平乐县| 古浪县| 彰化市| 鄯善县| 洪雅县| 天柱县| 乌鲁木齐县| 于都县| 胶南市| 堆龙德庆县| 浑源县|