內部類

来源:http://www.cnblogs.com/asdxyz/archive/2017/04/06/6673582.html
-Advertisement-
Play Games

內部類,就是在類的內部定義的類......內部類訪問特點1,內部類可以直接訪問外部類的成員,包括私有...2,外部類要訪問內部類的成員,必須創建對象...外部類名.內部類名 對象名=外部類對象.內部類對象; class Test { public static void main(String[] ...


內部類,就是在類的內部定義的類......
內部類訪問特點
1,內部類可以直接訪問外部類的成員,包括私有...
2,外部類要訪問內部類的成員,必須創建對象...
外部類名.內部類名 對象名=外部類對象.內部類對象;


class Test {
public static void main(String[] args) {

Outer.Inner oi = new Outer().new Inner(); //創建內部類對象
oi.method();

}
}

class Outer {
private int num = 10;
class Inner {
public void method() {
System.out.println(num);
}
}
}

/*
* A:內部類概述
* B:內部類訪問特點
* a:內部類可以直接訪問外部類的成員,包括私有。
* b:外部類要訪問內部類的成員,必須創建對象。
* 外部類名.內部類名 對象名 = 外部類對象.內部類對象;
* C:案例演示
* 內部類極其訪問特點
*/

上面代碼,編譯後,在源文件所在目錄下生成Test.class Outer.class Outer$Inner.class三個位元組碼文件,這裡面,Inner作為Outer類的內部類,是嵌入在Outer類裡面的...

內部類的主要作用有
1.內部類提供了更好的封裝,就是更好的隱藏細節,更好的隱蔽性,把內部類隱藏在外部類之內,不允許同一個包中的其它類訪問該類

2.內部類成員可以直接訪問外部類的私有數據,因為內部類被當成外部類的成員,同一個類的成員之間可以互相訪問,但是外部類不能訪問內部類的實現細節,例如內部類的成員變數...(簡單地說就是:內部訪問外部,外部不能訪問內部)

3.匿名內部類適用於創建那些僅需要使用一次的類...

class Test {
public static void main(String[] args) {

Outer.Inner oi = new Outer().new Inner(); //創建內部類對象
oi.method();

}
}

class Outer {
private int num = 10;
class Inner {
public void method() {
System.out.println(num);
}
}
}

外部類Outer,內部類Inner,Inner這個類位於Outer類內部,不在Outer類的成員方法內部,如果在成員方法內部,就被稱為局部內部類,定義在類中並且不在成員方法中的內部類,叫做成員內部類,成員內部類是地位與成員變數,方法,構造方法和初始化代碼塊併列的成員,局部內部類和匿名內部類則不是類成員...上面的Inner類和num地位同等,都算是Outer類的成員...

成員內部類分為兩種:靜態內部類和非靜態內部類,內部類作為外部類的成員,可以像成員方法成員變數那樣,使用public protected 預設 private修飾符修飾,而外部類只能用預設和public修飾...也就是常見的public class 和 class

一個類內部的各個成員之間可以相互訪問...就相當於成員方法可以訪問成員變數,成員內部類可以訪問成員方法和成員變數,但是,一個成員方法不能訪問另一個成員方法的局部變數,也就是說,兩個成員方法的局部變數不能相互訪問,因為成員方法可以認為是類的成員,而成員方法的局部變數地位比成員低一等,兩者不同級,所以不能相互訪問,但是,一個成員方法肯定是可以訪問其自身定義的局部變數的,這是毋庸置疑的......

因此,成員內部類中的語句System.out.println(num);輸出的是外部類中的num,值為10,其實還有一個就近原則,但是,此處由於成員內部類並沒有num變數,所以只有輸出外部類的num變數...


在Test類中調用method方法,調用方法首先肯定要創建一個對象,Outer.Inner oi = new Outer().new Inner();是創建成員內部類的對象...

再看下麵的代碼
class Test {
public static void main(String[] args) {

Outer o = new Outer();
o.print();
}
}
class Outer {
private int num = 10;
private class Inner {
public void method() {
System.out.println(num);
}
}
public void print() {
Inner i = new Inner();
i.method();
}
}

該外部類包含成員變數num,成員內部類Inner,成員方法print,Outer o = new Outer();是創建一個Outer類的對象,o.print()是指利用該對象去調用Outer的成員方法print,在成員方法print中,執行的操作是創建Inner的對象,並且訪問其method方法...

再看靜態內部類...


class Test {
public static void main(String[] args) {
Outer.Inner oi = new Outer.Inner();
oi.method();
Outer.Inner2.print();
}
}
class Outer {
static class Inner {
public void method() {
System.out.println("method");
}
}
static class Inner2 {
public static void print() {
System.out.println("print");
}
}
}

這裡的兩個靜態成員內部類,先看Inner內部類,這個類的method方法是非靜態,所以,需要Inner的對象去調用,但是Inner作為Outer類的一個成員,我們把這個成員當成一個整體,這個成員是靜態的,所以,外部類調用這個成員,直接用類名調用,所以Outer.Inner oi = new Outer.Inner();
oi.method();就是調用method方法,但是對於print方法,直接類名調用...

 


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

-Advertisement-
Play Games
更多相關文章
  • 作業: 集群搭建 1、部署nginx反向代理三個web服務,調度演算法使用加權輪詢; 2、所有web服務使用共用存儲nfs,保證所有web都對其有讀寫許可權,保證數據一致性; 一、nginx服務 1. 先安裝yum install epel-release -y 2.安裝後發現沒有epel源,重新安裝一 ...
  • C#中遍歷各類數據集合的方法總結: 1.枚舉類型 2.遍歷ArrayList(Queue、Stack) 這裡以string為例,當然ArrayList中的元素可以是任何數據類型,遍歷時須確認ArrayList中的元素都是同一數據類型。 此外遍歷Queue隊列和Stack堆棧的方式與ArrayList ...
  • 三年前寫過基於ConcurrentQueue的非同步隊列,今天在整理代碼的時候發現當時另外一種實現方式-使用BlockingCollection實現,這種方式目前依然在實際項目中使用。關於BlockingCollection的基本使用請查閱MSDN。源碼實現 下麵直接上代碼:(代碼已經放到了我的git ...
  • 抱歉問題解決前沒留截圖,總之就是使用巨集相關的功能都打不開,會彈窗報錯,英文,大意是【一個或多個組件不存在,請嘗試重裝】。 嘗試過: 修複安裝VS2010 按此文照做:https://visualstudioextensions.vlasovstudio.com/2014/02/13/visual-s ...
  • 在 UWP 開發中,我們在進行數據綁定時,除了可以使用傳統的綁定 Binding,也可以使用全新的 x:Bind,由於後者是在程式編譯時進行初始化操作(不同於 Binding,它是在運行時創建、初始化),所以我們可以稱 x:Bind 為編譯型綁定,正像本文標題一樣。之所以引入 x:Bind,是因為它 ...
  • 本章的內容來源是有朋友咨詢怎麼做微信公眾號信息的收發消息功能,因此本著為社區做貢獻的態度申請了個人公眾號,然後嘗試對接了一下接收公眾號內容信息的流程;要說對接其實呢也算不上,因為個人賬號只有簡單的一些接收,被動回覆等功能信息,不能群發和使用客服介面,所以本章主要分享的是怎麼接受信息和被動發送回覆信息 ...
  • 之前寒假時,試著使用jQuery寫了幾個非同步請求demo, 但是那樣是使用的webform普通頁面,一般應該是用 webservice 居多。 最近寫後臺管理時,想用非同步來實現一些信息的展示和修改, 這是第一次真正的在實際中運用ajax,卡了一個小時才做好簡單的信息展示。 在這之間遇到了兩個問題。寫 ...
  • C# 泛型集合之非泛型集合類與泛型集合類的對應: ArrayList對應List HashTable對應Dictionary Queue對應Queue Stack對應Stack SortedList對應SortedList 第一 : ArrayList(非泛型集合) 與List(泛型集合) Arra ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...