Java面向对象编程篇4——内部类
生活随笔
收集整理的這篇文章主要介紹了
Java面向对象编程篇4——内部类
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Java面向?qū)ο缶幊唐?——內(nèi)部類
1、內(nèi)部類的概念
當(dāng)一個(gè)類的定義出現(xiàn)在另外一個(gè)類的類體中時(shí),那么這個(gè)類叫做內(nèi)部類 (Inner),而這個(gè)內(nèi)部類所在的類叫做外部類(Outer)。
類中的內(nèi)容:成員變量、成員方法、構(gòu)造方法、靜態(tài)成員、構(gòu)造塊和靜態(tài)代碼塊、內(nèi)部類
2、內(nèi)部類的意義
當(dāng)一個(gè)類存在的價(jià)值僅僅是為某一個(gè)類單獨(dú)服務(wù)時(shí),那么就可以將這個(gè) 類定義為所服務(wù)類中的內(nèi)部類,這樣可以隱藏該類的實(shí)現(xiàn)細(xì)節(jié)并且可以 方便的訪問外部類的私有成員而不再需要提供公有的get和set方法。
3、內(nèi)部類的分類
3.1、成員內(nèi)部類
直接將一個(gè)類的定義放在另外一個(gè)類的類體中
訪問修飾符 class 外部類的類名 {訪問修飾符 class 內(nèi)部類的類名 {內(nèi)部類的類體;} } public class Outer {//成員變量private int outerNum = 1;//內(nèi)外重復(fù)的變量private int commonNum = 2;//靜態(tài)成員變量private static int staticOuterNum = 3;/*** 成員方法*/public void outerMethod() {System.out.println("我是外部類的outerMethod方法");}/*** 靜態(tài)方法*/public static void staticOuterMethod() {System.out.println("我是外部類的staticOuterMethod靜態(tài)方法");}class Inner{//成員變量private int innerNum = 1;//內(nèi)外重復(fù)的變量private int commonNum = 20;public void innerShow() {//當(dāng)和外部類沖突時(shí),直接引用屬性名,是內(nèi)部類的成員屬性System.out.println("內(nèi)部的commonNum:" + commonNum);//內(nèi)部類訪問外部屬性System.out.println("outerNum:" + outerNum);//當(dāng)和外部類屬性名重疊時(shí),可通過外部類名.this.屬性名System.out.println("外部的commonNum:" + Outer.this.commonNum);System.out.println("staticOuterNum:" + staticOuterNum);//訪問外部類的方法outerMethod();staticOuterMethod();}}public void outershow() {Inner inner = new Inner();inner.innerShow();}public static void main(String[] args) {Outer outer = new Outer();outer.outershow();} }外部類使用
public class Test {public static void main(String[] args) {Outer outer = new Outer();outer.outershow();System.out.println("=======================");Outer.Inner inner = new Outer().new Inner();inner.innerShow();} }- 成員內(nèi)部類可以是任何的訪問修飾符
- 成員內(nèi)部類的內(nèi)部不能有靜態(tài)信息
- 內(nèi)部類也是類,該繼承繼承,該重寫重寫,該重載重載,this和super隨便用(可以解決多繼承問題)
- 外部類如何訪問內(nèi)部類信息,必須new之后訪問
- 內(nèi)部類可以直接使用外部類的任何信息,如果屬性或者方法發(fā)生沖突,調(diào)用外部類.this.屬性或者方法
- 其他類訪問內(nèi)部類需Outer.Inner inner = new Outer().new Inner();
3.2、靜態(tài)內(nèi)部類
使用static關(guān)鍵字修飾的內(nèi)部類,隸屬于類層級
訪問修飾符 class 外部類的類名 {訪問修飾符 static class 內(nèi)部類的類名 {內(nèi)部類的類體;} } public class Outer {//成員變量private int outerNum = 1;//內(nèi)外重復(fù)的變量private int commonNum = 2;//靜態(tài)成員變量private static int staticOuterNum = 3;static {System.out.println("Outer的靜態(tài)塊被執(zhí)行了……");}/*** 成員方法*/public void outerMethod() {System.out.println("我是外部類的outerMethod方法");}/*** 靜態(tài)方法*/public static void staticOuterMethod() {System.out.println("我是外部類的staticOuterMethod靜態(tài)方法");}static class Inner{static {System.out.println("Outer.Inner的靜態(tài)塊執(zhí)行了……");}//成員變量private int innerNum = 1;//內(nèi)外重復(fù)的變量private int commonNum = 20;private static int staticInnerVariable = 30;/*** 成員方法*/public void innerShow() {System.out.println("innerNum:" + innerNum);System.out.println("內(nèi)部的commonNum:" + commonNum);System.out.println("staticOuterNum:"+staticOuterNum);staticOuterMethod();}/*** 靜態(tài)方法*/public static void innerStaticShow() {//被調(diào)用時(shí)會先加載Outer類staticOuterMethod();System.out.println("staticOuterNum"+staticOuterNum);}}public static void callInner() {System.out.println("staticInnerNum"+Inner.staticInnerVariable);Inner.innerStaticShow();}public static void main(String[] args) {callInner();} }外部使用靜態(tài)內(nèi)部類
public class Test {public static void main(String[] args) {Outer.callInner();System.out.println("====================");Outer.Inner.innerStaticShow();System.out.println("====================");Outer.Inner inner = new Outer.Inner();inner.innerShow();} }- 靜態(tài)內(nèi)部類可以包含任意的信息
- 靜態(tài)內(nèi)部類的方法只能訪問外部類的static關(guān)聯(lián)的信息
- 利用 外部類.內(nèi)部類 引用=new 外部類.內(nèi)部類(); 然后利用引用.成員信息(屬性、方法)調(diào)用。
- 訪問內(nèi)部類的靜態(tài)信息,直接外部類.內(nèi)部類.靜態(tài)信息
3.3、局部內(nèi)部類
直接將一個(gè)類的定義放在方法體的內(nèi)部
訪問修飾符 class 外部類的類名 {訪問修飾符 返回值類型 成員方法名(形參列表) {class 內(nèi)部類的類名 {內(nèi)部類的類體;}} } public class Outer {//成員變量private int outerNum = 1;//內(nèi)外重復(fù)的變量private int commonNum = 2;//靜態(tài)成員變量private static int staticOuterNum = 3;static {System.out.println("Outer的靜態(tài)塊被執(zhí)行了……");}/*** 成員方法*/public void outerMethod() {boolean flag=false;System.out.println("我是外部類的outerMethod方法");class Inner{//成員變量private int innerNum = 1;//內(nèi)外重復(fù)的變量private int commonNum = 20;/*** 成員方法*/public void innerShow() {System.out.println("flag:" + flag);System.out.println("innerNum:" + innerNum);System.out.println("內(nèi)部的commonNum:" + commonNum);System.out.println("外部的commonNum:" + Outer.this.commonNum);System.out.println("staticOuterNum:"+staticOuterNum);staticOuterMethod();}}new Inner().innerShow();}/*** 靜態(tài)方法*/public static void staticOuterMethod() {System.out.println("我是外部類的staticOuterMethod靜態(tài)方法");}public static void main(String[] args) {new Outer().outerMethod();} }- 局部內(nèi)部類,類前不能有訪問修飾符
- 局部內(nèi)部類只能在方法內(nèi)使用
- 無法創(chuàng)造靜態(tài)信息
- 可以直接訪問方法內(nèi)的局部變量和參數(shù),但是不能更改
- 可以隨意的訪問外部類的任何信息
- 匿名內(nèi)部類的方法中用到的局部變量都必須定義為final
3.4、匿名內(nèi)部類
就是指沒有名字的內(nèi)部類
接口/父類類型 引用變量名 = new 接口/父類類型() { 方法的重寫 };接口
public interface Animal {void speak(); }使用
public class Outer {public static void main(String[] args) {//接口/父類類型 引用變量名 = new 接口/父類類型() { 方法的重寫 };Animal animal=new Animal() {@Overridepublic void speak() {System.out.println("喵喵喵");}};animal.speak();} }- 匿名內(nèi)部類是沒有訪問修飾符的
- 使用匿名內(nèi)部類時(shí),這個(gè)new之后的類首先是要存在的,其次我們要重寫new后的類的某個(gè)或某些方法
- 匿名內(nèi)部類訪問方法參數(shù)時(shí)也有和局部內(nèi)部類同樣的限制
- 匿名內(nèi)部類沒有構(gòu)造方法
總結(jié)
以上是生活随笔為你收集整理的Java面向对象编程篇4——内部类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Linux系统中构建虚拟网络
- 下一篇: live555推流rtsp_Hi3518