日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java:内部类之成员内部类,内部类之匿名内部类

發布時間:2025/4/5 java 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:内部类之成员内部类,内部类之匿名内部类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。