第10章 內部類

来源:http://www.cnblogs.com/HITSZ/archive/2017/02/17/6411300.html
-Advertisement-
Play Games

內部類:在類中定義的類,外層的叫外部類、外圍類。 書中說P191,如果想在外部類的非靜態方法之外的任意位置創建某個內部類對象,那麼必須像在main方法(靜態方法)中那樣,具體地指明這個對象的類型:OuterClassName.InnerClassName。(在外部類非靜態方法中可以直接使用Inner ...


  • 內部類:在類中定義的類,外層的叫外部類、外圍類。
  • 書中說P191,如果想在外部類的非靜態方法之外的任意位置創建某個內部類對象,那麼必須像在main方法(靜態方法)中那樣,具體地指明這個對象的類型:OuterClassName.InnerClassName。(在外部類非靜態方法中可以直接使用InnerClassName)
  • 書上(10.2)的例子,說在內部類,可以直接訪問其外圍類的所有成員(方法和欄位),就像內部類自己擁有它們似的,這帶來了很大的便利。(但是在main函數(外圍類的static函數)中,內部類的對象不能訪問外部類的成員)
  • 內部類自動擁有對其外圍類所有成員的訪問權p192。這是如何做到的呢?當某個外圍類的對象創建了一個內部類對象時,此內部類對象必定會秘密地捕獲一個指向那個外圍類對象的引用。然後,
  •  迭代器設計模式p192:外圍類存數據,並且存在產生內部類對象的方法,私有內部類實現Selector介面以作為迭代器訪問數據。
  • 使用"OuterClassName.this"p193):書上說有時候,需要在內部類的中,生成包含它的外部類對象的引用,可以使用此語法
 1 public class DotThis {
 2 
 3 void f() {
 4 
 5 System.out.println("DotThis.f()");
 6 
 7 }
 8 
 9 public class Inner {
10 
11 public DotThis outer() {
12 
13 f();
14 
15 return DotThis.this;
16 
17 // A plain "this" would be Inner's "this"
18 
19 }
20 
21 }
22 
23 public Inner inner() {
24 
25 return new Inner();
26 
27 }
28 
29 public static void main(String[] args) {
30 
31 DotThis dt = new DotThis();
32 
33 DotThis.Inner dti = dt.inner();
34 
35 dti.outer().f();
36 
37 }
38 
39 } /*
40 
41  * Output: DotThis.f()
42 
43  */// :~
View Code
  • 使用“OuterClass對象的引用.new”:創建內部類對象,必須先指明外部類對象的引用,而不是"new OuterClassName.InnerClassName();"。

Eg:

 1 public class DotNew {
 2 
 3   public class Inner {
 4 
 5   public Inner(){
 6 
 7   System.out.println("Inner class constructor.");
 8 
 9   }
10 
11   }
12 
13   public static void main(String[] args) {
14 
15     DotNew dn = new DotNew();
16 
17     DotNew.Inner dni = dn.new Inner();     //dn已經指明外部類,故不需(也不能)dn.new DotNew.Inner();
18 
19     //!DotNew.Inner dni2 = new DotNew.Inner();
20 
21   }
22 
23 } ///:~
View Code
  • 匿名內部類(p197):在函數內部定義類的一種方式,不顯示定義類名,一次性使用。一般有父類、父介面。在定義的地方之外,也能使用匿名內部類的函數。匿名內部類定義結束分好分隔。
  • 靜態函數用作類似於構造函數的功能(p198),靜態函數裡面有一段代碼實現實例初始化功能。
  • 書上(198-199)說:包含匿名內部類的函數,參數如果會在匿名內部類內部被使用個,則必須是final的;(但是實際使用的時候,去掉final也不見報錯)
  • 實例初始化:什麼是”實例初始化“? 匿名內部類由於類名被省略,故沒有構造函數,用”實例初始化“功能來代替構造函數,書上例子Parcel10.java所示,實現”實例初始化“功能的代碼必須要被大括弧圍住。
  • 匿名內部類既可以擴展類,也可以實現介面,但是兩者不可以同時兼備。而且不能實現多個介面。
  •  使用“匿名內部類”的“工廠方法設計模式”改寫interfaces/Games.java

 

 1 package exercise;
 2 import static net.mindview.util.Print.*;
 3 
 4 interface Game {
 5     boolean move();
 6 }
 7 
 8 interface GameFactory {
 9     Game getGame();
10 }
11 
12 class Checkers implements Game{
13     private int moves = 0;
14     private static final int MOVES = 3;
15     public boolean move(){
16         print("Checkers move " + moves);
17         return ++moves != MOVES;
18     }
19     public static GameFactory factory = new GameFactory(){
20         public Game getGame(){
21             return new Checkers();
22         }
23     };
24 }
25 
26 
27 public class Common {
28     
29     public static void serviceConsumer(GameFactory fact){
30         Game g = fact.getGame();
31         while(g.move());
32     }
33     
34     public static void main(String[] args) {
35         serviceConsumer(Checkers.factory);
36     }
37 
38 }
View Code

 


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

-Advertisement-
Play Games
更多相關文章
  • EF Core 1.0 Database First http://www.cnblogs.com/linezero/p/EFCoreDBFirst.html ASP.NET Core 開發 - Entity Framework (EF) Core,ASP.NET Core 操作資料庫。 Entit ...
  • 今後爭取每兩天能更新一次。平日的誘惑太多,雙休只顧玩了,進度有點慢。 接上一講的,類型的安全性,留下了點小尾巴——比較對象的相等性。 C#有四種比較相等的方式:除了“==”運算符外,System.Object定義了3中方法:ReferenceEqual()方法和兩種Equals(); 1.首先是“= ...
  • 前言 之前對於用SelfHost來手動實現Web API的宿主模式,似乎不是太深入,所以本篇文章我們一起來討論關於利用HttpClient來訪問Web API上的資源來進行探討以及註意相關事項,希望此文對你也有收穫。 來自XML或Json Content的簡單參數 當Web API方法中接受如Str ...
  • 註:下載本文提到的完整代碼示例請訪問:How to authorization Angular 2 app with asp.net core web api 在ASP.NET Core中使用Angular2,以及與Angular2的Token base身份認證 Angular2是對Angular1 ...
  • 本文版權歸博客園和作者吳雙本人共同所有,轉載和爬蟲請註明原文地址 www.cnblogs.com/tdws 相信瞭解了MS Identity認證體系的一定知道UserManager的作用,他是整個體系中的調度者,他定義了一套用戶行為來幫助我們管理用戶信息,角色信息,處理密碼等。而其實現則在UserS ...
  • 鏈接:http://china.nba.com/playerindex/ 所需獲取JSON數據頁面鏈接:http://china.nba.com/static/data/league/playerlist.json 數據來源:NBA中國官網 庫: requests 用於解析頁面文本數據 pandas ...
  • 作為一名網路警察,你的任務是監視電子郵件,看其中是否有一些敏感的關鍵詞。不過,有些狡猾的犯罪嫌疑人會改變某些單詞的字母順序,以逃避檢查。請編寫一個程式,發現這種調整過順序的關鍵詞。程式的輸入有兩行,第一行是關鍵詞列表,第二行是待檢查的句子。程式的輸出為在該句子中所找到的經過順序調整的關鍵詞。(單詞全 ...
  • 轉載請標明出處: "http://www.cnblogs.com/why168888/p/6411664.html" 本文出自: "【Edwin博客園】" python進階介紹(進階1) 1. python基礎回顧 1. 安裝Python環境 2. 變數和數據類型:Python內置的基礎類型 3. ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...