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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

当final作用于变量、参数、方法和类时该如何处理

發(fā)布時(shí)間:2025/4/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 当final作用于变量、参数、方法和类时该如何处理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

final變量:

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

?

  對(duì)于對(duì)象引用使用final:使得引用恒定不變,一旦引用被初始化指向一個(gè)對(duì)象,就無法再把 它改為指向另一個(gè)對(duì)象。然而,對(duì)象自身卻是可以被修改的,java并沒有提供使任何對(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 = 18 Creating new FinalData fd1: i4 = 15, INT_5 = 18 fd2: i4 = 13, INT_5 = 18 */

?

分析:

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

?

?

空白final

?

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

?

?

?

?

final參數(shù):

  這意味著你無法在方法中更改參數(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(); // 無法修改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,由于無法取用private方法,所以也就無法覆蓋它。可以對(duì)private方法添加final修飾詞,但這并不會(huì)給該方法帶來任何額外的意義。

    例子:

    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)樗恢栏割愂欠裼性摲椒?#xff0c;對(duì)于g()方法來說,它只是生成了一個(gè)新的方法,* 并沒有覆蓋掉父類中的g()方法。*///@Overridepublic 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ì)子類來說是不可見的//! op.g();WithFinals wf = op2;// wf.f();// wf.g(); } } /*output: OverridingPrivate2.f() OverridingPrivate2.g() */

    分析:

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

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

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

      若父類中某個(gè)方法被聲明為final或者private,那么這個(gè)方法對(duì)子類來說是不可見的,就算在子類中創(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++;} }

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/aristole/p/8016448.html

    總結(jié)

    以上是生活随笔為你收集整理的当final作用于变量、参数、方法和类时该如何处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。