【本節目标】
通過閱讀本節内容,你将了解到内部類的其他定義方式,并掌握内部類的定義方法,學會在複雜的開發過程中以正确的方式定義内部類。
方法中定義内部類
内部類可以在任意的結構中進行定義,這就包括了:類中、方法中、代碼塊中,但是從實際的開發來講在方法中定義内部類的形式較多。
範例:觀察在方法中定義的内部類
class Outer {
private String msg = "www.mldn.cn" ;
public void fun(long time) {
class Inner { //内部類
public void print() {
System.out.println(Outer.this.msg) ;
System.out.println(time) ;
}
}
new Inner().print() ; //方法中直接執行個體化内部類對象
}
}
public class JavaDemo{
public static void main(String args[]) {
new Outer().fun(2390239023L) ;
}
}
執行結果:
www.mldn.cn
2390239023
此時在fun()方法内部提供有Inner内部類的定義,并且可以發現内部類可以直接通路外部類中的私有屬性,也可以直接通路方法中的參數,但是對于方法中的參數直接通路是從JDK1.8開始支援的。而在JDK1.8之前,如果方法中定義的内部類要想通路方法中的參數,則參數前必須追加final。
範例:在JDK1.8以前的程式結構
class Outer {
private String msg = "www.mldn.cn" ;
public void fun(final long time) {
final String info = "我很好" ;
class Inner { //内部類
public void print() {
System.out.println(Outer.this.msg) ;
System.out.println(time) ;
System.out.println(info) ;
}
}
new Inner().print() ; //方法中直接執行個體化内部類對象
}
}
我很好
之是以取消這樣的限制,主要是為了其擴充的函數式程式設計準備的功能。
匿名内部類
匿名内部類是一種簡化的内部類的處理形式,其主要是在抽象類和接口的子類上使用的。
範例:觀察一個基本的程式結構
interface IMessage {
public void send(String str) ;
}
class MessageImpl implements IMessage {
public void send(String str) {
System.out.println(str) ; //www.mldn.cn
}
}
public class JavaDemo{
public static void main(String args[]) {
IMessage msg = new MessageImpl() ;
msg.send("www.mldn.cn") ;
}
}
如果現在IMessage接口中的MessageImpl子類隻使用唯一的一次,那麼是否還有必要将其定義為單獨的類,那麼在這樣的要求下就發現這個時候定義的子類是有些多餘了,是以就可以利用匿名内部類的形式來解決此問題。
範例:使用匿名内部類
interface IMessage {
public void send(String str) ;
}
public class JavaDemo{
public static void main(String args[]) {
IMessage msg = new IMessage() { //匿名内部類
public void send(String str) {
System.out.println(str) ; //www.mldn.cn
}
} ;
msg.send("www.mldn.cn") ;
}
}
有些時候為了更加友善的展現出匿名内部類的使用,往往可以利用靜态方法做一個内部的匿名内部類的實作。
範例:在接口中直接定義匿名内部類
interface IMessage {
public void send(String str) ;
public static IMessage getInstance() {
return new IMessage() {
public void send(String str) {
System.out.println(str) ; //www.mldn.cn
}
} ;
}
}
public class JavaDemo{
public static void main(String args[]) {
IMessage.getInstance.send("www.mldn.cn") ;
}
}
與内部類相比,匿名内部類隻是一個沒有名字的隻能夠使用一次的,并且結構固定的一個子類操作。
想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。
本内容視訊來源于
阿裡雲大學 下一篇:教你利用Lambda将代碼化繁為簡 | 帶你學《Java面向對象程式設計》之八十六 更多Java面向對象程式設計文章檢視此處