程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java面向對象編程中final症結字的應用辦法詳解

Java面向對象編程中final症結字的應用辦法詳解

編輯:關於JAVA

Java面向對象編程中final症結字的應用辦法詳解。本站提示廣大學習愛好者:(Java面向對象編程中final症結字的應用辦法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Java面向對象編程中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 弗成以有結構函數
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved