Java之成員內部類詳解

2021-01-11 小碼哥編程學習

前言

在上文中,講到了靜態內部類,本文主要談一下成員內部類、局部內部類和匿名內部類。

成員內部類

和靜態內部類非常相似,都是定義在一個類中的成員位置,與靜態內部類唯一的區別是,成員內部類沒有static修飾。或者也可以這麼理解:我們知道一個類有成員變量、有成員方法,那麼這些成員定義在類中的哪個位置,那麼成員內部類也就定義在哪個位置。

特點

雖然是定義在類的內部,但是內部類和外部類並不是繼承關係。 成員內部類定義在外部類的成員位置上。 會生成兩個.class文件,一個是Outer.class,一個是Inner.class。 生成成員內部類的實例對象的語法:Outer.Inner inner = new Outer().new Inner()。

案例a

成員內部類-案例a

小總結

初次查看成員內部類的創建實例對象的方式總是感覺有那麼點特殊,但是仔細想想,才體會到了Java真的是非常嚴謹而且是很優美的。事實上,既然是叫做成員,那麼這個成員內部類實際上是和成員變量、成員方法是屬於同一級的,是不屬於外部類這個類的,而是屬於外部類的實例對象,但是呢,這個成員內部類又有點特殊,畢竟是一個類,那麼既然是類,就可以創建對象,那麼問題來了:如果想要創建內部類的對象,那麼必然必須是要存在外部類的對象的,所以我們去創建成員內部類的對象的時候,首先應該是new Outer()創建好外部類之後,再去創建內部類的實例對象。

案例b

成員內部類-案例b

小總結

成員內部類可以訪問外部類的靜態和非靜態的方法和成員變量。 生成成員內部類的實例對象的方式:Outer.Inner inner = new Outer().new Inner()。 如果想要在成員內部類中訪問外部類的成員變量,語法是:Outer.this.成員變量。

每日一題:

不同級別的用戶對同一對象擁有不同的訪問權利或者是某個客戶端不能直接操作到某個某個對象,但是又必須和那個對象有所互動,那麼這種情況最好使用()設計模式。

A、Bridge模式

B、Facade模式

C、Adapter模式

D、Proxy模式

溫馨提示:

歡迎各位小夥伴留言寫出您心中的答案哦!

互相交流,互相學習。

