JAVA 類總結

来源:http://www.cnblogs.com/zhiheng/archive/2017/03/25/java_classes.html
-Advertisement-
Play Games

JAVA 類總結 最近看了遍java內部類相關的一些內容,做一些總結。與個人博客 zhiheng.me 同步發佈,標題: JAVA 類總結。 頂級類與嵌套類 定義在某個類(或介面,下同)內部的類,稱為嵌套類(nested class),相應的,其所在的類稱之為該類的外圍類(enclosing cla ...


JAVA 類總結

最近看了遍java內部類相關的一些內容,做一些總結。與個人博客 zhiheng.me 同步發佈,標題: JAVA 類總結

頂級類與嵌套類

定義在某個類(或介面,下同)內部的類,稱為嵌套類(nested class),相應的,其所在的類稱之為該類的外圍類(enclosing class)或包裹類。

非嵌套類稱為頂級類(top-level class),一個 .java 文件中可以有若幹個頂級類(含抽象類和介面),但只能有一個被 public 修飾的類,且該類必須和 .java 文件同名。

頂級類的訪問修飾符只能是 public 和包訪問許可權(預設許可權,無修飾符)。

嵌套類可看作是外圍類的一個成員,因此其修飾符可以是 public 、protected 、包訪問許可權和 private 。

嵌套類沒有層次限制,可以在嵌套類裡面在定義類,成為嵌套類中的嵌套類。

嵌套類分為兩種,一種是靜態的(用 static 關鍵字修飾)稱為靜態嵌套類(static nested class);一種是非靜態的,稱為內部類(inner class)。

註:在《Think in Java》一書中,作者將內部類定義為“將一個類定義在另一個類的定義內部,則這個類就是內部類”,因此,他將靜態嵌套類視為內部類的一種。而本文使用了 java 官方文檔中的定義。

內部類一般直接定義在外部類(outer class)中,就像該類的一個成員一樣,我們把這樣的內部類稱為成員內部類(member inner class)。即不在構造器、方法、語句塊中定義的內部類為成員內部類。

除成員內部類外還有另外兩種較特殊的內部類:局部內部類(local class)和匿名內部類(anonymous class)。

嵌套類位元組碼文件命名

嵌套類經編譯後會自動生成獨立的位元組碼文件(.class),其命名格式:

外部類名稱+\$+[該種類同名類中該類順序]+[內部類名稱]

以下代碼(文件名:Outer.java)中含有靜態類 Static 、成員內部類 Inner 、局部類 Local 、實現 Anonymous 介面的匿名類以及定義在該源文件中的介面 Anonymous 。

 

package thinkinjava;
 
public class Outer {
 
    public static class Static{}
 
    public class Inner {}
 
    {
        class Local{};
    }
 
    Anonymous anonymous = new Anonymous(){};
}
 
interface Anonymous {}

編譯後形成瞭如下6個 .class 位元組碼文件。頂級類 Outer 和 Anonymous 都被編譯成同名的 class 文件,靜態嵌套類 Static 和成員內部類 Inner 被編譯成了 Outer\$Static.class 和 Outer\$Inner.class ,因為成員類不能同名,所以也就沒有同名類順序。局部類 Local 編譯後的文件名是 Outer\$1Local.class ,因為 Outer 類中只有一個名為 Local 的局部類,因此,其順序是1。匿名類沒有名稱,所以編譯後的文件名是 Outer\$1.class ,1表示該類是 Outer 類中第一個匿名類。

Anonymous.class
Outer$1.class
Outer$1Local.class
Outer$Inner.class
Outer$Static.class
Outer.class

靜態嵌套類

public class OuterClass{
    public static class NestClass{}
}

靜態嵌套類因為是靜態的,因此從本質上來說它和外部類的關係更像是類與包(package)的關係。在其他類中引用使用的時候需要加上外部類限定: OuterClass.NestClass 。

  1. 與靜態方法一樣,靜態嵌套類中不能訪問外部類的非靜態成員和非靜態方法(不管是public還是private的);
  2. 靜態嵌套類的實例化(instantiate)無需事先實例化外部類,因為靜態嵌套類是與外部類直接相關聯的,而非與外部類的實例(instance)相關聯。

內部類

內部類是非靜態的,因此內部類是與外部類的實例相關聯的。在實例化內部類時,必須先行實例化外部類,再通過外部類的實例來創建內部類的實例:

OuterClass outObject = new OuterClass();
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
  1. 內部類中不能有 static 關鍵字修飾的靜態成員(塊、欄位、方法、介面等),除非該成員是靜態常量。所以,內部類中的靜態成員必須是同時使用 final 關鍵字修飾的欄位。
  2. 內部類可以訪問外部類的任何成員(包括構造器),不管是公有的還是私有的,靜態的還是非靜態的。同樣,外部類也可以訪問到內部類的所有成員。

遮蔽(Shadowing)

定義在內部類或成員方法內的欄位或參數,如果和外部作用域內的某個成員變數定義同名,那麼外部的定義將被遮蔽,此時無法在內部作用域內僅通過名字訪問到外部的成員。以下是摘自 Java Tutorial 中的一個例子:

public class ShadowTest {
 
    public int x = 0;
 
    class FirstLevel {
 
        public int x = 1;
 
        void methodInFirstLevel(int x) {
            System.out.println("x = " + x);
            System.out.println("this.x = " + this.x);
            System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);
        }
    }
 
    public static void main(String... args) {
        ShadowTest st = new ShadowTest();
        ShadowTest.FirstLevel fl = st.new FirstLevel();
        fl.methodInFirstLevel(23);
    }
}
// 輸出如下
// x = 23
// this.x = 1
// ShadowTest.this.x = 0

