摘要:嵌套類增加了封裝性內部類和靜態嵌套類的不同根源來自于,最大區別在于訪問外部類成員的權限。靜態嵌套類修飾符使得嵌套類對象成為外部類的靜態成員,與外部類直接關聯。
術語規范:按照官方文檔,定義在外部類(封裝類)內部的類稱之為nested class,根據是否被static關鍵字修飾又分為兩類:static nested classes 和 inner classes。
class OuterClass { static class StaticNestedClass {} class InnerClass {} }
使用嵌套類的好處在于:
當某個類為旁類專用時,將其寫成嵌套類能使得代碼結構更緊湊。
嵌套類增加了封裝性
1.靜態嵌套類內部類和靜態嵌套類的不同根源來自于static,最大區別在于訪問外部類成員的權限。
static修飾符使得嵌套類對象成為外部類的靜態成員,與外部類直接關聯。
這樣靜態嵌套類作為一個靜態成員,僅能訪問外部類的靜態成員,因為外部類中的非靜態成員與外部類對象相關,靜態嵌套類就不能訪問他們,這使得靜態嵌套類的功能變的很弱,可用之處很少。
另外因為靜態嵌套類是依附于外部類而非外部類對象的,所以不同的外部類對象共享一個靜態嵌套類,這一點與內部類不同,可以用來包裝main方法。
靜態嵌套類的聲明示例:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();2.內部類
沒有static修飾意味著一個內部類是和外部類對象關聯的,也可以說一個內部類對象存在于外部類對象中,是外部類對象的一個成員,因此內部類對象可以訪問外部類對象的全部成員,包括私有成員。
因為內部類依賴于外部類對象而存在,所以不能定義任何靜態成員。
內部類對象可以訪問外部類的所有成員變量,包括私有成員,這是Java閉包的原理;
因為內部類隱含對外部類的引用,所以外部類就不能被JVM的垃圾回收機制自動垃圾回收。
不同的外部類對象之間沒有公共的內部類對象成員。
內部類的聲明示例:
OuterClass.InnerClass innerObject = new OuterObject().new InnerClass();3.變量遮蔽Shadowing
嵌套類和封裝類以及局部方法區的變量作用域有重疊,如果有同名變量將發生變量遮蔽。
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種不同變量的引用方式,結果如下
x = 23 //1. 局部變量 this.x = 1 //2.內部類變量 ShadowTest.this.x = 0 //3.外部類變量
內部類中this指針指向內部類自己,ShadowTest.this則指向外部類對象;
不加修飾的變量,將執行就近匹配原則;如果名稱相同將發生變量遮蔽效應;為了防止隱患,內部類引用外部類對象時應使用第三種方法。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64740.html
嵌套類 Java編程語言允許你在另一個類中定義類,這樣的類稱為嵌套類,如下所示: class OuterClass { ... class NestedClass { ... } } 術語:嵌套類分為兩類:靜態和非靜態,聲明為static的嵌套類稱為靜態嵌套類,非靜態嵌套類稱為內部類。 class OuterClass { ... stati...
摘要:首當其沖的便是接口中的每個聲明必須是即便不指定也是,并且不能設置為非,詳細規則可參考可見性部分介紹。函數式接口有著不同的場景,并被認為是對編程語言的一種強大的擴展。抽象類與中的接口有些類似,與中支持默認方法的接口更為相像。 原文鏈接:http://www.javacodegeeks.com/2015/09/how-to-design-classes-and-interfaces.htm...
摘要:對于一個名為的外圍類和一個的內部類,在編譯成功后,會出現這樣兩個文件和。 Java知識點總結(三個步驟) @(Java知識點總結)[Java, Java面向對象] [toc] 1-定義類 修飾符 訪問修飾符: public protected default private 其他修飾符 abstract:抽象類不能實例化,專門用于繼承的類final:最終類不能被繼承 類名(駝峰命名...
摘要:要注意的是,成員內部類不能含有的變量和方法。匿名內部類是唯一一種沒有構造器的類。靜態嵌套類又叫靜態局部類嵌套內部類,就是修飾為的內部類。以上是對內部類的一些學習和總結,紕漏之處希望各位小伙伴友情指點,共同進步。 內部類(inner class)是定義在另一個類中的類,類名不需要和文件夾相同。但為什么要使用內部類呢?其主要原因有以下三點: 1.內部類方法可以訪問該類定義所在的作用域中的...
閱讀 3871·2021-07-28 18:10
閱讀 2581·2019-08-30 15:44
閱讀 1090·2019-08-30 14:07
閱讀 3464·2019-08-29 17:20
閱讀 1580·2019-08-26 18:35
閱讀 3538·2019-08-26 13:42
閱讀 1820·2019-08-26 11:58
閱讀 1592·2019-08-23 18:33