相關焦點

  • Java內部類新解,你沒有見過的船新版本
    inner class裡面又有兩個特殊一點的類: local class和 anonymous class。特殊之處主要在於語法使用上,實質功能是差不多的。 官方 是這樣解釋的:Nested classes are divided into two categories: static and non-static.
  • Java反射機制深入詳解
    一.概念反射就是把Java的各種成分映射成相應的Java類。Class類的構造方法是private,由JVM創建。反射是java語言的一個特性,它允程序在運行時(注意不是編譯的時候)來進行自我檢查並且對內部的成員進行操作。例如它允許一個java的類獲取他所有的成員變量和方法並且顯示出來。
  • Java之File類的構造方法
    Java之File類的簡單介紹,File類的靜態成員變量,這次小編要介紹的是File類的構造方法(f1);//重寫了Object類的toString方法,列印的是一個路徑:c:\Users\java\code\a.textFile f2=new File("c:\\Users\\java\\code");System.out.println(f2);
  • Java反射初探 ——「當類也學會照鏡子」
    每個類都有一個與之對應的「類」對象(Class對象),這個「類」對象由jvm生成,並保存了對應類的相關信息。例如,假設我們的java文件涉及三個類:a類,b類和c類,那麼編譯的時候就會對應生成a類的「類」對象,a類的「類」對象,a類的「類」對象,分別用於保存和a,b,c類對應的信息 我們的思維是這樣的: 一個對象必然有一個與之對應的類,因為只有類才能實例化對象啊 那麼,「類對象」的「
  • Java面向對象之final、abstract抽象、和變量生命周期
    只要滿足以下條件就可以考慮把一個類設計成final類:在設計之初就考慮不進入繼承體系的類。出於安全考慮,類的實現細節不允許被拓展和修改。比如:基本數據類型的包裝類就是一個典型的例子。該類不會再被拓展。普通類有的成員(方法、欄位、構造器),抽象類本質上也是一個類,故其都有。抽象類不能創建對象,但抽象類中是可以包含普通方法的。變量生命周期程序中的變量是用來存儲數據的,其又分為常量和變量兩種,關於變量的詳情可以查看我的另一篇文章:Java 變量、表達式和數據類型詳解。
  • 面試頻率最高的簡單問題——Java類的三大基本特徵
    學習過Java的程式設計師都知道,java類有三大特徵——封裝、繼承和多態。下面的文章給大家詳細的介紹一下java的這三大特性。封裝封裝是將描述某類事物的數據與處理這些數據的函數封裝在一起,形成一個有機整體,稱為類。類所具有的的封裝性可使程序模塊具有良好的獨立性與可維護性。
  • Java之Random類的簡單介紹
    各位小夥伴這次小編要介紹的是Random類,它是用來形成隨機數字的,使用Random有三個步驟,與之前講的Scanner類差不多。第一步,導包:import java.util.Random第二步,創建:Random a=new Random();小括號是可以留空的第三步,使用:如果要獲取一個隨機數int數字(範圍是int所有範圍,有正負兩種):int num=a.nextInt();為了方便大家的理解,小編就先粘幾行代碼,是一個比較簡單的猜數字小遊戲,代碼如下:
  • EffectiveJava-3-類和接口
    使類和成員的可訪問性最小化- 封裝(信息隱藏):隱藏實現細節,將它的API與內部實現隔離,降低模塊間的耦合性,易於獨立開發,測試,優化等,提高軟體的可重用性,- 訪問控制的方式:使用訪問修飾符(private,public,protected)- 儘可能的使每個類或者成員不能被外界訪問- 不能為了方便測試,而將類,接口或者成員變成包的導出
  • Java編程中基礎反射詳細解析
    有時會把這一整個流程統稱為類加載或類初始化。類加載指的是將類的class文件讀入內存中,並為之創建一個 java.lang.Class對象,也就是說程序使用任何類的時候,都會為其創建一個class對象。
  • Java面向對象之接口——interface
    Java面向對象之接口——interface什麼是接口一般計算機中的接口分為如: Walkable.java以I開頭表示接口,如:IWalkable.java接口在編譯成功之後,和類一樣,也是.class的字節碼文件。
  • Java8 lambda表達式語法
    但是有一點這裡強調一下(Windows系統):目前我們工作的版本一般是java 6或者java 7,所以很多人安裝java8基本都是學習為主。這樣就在自己的機器上會存在多版本的JDK。而且大家一般是希望在命令行中執行java命令是基於老版本的jdk。但是在安裝完jdk8並且沒有設置path的情況下,你如果在命令行中輸入:java -version,屏幕上會顯示是jdk 8。
  • 通過「訪問修飾符」java想告訴我們什麼?
    在平時編寫代碼的時候我們一定會用到public、private這些「java訪問修飾符「,可是你知道java為什麼要設計這些「訪問修飾符」嗎?今天我們就一起來看看廢話少說,先看定義!01定義java有四個訪問修飾符public:被public修飾的成員可以被所有類訪問到protected:所修飾的成員會被位於同一包中所有類可以訪問到。
  • Java基礎教程:java反射機制教程
    現在出現一個問題,如果這個user類不是我們自己定義的,我們從外部看不到裡面有什麼東西,而且我們又想去知道內部長什麼樣,比如說有幾個欄位、方法、構造方法、共有還是私有的等等,這時候該怎麼辦呢?這時候java語言在設計的時候為我們提供了一個機制,就是反射機制,他能夠很方便的去解決我們的問題。
  • 做java的你,這些英文單詞都掌握了嗎?
    4、Anonymous inner classes 匿名內部類:匿名內部類是沒有類名的局部內部類。5、API 應用程式接口:提供特定功能的一組相關的類和方法的集合。6、Array 數組:存儲一個或者多個相同數據類型的數據結構,使用下標來訪問。在Java中作為對象處理。7、Base class 基類:即被擴展繼承的類。
  • 大神詳解,這麼詳細的Java設計模式不收藏可惜了
    對於我來說,設計模式始於java,不止於java。第三,有了這種規範,可以更好的和他人溝通,言簡意賅。1.單一職責原則,就是一個類只負責做一件事情。這樣就可以做到解耦合的效果,讓代碼看起來比較清爽,也體現了java的封裝性。還有個原則叫迪米特法則,就是一個對象對另一個對象有儘量少的了解,說的也是解耦合的事情。 2.裡氏替換原則和依賴導致原則,說的是繼承的事情。父類可以做的事情,子類都可以去做,子類可以儘量去依賴父類去做事情;但是反過來,父類不能依賴子類去做一些事情。體現了java的繼承特性。
  • 跟我學java編程—Java類的類型轉換和動態綁定
    例如下面的代碼:代碼中Product類是父類,EBook是Product類的子類,在main方法中,聲明了Product類變量,該變量指向實例化的子類對象,也就是父類變量指向其子類對象。因此,在繼承關係中,子類的對象可以直接當作父類的對象使用,稱為「向上轉型」。注意的是,子類對象當作父類對象使用時,不能訪問其子類對象新增加的成員變量和方法。
  • Java經典面試題Spring是什麼 Spring框架入門詳解
    那麼spring是否能夠完成我們自定義java對象的注入呢?,下面我們看執行結果它的原理是spring讀到xml中的值調用pojo內部的set方法完成注入的m所以這種方式必須要有set方法。最後給大家看一道java面試題,問圖下輸出結果有的人一看,main方法裡是空的,怎麼輸出啊?原來啊,在我們執行main方法之前,Jvm的classLoader需要將這個類加載到內存,首先加載的就是被static修飾的變量,也就是全局變量。
  • Java之static靜態關鍵字詳解
    前言在Java語言中,static表示「靜態」的意思,使用場景可以用來修飾成員變量和成員方法,當然也可以是靜態代碼塊。static的主要作用在於創建獨立於具體對象的域變量或者方法。本文主要來去講解一下static的來龍去脈。static要解決什麼問題?
  • Java基礎,類的繼承,粗略的理解希望對大家有所幫助!
    Java基礎:繼承讀者老爺們大家好,今天圖圖帶大家了解一下java基礎裡的繼承。首先確定一下我們今天的學習的三個目標。第一個是類的繼承;第二個是訪問控制權限;第三個方法重寫(覆蓋)override。好滴,話不多說,讓我們快樂的投身知識的海洋裡吧!
  • 學Java反射,看這篇就夠了 | 原力計劃
    場景一:在日常的第三方應用開發過程中,經常會遇到某個類的某個成員變量、方法或是屬性是私有的或是只對系統應用開放,這時候就可以利用Java的反射機制通過反射來獲取所需的私有成員或是方法。場景二:當我們在使用IDE(如Eclipse,IDEA)時,當我們輸入一個對象或類並想調用它的屬性或方法時,一按點號,編譯器就會自動列出它的屬性或方法,這裡就會用到反射。