Java:内部类之成员内部类,内部类之匿名内部类
一、內部類的概念
? ? ? ? 所謂內部類(Inner Class),顧名思義,就是將一個類定義在另一個類的內部。
內部的類稱之為內部類
? ? ? ? pubic class Outer{
? ? ? ? ? ? ? ? ? ? ? ? class Inner{
? ? ? ? ? ? ? ? ? ? ? ? //省略
????????}
}
內部類的主要特點:
? ? ? ? 內部類可以很好的實現隱蔽,可以使用protected? private修飾符
? ? ? ? 內部類可以直接訪問外部類的所有成員,包括私有成員
? ? ? ? 外部類不能直接訪問內部類的成員,必須首先建立內部類的對象才能訪問
內部類可以很好的實現隱蔽,可以使用protected? private修飾符:
里面的類可以做成private供外面的類使用
成員內部類及應用
????????成員內部類屬于外部類的實例成員,成員內部類可以有public? ? ? ? private? ? ? ? ?default? ? ? ? protected權限修飾符。在成員內部類中訪問外部類的成員方法和屬性,要使用“外部類名.this.成員方法”? ? ? ? ?和? ? ? ? “外部類名.this.成員屬性”的形式
? ? ? ? 創建成員內部類的實例使用“外部類名.內部類名? ? ? 實例? ?=? ? ?外部類實例名.new? ? ? ? 內部類構造方法(參數)”?的形式
(內部類其實也分好幾種,成員內部類其實是其中經常用的一種使用方式)
新建一個工程
?那我們做一個內部類,一個類里面又有一個類
?那我們如何使用呢?比如我現在要調用System.out.println("內部類打印");如何調用
? 創建成員內部類的實例使用“外部類名.內部類名? ? ? 實例? ?=? ? ?外部類實例名.new? ? ? ? 內部類構造方法(參數)”?的形式
先要把外部化實例出來
? ? ? ? Outer? ? ? o? ?=? new? ? ? Outer();
外部類名.內部類名? ? ? 實例? ?=? ? ?外部類實例名.new? ? ? ? 內部類構造方法(參數)
Outer.? ? ? ? ? Inner? ? ? ? ?test? ? =? ? ? ? ?o? ? ? ? ? ? .new? ? ? ? ? Inner();
這樣才能調用test? 里面的InnerPrint();
運行結果
也就是說你調用內部類里面的某個方法,必須先提供一個外部類的對象,先實例化一個外部類的對象,然后通過已經存在的對象調用new,通過已經存在的對象,來創建一個內部類的實例
所以先要有外部類的對象,才能有內部類的對象
最終才能調用內部類對象的函數去做一些事情
成員內部類屬于外部類的實例成員,成員內部類可以有public? ? ? ? private? ? ? ? ?default? ? ? ? protected權限修飾符。在成員內部類中訪問外部類的成員方法和屬性,要使用“外部類名.this.成員方法”? ? ? ? ?和? ? ? ? “外部類名.this.成員屬性”的形式?
我們看一下能不能在void InnerPrint()? ?調用?void printData()
外部類名.this.成員方法
Outer? ? ?.this.? ??printData();
?運行結果
?那我能不能在內部類訪問外部類的變量? ? ? ? ?第12行
我實例化的時候給data加上一個初值? ? ? ?o.data=100;
?運行結果
?那么外部類可不可以訪問內部類里面的東西呢?
外部類不能直接訪問內部類的成員,必須首先建立內部類的對象才能訪問
?不可以上面這樣用,需要先建立內部類的對象才能訪問
????????????????????????????????????????????????????????Inner i = new Inner();
?運行結果
?修改一下
?
?
?
?運行結果
一般來說在內部類去訪問外部類的變量或函數? 多一點
外部類訪問內部類沒什么特別大的意義
?二、匿名內部類及應用
匿名內部類的特點:
? ? ? ?· 匿名內部類是沒有名稱的內部類,沒有辦法引用他們。必須在創建的時,作為new語句的一部分來聲明并創建他們的實例
? ? ? ?· 匿名內部類必須繼承一個類(抽象的,非抽象的都可以)或者實現一個接口,所有父類(或者父接口)是抽象類,則匿名內部類必須實現其所有抽象方法
?語法:實例?
? ? ? ? ? ? ? ? new interface/superclass(){類體}
? ? ? ? 這種形式的new 語句聲明一個新的匿名類,它對一個給定的類進行拓展,或者實現一個給定的接口,并同時創建改匿名類的一個新實例
?’
?
我們前面寫的內部類有個Inner和Outer,Inner就是內部類的名稱,匿名內部類是沒有這個東西的
那匿名內部類是干什么的?沒辦法給他賦個屬性
????????????????????????????????????????????????????????int data;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 沒辦法實現里面的方法體
????????????????????????????????????????????????void InnerPrint(){
?? ??? ??? ?????????????????????????????????????????????????System.out.println("內部類打印");
?? ??? ??? ?????????????????????????????????????????????????????????Outer.this.printData();
?? ??? ??? ?????????????????????????????????????????????????????????System.out.println("外部類data="+Outer.this.data);
?? ??? ?????????????????????????????????????????????????????????????????}?? ??? ?
????????????????????????????????????????????????????????
?
?
新建一個工程,匿名內部類其中的一個用法就是一個抽象類
我們new 一個Demo1它會有錯誤
Cannot instantiate the type Demo1
不能初始化Demo1
?什么時候可以呢?我們即初始化它,又實現里面的方法
這就不是我們說的真正意義上的實例化Demo1,而是創建了一個匿名的內部類,同時給匿名內部類做了一個實例
那我么如何執行里面的?printInfo()
直接.
因為new Demo1() 的返回值就是一個對象嘛
對象的尾巴這面可以直接調用printInfo();
這就是做了一個匿名內部類,同時創建了一個匿名內部類的實例,實例可以調用
?還有一種方法就是用多態的方式了
?? ??? ?new Demo1() 是一個對象 我可以把他的父對象的聲明給他
?? ??? ?Demo1 d = new Demo1()
這樣看下去像是實例化了一個Demo1 ,其實不是的,這個new Demo1 實際上是它的子類,是一個匿名內部類,屬于抽象類的子類
d.printInfo為什么可以呢?這是多態的東西
?運行結果
?同樣的我們定義一個接口也是一樣的
你去new 一個接口的時候也是一樣的,也是做了一個匿名內部類,去實現里面的interprint
同樣的我們可以通過.來調用
運行結果
?
?注意:匿名內部類是new 了一個抽象或者new 了一個接口,
我們在新創建了一個匿名內部類的時候,也創建了一個實例
總結
以上是生活随笔為你收集整理的Java:内部类之成员内部类,内部类之匿名内部类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java:抽象方法和抽象类,抽象类应用模
- 下一篇: java美元兑换,(Java实现) 美元