局部內部類

局部類是定義在某個塊(block)中的類。即定義在構造器、方法、迴圈體、分支結構(if 子句)中的類。

  1. 同局部變數,局部類不能用public,private,protected,static修飾,但可以被final或者abstract修飾。
  2. 局部類是內部類,因此可以訪問其外部類的成員。但局部類的作用域在塊內,所以外部類無法訪問到局部內部類。

局部類屬於塊的作用域,因此可以訪問局部變數(包括形參),但是只能訪問用 final 修飾的局部變數。

在 Java SE 8 之後,局部類可以訪問 effectively final 的局部變數和非 final 的形參了,effectively final 的變數沒有 final 修飾但在初始化後從未改變過值。 “A variable or parameter whose value is never changed after it is initialized is effectively final” 。

 

匿名類

匿名類,顧名思義就是沒有名稱的類,沒有名稱也就無法在其他地方引用和實例化,當然也就沒有構造器。匿名類在定義的同時會實例化本身(匿名類只實例化這一次)。

匿名類的定義從形式上看更像是一種表達式,也就是類的定義出現在一個表達式中。從語法形式上看,匿名類的定義像是調用了一個構造器。以下是幾種匿名類的例子:

public class Test {
    InterfaceA a = new InterfaceA() {};//成員匿名類
    public static void main(String[] args){
        InterfaceA a = new InterfaceA() {};//局部匿名類
        //以上兩種是通過實現介面實現匿名類,稱為介面式匿名類,也可以通過繼承類實現
        Test test = new Test(){};//繼承式匿名類
        //還可以是位於參數上
        new Thread(new Runnable() {
            @Override
            public void run() {
            }
        }).start();//屬於局部匿名類一種
    }
    private interface InterfaceA{}
} 

匿名類不能使用任何關鍵字和訪問控制符,匿名類和局部類訪問規則一樣,只不過內部類顯式的定義了一個類,然後通過new的方式創建這個局部類實例,而匿名類直接new一個類實例。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • matplotlib實際上是一套面向對象的繪圖庫,它所繪製的圖表中的每個繪圖元素,例如線條Line2D、文字Text、刻度等在記憶體中都有一個對象與之對應。為了方便快速繪圖matplotlib通過pyplot模塊提供了一套和MATLAB類似的繪圖API,將眾多繪圖對象所構成的複雜結構隱藏在這套API內 ...
  • 轉自:http://blog.csdn.net/wushiwude/article/details/55101631 一、前言 dubbo的使用,其實只需要有註冊中心,消費者,提供者這三個就可以使用了,但是並不能看到有哪些消費者和提供者,為了更好的調試,發現問題,解決問題,因此引入dubbo-adm ...
  • 從一開始就讓我們簡化這次的討論。你有兩類你能夠繼承的函數:虛函數和非虛函數。然而,重新定義一個非虛函數總是錯誤的(Item 36),所以我們可以安全的把這個條款的討論限定在繼承帶預設參數值的虛函數上。 1. 虛函數是動態綁定的,而預設參數是靜態綁定的 在這種情況下,這個條款的驗證就相當直接了:虛函數 ...
  • Restful是一種架構style,目前常說的有restful web service, resultful http。現在熱搜榜的微服務,大多數會採用Restful方式。 JAX-RS 作為一個Restful 風格WebService規範,目前已發展到了2.0版本,目前比較常用的兩個版本是JAX- ...
  • 用戶與訂單時一對多關係,再加上商品信息的話,訂單與商品之間就是多對多關係了 sql DROP DATABASE IF EXISTS testdb; USE testdb; / 用戶表,記錄用戶信息;用戶與訂單為一對多關係:一個用戶可擁有多個訂單 / DROP TABLE IF EXISTS ; CR ...
  • 緣起 因為一個月的短暫停留,我在給朋友搞事情,所以Yii系列的文章耽擱了很長時間,現在又重拾當時的知識,給大伙好好擼下這一系列的博客 提起Yii,雖然是國外的開發者搞的,但是它的作者是華人,這才是讓我們引以為豪的,如果以後有機會薛強回國大力發展PHP事業,我肯定回去他麾下搞事情,為PHP在國內的發展 ...
  • (一)Eclipse中的快捷鍵: ctrl+shift+f自動整理選擇的java代碼 alt+/ 生成無參構造器或者提升信息 alt+shift+s+o 生成帶參構造 ctrl+shift+o快速導入包 alt+shift+s+r tab+enter-->shift+tab+enter 快速生成ge ...
  • http://jingyan.baidu.com/article/e8cdb32b420ce737052badc4.html ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...