摘要:嵌套類增加了封裝性內(nèi)部類和靜態(tài)嵌套類的不同根源來自于,最大區(qū)別在于訪問外部類成員的權(quán)限。靜態(tài)嵌套類修飾符使得嵌套類對象成為外部類的靜態(tài)成員,與外部類直接關(guān)聯(lián)。
術(shù)語規(guī)范:按照官方文檔,定義在外部類(封裝類)內(nèi)部的類稱之為nested class,根據(jù)是否被static關(guān)鍵字修飾又分為兩類:static nested classes 和 inner classes。
class OuterClass { static class StaticNestedClass {} class InnerClass {} }
使用嵌套類的好處在于:
當(dāng)某個(gè)類為旁類專用時(shí),將其寫成嵌套類能使得代碼結(jié)構(gòu)更緊湊。
嵌套類增加了封裝性
1.靜態(tài)嵌套類內(nèi)部類和靜態(tài)嵌套類的不同根源來自于static,最大區(qū)別在于訪問外部類成員的權(quán)限。
static修飾符使得嵌套類對象成為外部類的靜態(tài)成員,與外部類直接關(guān)聯(lián)。
這樣靜態(tài)嵌套類作為一個(gè)靜態(tài)成員,僅能訪問外部類的靜態(tài)成員,因?yàn)橥獠款愔械姆庆o態(tài)成員與外部類對象相關(guān),靜態(tài)嵌套類就不能訪問他們,這使得靜態(tài)嵌套類的功能變的很弱,可用之處很少。
另外因?yàn)殪o態(tài)嵌套類是依附于外部類而非外部類對象的,所以不同的外部類對象共享一個(gè)靜態(tài)嵌套類,這一點(diǎn)與內(nèi)部類不同,可以用來包裝main方法。
靜態(tài)嵌套類的聲明示例:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();2.內(nèi)部類
沒有static修飾意味著一個(gè)內(nèi)部類是和外部類對象關(guān)聯(lián)的,也可以說一個(gè)內(nèi)部類對象存在于外部類對象中,是外部類對象的一個(gè)成員,因此內(nèi)部類對象可以訪問外部類對象的全部成員,包括私有成員。
因?yàn)閮?nèi)部類依賴于外部類對象而存在,所以不能定義任何靜態(tài)成員。
內(nèi)部類對象可以訪問外部類的所有成員變量,包括私有成員,這是Java閉包的原理;
因?yàn)閮?nèi)部類隱含對外部類的引用,所以外部類就不能被JVM的垃圾回收機(jī)制自動(dòng)垃圾回收。
不同的外部類對象之間沒有公共的內(nèi)部類對象成員。
內(nèi)部類的聲明示例:
OuterClass.InnerClass innerObject = new OuterObject().new InnerClass();3.變量遮蔽Shadowing
嵌套類和封裝類以及局部方法區(qū)的變量作用域有重疊,如果有同名變量將發(fā)生變量遮蔽。
public class ShadowTest { public int x = 0; class FirstLevel { public int x = 1; void methodInFirstLevel(int x) { System.out.println("x = " + x); System.out.println("this.x = " + this.x); System.out.println("ShadowTest.this.x = " + ShadowTest.this.x); } } public static void main(String... args) { ShadowTest st = new ShadowTest(); ShadowTest.FirstLevel fl = st.new FirstLevel(); fl.methodInFirstLevel(23); } }
注意這里對3種不同變量的引用方式,結(jié)果如下
x = 23 //1. 局部變量 this.x = 1 //2.內(nèi)部類變量 ShadowTest.this.x = 0 //3.外部類變量
內(nèi)部類中this指針指向內(nèi)部類自己,ShadowTest.this則指向外部類對象;
不加修飾的變量,將執(zhí)行就近匹配原則;如果名稱相同將發(fā)生變量遮蔽效應(yīng);為了防止隱患,內(nèi)部類引用外部類對象時(shí)應(yīng)使用第三種方法。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64740.html
嵌套類 Java編程語言允許你在另一個(gè)類中定義類,這樣的類稱為嵌套類,如下所示: class OuterClass { ... class NestedClass { ... } } 術(shù)語:嵌套類分為兩類:靜態(tài)和非靜態(tài),聲明為static的嵌套類稱為靜態(tài)嵌套類,非靜態(tài)嵌套類稱為內(nèi)部類。 class OuterClass { ... stati...
摘要:每個(gè)內(nèi)部類都能獨(dú)立地繼承一個(gè)接口,而無論外部類是否已經(jīng)繼承了某個(gè)接口。因此,內(nèi)部類使多重繼承的解決方案變得更加完整。內(nèi)部類中的與其他類一樣是指的本身。但是靜態(tài)內(nèi)部類卻沒有。 問題:內(nèi)部類、靜態(tài)內(nèi)部類區(qū)別、使用場景? 1.靜態(tài)內(nèi)部類可以有靜態(tài)成員(方法,屬性),而非靜態(tài)內(nèi)部類則不能有靜態(tài)成員(方法,屬性)。 2.靜態(tài)內(nèi)部類只能夠訪問外部類的靜態(tài)成員,而非靜態(tài)內(nèi)部類則可以訪問外部類的所有...
摘要:首當(dāng)其沖的便是接口中的每個(gè)聲明必須是即便不指定也是,并且不能設(shè)置為非,詳細(xì)規(guī)則可參考可見性部分介紹。函數(shù)式接口有著不同的場景,并被認(rèn)為是對編程語言的一種強(qiáng)大的擴(kuò)展。抽象類與中的接口有些類似,與中支持默認(rèn)方法的接口更為相像。 原文鏈接:http://www.javacodegeeks.com/2015/09/how-to-design-classes-and-interfaces.htm...
摘要:對于一個(gè)名為的外圍類和一個(gè)的內(nèi)部類,在編譯成功后,會(huì)出現(xiàn)這樣兩個(gè)文件和。 Java知識點(diǎn)總結(jié)(三個(gè)步驟) @(Java知識點(diǎn)總結(jié))[Java, Java面向?qū)ο骫 [toc] 1-定義類 修飾符 訪問修飾符: public protected default private 其他修飾符 abstract:抽象類不能實(shí)例化,專門用于繼承的類final:最終類不能被繼承 類名(駝峰命名...
摘要:要注意的是,成員內(nèi)部類不能含有的變量和方法。匿名內(nèi)部類是唯一一種沒有構(gòu)造器的類。靜態(tài)嵌套類又叫靜態(tài)局部類嵌套內(nèi)部類,就是修飾為的內(nèi)部類。以上是對內(nèi)部類的一些學(xué)習(xí)和總結(jié),紕漏之處希望各位小伙伴友情指點(diǎn),共同進(jìn)步。 內(nèi)部類(inner class)是定義在另一個(gè)類中的類,類名不需要和文件夾相同。但為什么要使用內(nèi)部類呢?其主要原因有以下三點(diǎn): 1.內(nèi)部類方法可以訪問該類定義所在的作用域中的...
閱讀 3877·2021-07-28 18:10
閱讀 2585·2019-08-30 15:44
閱讀 1098·2019-08-30 14:07
閱讀 3468·2019-08-29 17:20
閱讀 1587·2019-08-26 18:35
閱讀 3543·2019-08-26 13:42
閱讀 1827·2019-08-26 11:58
閱讀 1601·2019-08-23 18:33