一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - JAVA教程 - Java面向對象編程中final關鍵字的使用方法詳解

Java面向對象編程中final關鍵字的使用方法詳解

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

這篇文章主要介紹了Java面向對象編程中final關鍵字的使用方法詳解,包括對內部匿名類無法訪問外面的非 final 的變量問題的解讀,需要的朋友可以參考下

在Java中通過final關鍵字來聲明對象具有不變性(immutable),這里的對象包括變量,方法,類,與C++中的const關鍵字效果類似。
immutable指對象在創建之后,狀態無法被改變
可以從三個角度考慮使用final關鍵字:

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

final 變量
定義final Object a,則a只能被初始化一次,一旦初始化,a的數據無法修改,若a為引用類型,則不能重新綁定其他對象。
未被初始化的final變量被稱為blank final,若為成員變量,則必須被初始化或在構造器中賦值。
例子:

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,則該方法無法被重載,方法設計者不希望由于對方法的重載導致其他相關功能出現異常。
例子:

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

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

需要注意的是,final方法的定義不一定能夠產生inline的效果,因為方法是否inline取決于JVM的策略,而非final關鍵字,通過final的設計提高方法效率是不準確的。

final 類
final class X定義的類X無法被繼承。
在Java中,String類被設計成final,其定義如下

 

復制代碼 代碼如下:

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

 

為什么String被設計成final?
  • 一個String類的實例被初始化后,其在堆上的內容無法被改變,String類提供的任何修改String對象的方法都只能夠產生一個新的String對象,大大簡化了對String的操作,是代碼更易于閱讀和理解;
  • String final是實現String interning(在內存中不同的string值只有一份)的必要條件,因為通常代碼中存在大量的String對象,不同的引用會指向相同的字符串空間,若String不為final,則當一個字符串空間的內容改變時,所有的引用都需要知道這一情況,這一機制的實現是十分復雜的,無疑會影響效率。String interning能夠節省內存空間,同時也節省時間花銷;
  • String只讀,則不必擔心非常重要的內容被篡改。

內部類與final
在一個方法內定義匿名內部類時,內部類只能訪問方法內的final類型變量,使得Java編譯器能夠提前捕獲變量的值,并在內部類保存一份副本,當方法銷毀時,內部類的內存空間依然完整。
例子:

public class Wrapper {

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

PS:內部匿名類無法訪問外面的非 final 的變量的問題
這個聽起來有點拗口,其實我更多的是想說 Java 內部類的一些特性。

之所以會想起這個題目只要是最近在閱讀 JDK 源碼中關于 HTTP keepalive 的代碼時,其中一個源文件 sun.net.www.protocol.http.HttpURLConnection.java 無意中看到下面這段代碼。

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 的匿名內部類無法訪問對應的函數的非 final 變量。要想訪問外部的 local variable, 這個variable 又必須要先定義成 fianl, 但是一定義成 final 就不能在匿名內部類中修改這個變量的值,所以要想匿名內部類返回一些有用的值時不是那么的容易。這段代碼使用了一個非常巧妙的方法,這里使用數組的方式繞過這個限制,雖然我們無法修改 result 這個變量的引用,但是我們可以修改 result 指向的那個數組的內容。

只是想記錄一下內部匿名類修改外部變量的一個小技巧。不過既然已經到了這里,不妨繼續的看看內部類都有哪些特性或者限制吧。

在繼續本文前,我覺得非常有必要的明確下本文中涉及的一些 Java 術語,這些術語不太好翻譯成中文,所以我們還是用英文來描述。

// 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() {
      }
    };
  }
}

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

Java 允許我們在一個 class 里面再定義一個 class, 稱為嵌套類(nested class), nested class 又可以分為兩類,一類是 static nested class, 另外一個是 non-static nested class, 又稱為 inner class。inner class 又可以分為 local class 和 anonymous class。

anonymous class 的一些限制

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 农村妇女野外性生话免费视频 | 王淑兰李思雨李铁柱乡村小说免费 | 美女天天色| 四虎最新永久在线精品免费 | 99ri在线精品视频 | 极品在线 | 亚洲激情成人 | 武侠古典久久亚洲精品 | 久久日韩精品无码一区 | 大伊香蕉在线精品不卡视频 | 奇米影视888四色首页 | 日本男女视频 | 秋霞午夜伦午夜高清福利片 | 日本最大的黄色网站 | 青草青草伊人精品视频 | 国产特黄一级一片免费 | 娇妻被又大又粗又长又硬好爽 | 日韩黄色录像 | 五月香婷婷 | a级毛片毛片免费很很综合 a级黄色视屏 | 国内精品久久久久久久 | 猫扑俩性 | 999精品视频在线观看热6 | 男同gay玩奴男同玩奴 | 美国艳星lisann成人作品 | 成年看片免费高清观看 | 精品国产美女福利在线 | 午夜福利电影网站鲁片大全 | 日韩成本大片35分钟免费播放 | 久久综合香蕉久久久久久久 | 日本中文字幕一区二区有码在线 | 鞋奴的视频VK | 美女扒开屁股 | 成人看片免费无限观看视频 | 无遮挡h肉动漫在线观看电车 | 日日摸日日碰夜夜爽97纠 | 秋霞午夜| 天堂网www在线中文天堂 | 色花堂国产精品首页第一页 | 亚洲国产99999在线精品一区 | 特黄特色大片免费高清视频 |