国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - Java面向?qū)ο缶幊讨衒inal關(guān)鍵字的使用方法詳解

Java面向?qū)ο缶幊讨衒inal關(guān)鍵字的使用方法詳解

2020-05-17 12:28ManAgainstCode JAVA教程

這篇文章主要介紹了Java面向?qū)ο缶幊讨衒inal關(guān)鍵字的使用方法詳解,包括對(duì)內(nèi)部匿名類(lèi)無(wú)法訪問(wèn)外面的非 final 的變量問(wèn)題的解讀,需要的朋友可以參考下

在Java中通過(guò)final關(guān)鍵字來(lái)聲明對(duì)象具有不變性(immutable),這里的對(duì)象包括變量,方法,類(lèi),與C++中的const關(guān)鍵字效果類(lèi)似。
immutable指對(duì)象在創(chuàng)建之后,狀態(tài)無(wú)法被改變
可以從三個(gè)角度考慮使用final關(guān)鍵字:

  • 代碼本身:不希望final描述的對(duì)象所表現(xiàn)的含義被改變
  • 安全:final對(duì)象具有只讀屬性,是線程安全的
  • 效率:無(wú)法修改final對(duì)象本身,對(duì)其引用的操作更為高效

final 變量
定義final Object a,則a只能被初始化一次,一旦初始化,a的數(shù)據(jù)無(wú)法修改,若a為引用類(lèi)型,則不能重新綁定其他對(duì)象。
未被初始化的final變量被稱為blank final,若為成員變量,則必須被初始化或在構(gòu)造器中賦值。
例子:

class Circle {
 static final double PI = 3.1415926;
 final int radius = 5;
 final int xPos;
 final int yPos;
 public Circle(int x, int y) {
 xPos = x; 
 yPos = y;
 }
}

final 方法
定義final method,則該方法無(wú)法被重載,方法設(shè)計(jì)者不希望由于對(duì)方法的重載導(dǎo)致其他相關(guān)功能出現(xiàn)異常。
例子:

class BaseClass {
 public final void method() {}
}

class DerivedClass extends BaseClass {
 public final void method() {} // 編譯出錯(cuò)
}

需要注意的是,final方法的定義不一定能夠產(chǎn)生inline的效果,因?yàn)榉椒ㄊ欠駃nline取決于JVM的策略,而非final關(guān)鍵字,通過(guò)final的設(shè)計(jì)提高方法效率是不準(zhǔn)確的。

final 類(lèi)
final class X定義的類(lèi)X無(wú)法被繼承。
在Java中,String類(lèi)被設(shè)計(jì)成final,其定義如下

 

復(fù)制代碼 代碼如下:

public class final String extends Object  implements Serializable, Comparable<String>, CharSequence

 

為什么String被設(shè)計(jì)成final?
  • 一個(gè)String類(lèi)的實(shí)例被初始化后,其在堆上的內(nèi)容無(wú)法被改變,String類(lèi)提供的任何修改String對(duì)象的方法都只能夠產(chǎn)生一個(gè)新的String對(duì)象,大大簡(jiǎn)化了對(duì)String的操作,是代碼更易于閱讀和理解;
  • String final是實(shí)現(xiàn)String interning(在內(nèi)存中不同的string值只有一份)的必要條件,因?yàn)橥ǔ4a中存在大量的String對(duì)象,不同的引用會(huì)指向相同的字符串空間,若String不為final,則當(dāng)一個(gè)字符串空間的內(nèi)容改變時(shí),所有的引用都需要知道這一情況,這一機(jī)制的實(shí)現(xiàn)是十分復(fù)雜的,無(wú)疑會(huì)影響效率。String interning能夠節(jié)省內(nèi)存空間,同時(shí)也節(jié)省時(shí)間花銷(xiāo);
  • String只讀,則不必?fù)?dān)心非常重要的內(nèi)容被篡改。

內(nèi)部類(lèi)與final
在一個(gè)方法內(nèi)定義匿名內(nèi)部類(lèi)時(shí),內(nèi)部類(lèi)只能訪問(wèn)方法內(nèi)的final類(lèi)型變量,使得Java編譯器能夠提前捕獲變量的值,并在內(nèi)部類(lèi)保存一份副本,當(dāng)方法銷(xiāo)毀時(shí),內(nèi)部類(lèi)的內(nèi)存空間依然完整。
例子:

public class Wrapper {

  public static void main(String[] args) {
   
    // Object obj = null; //編譯出錯(cuò)
    final Object obj = null;
    new Thread(new Runnable() {
     public void run() {
     obj = "hello";
     }
    }).start();
  }
}

PS:內(nèi)部匿名類(lèi)無(wú)法訪問(wèn)外面的非 final 的變量的問(wèn)題
這個(gè)聽(tīng)起來(lái)有點(diǎn)拗口,其實(shí)我更多的是想說(shuō) Java 內(nèi)部類(lèi)的一些特性。

之所以會(huì)想起這個(gè)題目只要是最近在閱讀 JDK 源碼中關(guān)于 HTTP keepalive 的代碼時(shí),其中一個(gè)源文件 sun.net.www.protocol.http.HttpURLConnection.java 無(wú)意中看到下面這段代碼。

final boolean result[] = {false};
java.security.AccessController.doPrivileged(new java.security.PrivilegedAction() {
  public Object run() {
    try {
      InetAddress a1 = InetAddress.getByName(h1);
      InetAddress a2 = InetAddress.getByName(h2);
      result[0] = a1.equals(a2);
    } catch (UnknownHostException e) {
    } catch (SecurityException e) {
    }
    return null;
  }
});

return result[0];

Java 的匿名內(nèi)部類(lèi)無(wú)法訪問(wèn)對(duì)應(yīng)的函數(shù)的非 final 變量。要想訪問(wèn)外部的 local variable, 這個(gè)variable 又必須要先定義成 fianl, 但是一定義成 final 就不能在匿名內(nèi)部類(lèi)中修改這個(gè)變量的值,所以要想匿名內(nèi)部類(lèi)返回一些有用的值時(shí)不是那么的容易。這段代碼使用了一個(gè)非常巧妙的方法,這里使用數(shù)組的方式繞過(guò)這個(gè)限制,雖然我們無(wú)法修改 result 這個(gè)變量的引用,但是我們可以修改 result 指向的那個(gè)數(shù)組的內(nèi)容。

只是想記錄一下內(nèi)部匿名類(lèi)修改外部變量的一個(gè)小技巧。不過(guò)既然已經(jīng)到了這里,不妨繼續(xù)的看看內(nèi)部類(lèi)都有哪些特性或者限制吧。

在繼續(xù)本文前,我覺(jué)得非常有必要的明確下本文中涉及的一些 Java 術(shù)語(yǔ),這些術(shù)語(yǔ)不太好翻譯成中文,所以我們還是用英文來(lái)描述。

// This is class
public class JavaTerm {

  // field or member variable
  private int field;

  // constructor
  public JavaTerm() {
  }

  // method
  public void method() {

    // local variable
    int localVariable = 0;

    // local class
    class LocalClass {
      public LocalClass() {
      }
    }
    // anonymous class
    new Runnable() {
      public void run() {
      }
    };
  }
}

我們今天更多的將關(guān)注于 local class 和 anonymous class,它們都屬于 inner class。

Java 允許我們?cè)谝粋€(gè) class 里面再定義一個(gè) class, 稱為嵌套類(lèi)(nested class), nested class 又可以分為兩類(lèi),一類(lèi)是 static nested class, 另外一個(gè)是 non-static nested class, 又稱為 inner class。inner class 又可以分為 local class 和 anonymous class。

anonymous class 的一些限制

  • 一個(gè) anonymous class 可以訪問(wèn)包含它的類(lèi)的類(lèi)變量(field/member variable)
  • 一個(gè) anonymous class 不能訪問(wèn)包含它的作用于中的不是 final 的本地變量(local variable)
  • 和 nested class 一樣,anonymous class 中定義的 variable 會(huì)覆蓋包含這個(gè)內(nèi)部類(lèi)的作用域中的同名的 variable
  • 你不能定義靜態(tài)的初始化方法
  • 一個(gè) anonymous class 可以有靜態(tài)的成員變量。這個(gè)成員變量必須是常量(用 final 修飾)。
  • 一個(gè) anonymous class 不可以有構(gòu)造函數(shù)

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 超碰在线91 | 欧美a区| 欧美亚洲国产日韩 | 欧美一级在线观看 | 欧美日韩亚洲一区二区 | 久久精品一区二区三区不卡牛牛 | 欧美午夜影院 | 高清在线一区二区 | 欧美成年网站 | 日韩电影免费在线观看 | 欧美久久久久久 | 巴西性猛交xxxx免费看久久久 | 91av电影网| 亚洲综合在线播放 | 一级黄色影视 | 国产成人高清视频 | 国产麻豆91视频 | 成人国产精品久久久 | 黄色免费在线视频 | 欧美日韩国产一区二区三区 | 国产成人精品一区二区三区网站观看 | 亚洲一区二区在线免费观看 | 国产综合一区二区 | 超碰国产在线 | 久草在线免费资源 | 中文字幕超清在线免费 | 麻豆国产一区二区三区 | 亚洲aⅴ网站 | av不卡在线| 三级黄色小视频 | 91亚洲成人 | 九九热这里都是精品 | 在线国产小视频 | 国产午夜久久 | 懂色av中文字幕一区二区三区 | 日本在线视频观看 | 亚洲 欧美 日韩在线 | 欧美精品日韩精品 | 国产午夜视频在线观看 | 激情综合在线观看 | 久久精品一区二区三区不卡牛牛 |