Java面向對象編程中final症結字的應用辦法詳解。本站提示廣大學習愛好者:(Java面向對象編程中final症結字的應用辦法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Java面向對象編程中final症結字的應用辦法詳解正文
在Java中經由過程final症結字來聲明對象具有不變性(immutable),這裡的對象包含變量,辦法,類,與C++中的const症結字後果相似。
immutable指對象在創立以後,狀況沒法被轉變
可以從三個角度斟酌應用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
外部類與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 的一些限制