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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

所谓Java内部类

發(fā)布時(shí)間:2024/4/17 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 所谓Java内部类 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、內(nèi)部類?什么是內(nèi)部類?

內(nèi)部類我們從文字看是非常容易理解的,其實(shí)就是在一個(gè)類的內(nèi)部再定義一個(gè)類。

2、為什么要使用內(nèi)部類?

使用內(nèi)部類最吸引人的原因是:

每個(gè)內(nèi)部類都能獨(dú)立地繼承一個(gè)(接口的)實(shí)現(xiàn),所以無論外圍類是否已經(jīng)繼承了某個(gè)(接口的)實(shí)現(xiàn),對(duì)于內(nèi)部類都沒有影響。

我們程序設(shè)計(jì)中有時(shí)候會(huì)存在一些使用接口很難解決的問題,這個(gè)時(shí)候我們可以利用內(nèi)部類提供的、可以繼承多個(gè)具體的或者抽象的類的能力來解決這些程序設(shè)計(jì)問題??梢赃@樣說,接口只是解決了部分問題,而內(nèi)部類使得多重繼承的解決方案變得更加完整。

3、內(nèi)部類概念?

內(nèi)部類是指在一個(gè)外部類的內(nèi)部再定義一個(gè)類。類名不需要和文件名相同。

內(nèi)部類是一個(gè)編譯時(shí)的概念,一旦編譯成功,就會(huì)成為完全不同的兩類。對(duì)于一個(gè)名為outer的外部類和其內(nèi)部定義的名為inner的內(nèi)部類。編譯完成后出現(xiàn)outer.class和outer$inner.class兩類。所以內(nèi)部類的成員變量/方法名可以和外部類的相同。

內(nèi)部類的訪問修飾符?

內(nèi)部類可以是靜態(tài)static的,也可用public,default,protected和private修飾。

注:外部頂級(jí)類即類名和文件名相同的只能使用public和default

?

4、內(nèi)部類的分類

a. 成員內(nèi)部類

?成員內(nèi)部類也是最普通的內(nèi)部類,它是外圍類的一個(gè)成員,所以他是可以無限制的訪問外圍類的所有 成員屬性和方法,盡管是private的,但是外圍類要訪問內(nèi)部類的成員屬性和方法則需要通過內(nèi)部類實(shí)例來訪問。

在成員內(nèi)部類中要注意兩點(diǎn):

第一:成員內(nèi)部類中不能存在任何static的變量和方法;

第二:成員內(nèi)部類是依附于外圍類的,所以只有先創(chuàng)建了外圍類才能夠創(chuàng)建內(nèi)部類。

舉例:

如何創(chuàng)建內(nèi)部類?

