JAVA內部類使用

来源:http://www.cnblogs.com/ChangFen/archive/2016/11/16/6069531.html
-Advertisement-
Play Games

一、什麼是內部類? 一個類的定義放在另一個類的內部,這個類就叫做內部類 二、內部類有那些特性? 1、內部類仍然是一個獨立的類,在編譯之後內部類會被編譯成獨立的.class文件,但是前面冠以外部類的類名和$符號 。 2、內部類不能用普通的方式訪問。內部類是外部類的一個成員,因此內部類可以自由地訪問外部 ...


一、什麼是內部類?

  一個類的定義放在另一個類的內部,這個類就叫做內部類

二、內部類有那些特性?

  1、內部類仍然是一個獨立的類,在編譯之後內部類會被編譯成獨立的.class文件,但是前面冠以外部類的類名和$符號 。
  2、內部類不能用普通的方式訪問。內部類是外部類的一個成員,因此內部類可以自由地訪問外部類的成員變數,無論是否是private的 。
  3、內部類聲明成靜態的,就不能隨便的訪問外部類的成員變數了,此時內部類只能訪問外部類的靜態成員變數 。

三、內部類有哪幾種?

  1.成員內部類

    如:     
 1 package com.test01;
 2 
 3 public class A {
 4     // 內部類 B 繼承 TestPojo 和實現 TestInterface 介面
 5     class B extends TestPojo implements TestInterface{
 6         //內部類 B 自己的方法
 7         public void run(){
 8             System.out.println("我正在跑!");
 9         }
10         //重寫的介面方法
11         public void testf() {
12             System.out.println("實現介面!");
13         }
14     } 
15     // 方法裡面調用內部類
16     public  void test(){
17         B b = new B() ;
18         b.testf() ;        // 掉用重寫介面方法
19         b.run() ;         // 調用自己的方法
20         b.testpojo() ;     // 調用繼承父類的方法
21     }
22     // main 方法測試
23     public static void main(String[] args) {
24         A a = new A() ;
25         a.test() ;
26     }
27 }
28 // 定義了一個介面 ,方法為testf() 
29 interface TestInterface{
30     public void testf() ;
31 }
32 // 定義了一個普通類  方法testpojo() 
33 class TestPojo{
34     public void testpojo(){
35         System.out.println("我是簡單的pojo類");
36     }
37 }
38 // 實現 調用內部類裡面的方法
39 class Textone{
40     public static void main(String[] args) {
41         A.B b = new A().new B() ;    //調用類A裡面的內部類B
42         /** 等同於 下麵代碼
43          *         A a = new A() ;
44          *         A.B b = a.new B() ;
45          * */
46         b.testf() ;      // 掉用重寫介面方法
47         b.run() ;        // 調用自己的方法
48         b.testpojo() ;   // 調用繼承父類的方法
49     }
50 }

  2、方法內部類

 1 package com.test01;
 2 
 3 public class PerTest {
 4     public void test(){         // 定義一個方法
 5         class Ne{                // 定義一個方法內部類
 6             public void fle(){    // 定義方法內部類的方法 
 7                 System.out.println("我正在飛翔!");
 8             }
 9         } ;
10         new Ne().fle() ;        //調用內部類的方法
11     }
12     public static void main(String[] args) {
13         new PerTest().test() ;    //測試
14     }
15 }  

  註意: (1)、方法內部類只能在定義該內部類的方法內實例化,不可以在此方法外對其實例化。
      (2)、方法內部類對象不能使用該內部類所在方法的非final局部變數。        

      因為方法的局部變數位於棧上,只存在於該方法的生命期內。當一個方法結束,其棧結構被刪除,
      局部變數成為歷史。但是該方法結束之後,在方法內創建的內部類對象可能仍然存在於堆中!
      例如,如果對它的引用被傳遞到其他某些代碼,並存儲在一個成員變數內。正因為不能保證局部變
      量的存活期和方法內部類對象的一樣長,所以內部類對象不能使用它們。 (該理解來源於百度百科)

   3、匿名內部類

      1)、抽象匿名內部類

        

 1 package com.anonymous;
 2 
 3 public class AbstractClass {
 4     public void test(){                //方法為test
 5         TestA a = new TestA(){        //實現抽象類
 6             @Override
 7             public void run() {        //實現抽象類的方法
 8                 System.out.println("我正在使用抽象匿名內部類");
 9             }
10         } ;
11         a.run() ;                    //調用內部類的方法
12     }
13     public static void main(String[] args) {
14         new AbstractClass().test() ;    //測試
15     }
16 }
17 //定義一個抽象類 TestA  抽象方法為run()
18 abstract class TestA{
19     public abstract void run() ;
20 }

    2)、介面匿名內部類

 1 package com.anonymous;
 2 
 3 public class TestAnonymous {
 4     MyInterface m = new MyInterface(){    //實現介面
 5         public void eat() {                //重寫MyInterface 介面方法
 6             System.out.println("我正在吃飯!");
 7         }
 8     } ;
 9     public void ss(){    //方法ss
10         m.eat() ;        //調用重寫的方法
11     }
12     public static void main(String[] args) {
13         new TestAnonymous().ss() ;    //測試
14     }
15 }
16 //定義一個介面  方法為 eat
17 interface MyInterface{
18     public void eat() ;
19 }

  註意:匿名內部 類 可以定義在方法內也可以定義在類的成員中,不管是那種匿名內部類都不能被外部類直接調用

