摘要:今天刷題的時(shí)候遇到了一題關(guān)于內(nèi)部類的訪問的問題,發(fā)現(xiàn)自己忘了許多,現(xiàn)在來復(fù)習(xí)一下。首先,內(nèi)部類的類字節(jié)碼文件名字為。記住一下訪問原則內(nèi)部類相當(dāng)于外部類的一個(gè)成員變量,因此內(nèi)部類可以直接訪問外部類的成員。
今天刷題的時(shí)候遇到了一題關(guān)于內(nèi)部類的訪問的問題,發(fā)現(xiàn)自己忘了許多,現(xiàn)在來復(fù)習(xí)一下。
首先,內(nèi)部類的類字節(jié)碼文件名字為Outer$Inner.class。
記住一下訪問原則:
1.內(nèi)部類相當(dāng)于外部類的一個(gè)成員變量,因此內(nèi)部類可以直接訪問外部類的成員。但是注意內(nèi)部類靜態(tài)方法不能訪問外部類非靜態(tài)成員
2.但是外部類如果要訪問內(nèi)部類中的成員,要么內(nèi)部類是靜態(tài)的,跟著外部類一起被加載;要么創(chuàng)建內(nèi)部類的對(duì)象,通過對(duì)象訪問(想讓外部類進(jìn)內(nèi)部類里面,總得有內(nèi)部類的“實(shí)體”吧,這個(gè)“實(shí)體”要么是跟外部類一起加載的靜態(tài)內(nèi)部類,要么是新建的內(nèi)部類的對(duì)象,無論是哪種,都會(huì)在堆中為內(nèi)部類開辟空間,然后才可以訪問到)
例子:
a.外部類訪問靜態(tài)內(nèi)部類的靜態(tài)成員(一路暢通無阻) Outer.Inner.func(); b.外部類訪問靜態(tài)內(nèi)部類的非靜態(tài)成員(一路暢通到內(nèi)部類門口, 發(fā)現(xiàn)里面還沒東西,怎么辦?創(chuàng)建對(duì)象?。?//一般方式 Outer.Inner in = new Outer.Inner(); in.func(); //匿名方式 new Outer.Inner().func();//new Outer.Inner()創(chuàng)建出對(duì)象,然后調(diào)用對(duì)象的func c.外部類訪問非靜態(tài)內(nèi)部類的非靜態(tài)成員(沒對(duì)象,內(nèi)部類的門都找不到!乖乖一步步創(chuàng)建對(duì)象吧) //一般方式 Outer.Inner in = new Outer().new Inner(); in.func(); //匿名方式 new Outer().new Inner().func();
3.內(nèi)部類如果有靜態(tài)成員,則內(nèi)部類也必須是靜態(tài)的(否則內(nèi)部類成員要隨著外部類加載,發(fā)現(xiàn)內(nèi)部類自己都還沒加載,那這個(gè)成員是哪兒跑出來的呢?)
4.內(nèi)部類訪問局部變量時(shí),局部變量必須加final修飾符。(隨著方法運(yùn)行完畢,局部變量會(huì)被釋放,如果此時(shí)一個(gè)內(nèi)部類還引用該變量則會(huì)報(bào)錯(cuò)。說到底就是變量的生命周期比內(nèi)部類實(shí)例要短。而final保證這個(gè)變量始終指向一個(gè)對(duì)象,內(nèi)部類就可以放心大膽地引用了。其實(shí)犯了和C++一樣的毛?。悍祷亓司植孔兞康囊茫?br>注意:在JDK8版本之中,方法內(nèi)部類中調(diào)用方法中的局部變量,可以不需要修飾為 final,匿名內(nèi)部類也是一樣的,主要是JDK8之后增加了 Effectively final 功能
class Outer{ public static void main(String[] args){ Object obj = new Outer().method(); } Object method(){ int locvar = 1; class Inner{ void displayLocvar(){ System.out.println("locvar = " + locvar); } } Object in = new Inner(); return in;//返回了內(nèi)部類對(duì)象,但是該對(duì)象依然引用著局部變量 }
}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/71003.html
摘要:自從轉(zhuǎn)到前段,差不多有一年時(shí)間沒有動(dòng)了,今天老弟問我關(guān)于的面向?qū)ο?,自己不敢直接回答了,也許自己真的應(yīng)該去做相關(guān)的考究了。要有父類引用指向子類對(duì)象。外部類要訪問內(nèi)部類的成員,必須要建立內(nèi)部類的對(duì)象。 自從轉(zhuǎn)到前段,差不多有一年時(shí)間沒有動(dòng)Java了,今天老弟問我關(guān)于Java的面向?qū)ο?,自己不敢直接回答了,也許自己真的應(yīng)該去做相關(guān)的考究了。然后在告訴他吧,記在這里當(dāng)做一個(gè)筆記吧。 什么...
面向?qū)ο蟮恼Z言有一個(gè)標(biāo)志,即擁有類的概念,抽象實(shí)例對(duì)象的公共屬性與方法,基于類可以創(chuàng)建任意多個(gè)實(shí)例對(duì)象,一般具有封裝、繼承、多態(tài)的特性!但JS中對(duì)象與純面向?qū)ο笳Z言中的對(duì)象是不同的,ECMA標(biāo)準(zhǔn)定義JS中對(duì)象:無序?qū)傩缘募希鋵傩钥梢园局怠?duì)象或者函數(shù)。 我們首選要了解封裝、繼承、多態(tài)又有如何特點(diǎn) 封裝:顧名思義來封裝變量和函數(shù)封裝->特點(diǎn):高度復(fù)用,降低冗余度,更有利于模塊化編程,能夠?yàn)?..
摘要:前言是面對(duì)對(duì)象的語言,因此有必要單獨(dú)紀(jì)錄下對(duì)象的各種定義和理解。面對(duì)對(duì)象基本概述概述是基于面向過程的變成思想,是對(duì)面向過程的一種封裝。面對(duì)對(duì)象開發(fā)就是不斷的創(chuàng)建對(duì)象,使用對(duì)象,指揮對(duì)象做事情。面對(duì)對(duì)象設(shè)計(jì)其實(shí)就是在管理和維護(hù)對(duì)象之間的關(guān)系。 前言 java是面對(duì)對(duì)象的語言,因此有必要單獨(dú)紀(jì)錄下對(duì)象的各種定義和理解。 面對(duì)對(duì)象,主要包括:面向?qū)ο笏枷耄惻c對(duì)象及其使用,對(duì)象的內(nèi)存圖,成...
摘要:內(nèi)部類一概述把類定義在另一個(gè)類的內(nèi)部,該類就被稱為內(nèi)部類。為什么局部?jī)?nèi)部類訪問局部變量必須加修飾呢因?yàn)榫植孔兞渴请S著方法的調(diào)用而調(diào)用,使用完畢就消失,而堆內(nèi)存的數(shù)據(jù)并不會(huì)立即消失。 內(nèi)部類 (一) 概述 把類定義在另一個(gè)類的內(nèi)部,該類就被稱為內(nèi)部類。 舉例:把類Inner定義在類Outer中,類Inner就被稱為內(nèi)部類。 class Outer { class Inner { ...
摘要:可以直接用接口名訪問。其他類也稱為外部類。汽車外部類發(fā)動(dòng)機(jī)內(nèi)部類內(nèi)部類的分類內(nèi)部類分為成員內(nèi)部類與局部?jī)?nèi)部類。我們定義內(nèi)部類時(shí),就是一個(gè)正常定義類的過程,同樣包含各種修飾符繼承與實(shí)現(xiàn)關(guān)系等。并且日常項(xiàng)目的分工也是以包作為邊界。 01final關(guān)鍵字概念 * A: 概述 繼承的出現(xiàn)提高了代碼的復(fù)用性,并方便開發(fā)。但隨之也有問題,有些類在描述完之后,不想被繼承, ...
閱讀 2866·2021-11-16 11:55
閱讀 2608·2021-09-29 09:34
閱讀 3405·2021-09-01 14:21
閱讀 3753·2019-08-29 12:36
閱讀 697·2019-08-26 10:55
閱讀 3959·2019-08-26 10:20
閱讀 1026·2019-08-23 18:19
閱讀 1194·2019-08-23 17:56