package com.dome;public class InnerClass {//非靜態(tài)內(nèi)部類class Inner{public void sayHello(String name){System.out.println("Hello!"+name);//調(diào)用外部類的成員方法sayName("破曉");}}//靜態(tài)內(nèi)部類static class StaticInner{public void sayHi(String name){System.out.println("Hi!"+name);}}//推薦使用getxxx()來獲取成員內(nèi)部類,尤其是該內(nèi)部類的構(gòu)造函數(shù)無參數(shù)時(shí) 。public Inner getInner(){return new Inner();}//成員方法public void sayName(String name){System.out.println("my name is "+name);} }

接下來,如何實(shí)例化內(nèi)部類?我們新建一個(gè)Test類。

package com.dome;public class Test {public static void main(String[] args) {//實(shí)例化InnerClass類里的非靜態(tài)內(nèi)部類InnerClass.Inner inner=new InnerClass().new Inner();inner.sayHello("君帥");//實(shí)例化InnerClass類里的靜態(tài)內(nèi)部類InnerClass.StaticInner staticInner=new InnerClass.StaticInner();staticInner.sayHi("君小帥");}}

?運(yùn)行結(jié)果:

總結(jié):

非靜態(tài)內(nèi)部類因?yàn)槭橇藢儆趯?duì)象的,所以初始化時(shí)需要先初始化一個(gè)外部類實(shí)例對(duì)象,然后使用此對(duì)象調(diào)用內(nèi)部類的構(gòu)造方法。
靜態(tài)內(nèi)部類屬于類本身,初始化時(shí)直接使用外部類調(diào)用靜態(tài)內(nèi)部類的構(gòu)造方法即可。

注:推薦使用getxxx()來獲取成員內(nèi)部類,尤其是該內(nèi)部類的構(gòu)造函數(shù)無參數(shù)時(shí) 。

b.局部內(nèi)部類

?

局部內(nèi)部類,是指內(nèi)部類定義在方法和作用域內(nèi)的。局部內(nèi)部類也像別的類一樣進(jìn)行編譯,但只是作用域不同而已,只在該方法或條件的作用域
內(nèi)才能使用,退出這些作用域后無法引用的。

引用《Think in java》中的經(jīng)典例子:

定義在方法內(nèi):

public class Parcel4 { public Destination destination(String s) { class PDestination implements Destination { private String label; private PDestination(String whereTo) { label = whereTo; } public String readLabel() { return label; } } return new PDestination(s); } public static void main(String[] args) { Parcel4 p = new Parcel4(); Destination d = p.destination("Tasmania"); } }

?定義在作用域里:

public class Parcel5 { private void internalTracking(boolean b) { if (b) { class TrackingSlip { private String id; TrackingSlip(String s) { id = s; } String getSlip() { return id; } } TrackingSlip ts = new TrackingSlip("slip"); String s = ts.getSlip(); } } public void track() { internalTracking(true); } public static void main(String[] args) { Parcel5 p = new Parcel5(); p.track(); } }

局部內(nèi)部類:
局部內(nèi)部類就是在類內(nèi)的方法中定義的類。
局部類有一個(gè)優(yōu)勢(shì),即對(duì)外部世界完全隱藏。即使是同一個(gè)類中其他的方法也不能訪問它。
局部類可以訪問包含它的外部類,同時(shí)也可以訪問局部變量。
局部類不能用public或private訪問說明符進(jìn)行聲明,他的作用域被限定在這個(gè)方法中。

c. 嵌套內(nèi)部類
嵌套內(nèi)部類,就是修飾為static的內(nèi)部類。聲明為static的內(nèi)部類,不需要內(nèi)部類對(duì)象和外部類對(duì)象之間的聯(lián)系,就是說我們可以直接引用
outer.inner,即不需要?jiǎng)?chuàng)建外部類,也不需要?jiǎng)?chuàng)建內(nèi)部類。

嵌套類和普通的內(nèi)部類還有一個(gè)區(qū)別:普通內(nèi)部類不能有static數(shù)據(jù)和static屬性,也不能包含嵌套類,但嵌套類可以。而嵌套類不能聲明為
private,一般聲明為public,方便調(diào)用。?

d. 匿名內(nèi)部類
匿名內(nèi)部類是沒有訪問修飾符的。
new 匿名內(nèi)部類,這個(gè)類首先是要存在的。
所在方法的形參需要被匿名內(nèi)部類使用,那么這個(gè)形參就必須為final。
匿名內(nèi)部類是沒有構(gòu)造方法的。因?yàn)樗B名字都沒有何來構(gòu)造方法。

舉例:

package com.dome;public abstract class AnonymousInnerClass {//完整的成員方法public void doSport() {System.out.println("運(yùn)動(dòng)ing");}//抽象的方法public abstract void doEat(String food);}

實(shí)例化:

package com.dome;public class Test {public static void main(String[] args) {//匿名內(nèi)部類AnonymousInnerClass amic=new AnonymousInnerClass() { public void doEat(String food) {System.out.println("Eating..."+food);}};amic.doSport();amic.doEat("西紅柿");}}

總結(jié):只要一個(gè)類是抽象的類或是一個(gè)接口,那么其子類中的方法都可以使用匿名內(nèi)部類來實(shí)現(xiàn)

?

轉(zhuǎn)載于:https://www.cnblogs.com/poxiao520/p/6069350.html

總結(jié)

以上是生活随笔為你收集整理的所谓Java内部类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。