所谓Java内部类
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é)
- 上一篇: request 获取各种路径
- 下一篇: 0040 Java学习笔记-多线程-线程