四、內部類的作用?

  每個內部類都能獨立地繼承自一個(介面的)實現,所以無論外圍類是否已經繼承了某個(介面的)實現,對於內部類都沒有影響。如果沒有
內部類提供的可以繼承多個具體的或抽象的類的能力,一些設計與編程問題就很難解決。從這個角度看,內部類使得多重繼承的解決方案變得完整。
介面解決了部分問題,而內部類有效地實現了“多重繼承”。

 


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

-Advertisement-
Play Games
更多相關文章
  • 用MVC框架好長一段時間,發現每天都是寫業務代碼,不想每天只為了工作而寫代碼,想把工作中認識的MVC框架,遇到的問題,有時候天天在用,但是不知道裡面是什麼東西,什麼原理,為啥這樣寫等一系列問題。進行梳理突破一下自己。 1、MVC:MVC模式中三個核心元素之一:控制器。 經常新建控制器,控制器幹嘛的, ...
  • 之前介紹了Dapper的查詢, 存儲過程, 函數的調用, 接下來要說一下Dapper的增刪改, 其實Dapper的增刪改, 都是同一種模式的. 我就不分開介紹了, 直接在一個例子上展現好了. 都是可以使用參數化的方式, 更加簡便清晰, 不需要去管太多. 有些ORM中, 參數不是這麼寫的, 而是 "@ ...
  • 參照了網上的很多資料,vs2012 項目是wcf服務. .demo地址http://files.cnblogs.com/files/dswyzx/WcfServiceDemoa.rar ...
  • 正常 var url = document.location.href; var url1 = url.split("=")[1]; 截取前兩位 var url = document.location.href; var url1 = url.split("=")[1,2]; ...
  • 1.正常賦值拷貝: 可以發現b和a的id一樣, 當a發生變化時,b會發生相應變化 2.淺拷貝copy: 此時兩者id不同,淺拷貝發生時原始數據子對象即a[2]發生變化,c會發生變化,但原始數據發生變化拷貝對象不會發生變化。即淺拷貝是對原始數據的子對象進行拷貝。 3.深拷貝deepcopy: 同樣兩者 ...
  • 在這小編帶給大家講解一下內部類的基本知識點,在學習Android開發之前我們要對內部類要有所認識,因為在Android的實際開發中內部類的定義我們非常常見,所有小編在這要特意講解,認識一下內部類的語法定義規則 學習目標: 掌握內部類定義 掌握內部類的優缺點 掌握內部類的使用格式 掌握static 聲 ...
  • 今天用一個簡單的案例來實現 RabbitMQ + PHP 這個消息隊列的運行機制。 主要分為兩個部分: 第一:發送者(publisher) 第二:消費者(consumer) (一)生產者 (創建一個rabbit_publisher.php的文件) 創建連接-->創建channel-->創建交換機對象 ...
  • 配置Tomcat的時候出現提示框The selected server is enabled,but is not configured properly.Deployment to it will not be permitted until the problem is corrected. P ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...