【本節目标】
通過閱讀本節内容,你将了解到内部類與外部類之間資料通路的互通性及其編譯後的形态,并學會建立與使用内部的抽象類或接口。
内部類的相關說明
現在已經清楚地認識到内部類的優勢以及結構,那麼随後需要對内部類進行相關的說明,現在所定義的内部類都屬于普通的内部類形式,普通的類内部往往會提供有屬性和方法,需要注意的是,内部類雖然可以友善的通路外部類中的私有成員或私有方法,同理,外部類也可以輕松通路内部類中的私有成員或私有方法。
範例:外部類通路内部類中的私有成員屬性
class Outer { //外部類
private String msg = "www.mldn.cn" ; //私有成員屬性
public void fun() { //普通方法
Inner in = new Inner() ; //執行個體化内部類對象
in.print() ; //調用内部類方法
System.out.println(in.info) ; //通路内部類的私有屬性
} //今天天氣不好,收衣服啦!
class Inner { //在Outer類的内部定義了Inner類
private String info = "今天天氣不好,收衣服啦!" ;
public void print() {
System.out.println(Outer.this.msg) ; //Outer類中的屬性
} //www.mldn.cn
}
}
public class JavaDemo{
public static void main(String args[]) {
Outer out = new Outer() ; //執行個體化外部類對象
out.fun() ; //調用外部類中的方法
}
}
使用了内部類之後,内部類與外部類之間的私有操作的通路就不再需要通過setter、getter以及其它的間接方式完成了,可以直接進行處理操作。
但是需要注意的是,内部類本身也屬于一個類,雖然在大部分情況下内部類往往是被外部類包裹的,但是外部依然可以産生内部類的執行個體化對象,而此時内部類執行個體化對象的格式如下:
外部類.内部類 内部類對象 = new 外部類().new 内部類() ;
在内部類編譯完成之後會自動形成一個“Outer$Inter.class”類檔案,其中“$”這個符号換到程式之中就變為“.”,是以内部類的全稱:“外部類.内部類”。内部類與外部類之間可以直接進行私有成員的通路,這樣一來内部類如果提供有執行個體化對象了,一定要先保證外部類已經執行個體化了。
class Outer { //外部類
private String msg = "www.mldn.cn" ; //私有成員屬性
class Inner { //在Outer類的内部定義了Inner類
public void print() {
System.out.println(Outer.this.msg) ; //Outer類中的屬性
} //www.mldn.cn
}
}
public class JavaDemo{
public static void main(String args[]) {
Outer.Inner in = new Outer().new Inner() ;
in.print() ;
}
}
如果此時Inner類隻允許Outer類來使用,那麼在這樣的情況下,就可以使用private進行私有定義。
class Outer { //外部類
private String msg = "www.mldn.cn" ; //私有成員屬性
private class Inner { //在Outer類的内部定義了Inner類
public void print() {
System.out.println(Outer.this.msg) ; //Outer類中的屬性
} //www.mldn.cn
}
}
此時的Inner類無法在外部進行使用。
在Java之中類作為最基礎的結構體實際上還有與之類似的抽象類或者是接口,抽象類與接口中都可以定義内部結構。
範例:定義内部接口
interface Channel { //定義接口
public void send(Message msg) ; //發送消息
interface IMessage { //内部接口
public String getContent() ; //擷取消息内容
}
}
class ChannelImpl implements IChannel {
public void send(IMessage msg) {
System.out.println("發送消息:" + msg.getContent()) ;
}
class MessageImpl implements IMessage {
public String getContent() {
return "www.mldn.cn" ;
}
}
}
public class JavaDemo{
public static void main(String args[]) {
IChannel channel = new ChannelImpl() ;
channel.send(((ChannelImpl)channel).new MessageImpl()) ;
}
}
下面繼續觀察一個内部抽象類,内部抽象類可以定義在普通類、抽象類、接口内部都是可以的。
範例:觀察内部抽象類
interface Channel { //定義接口
public void send(String msg) ; //發送消息
abstract class AbstractMessage {
public abstract String getContent() ;
}
}
class ChannelImpl implements IChannel {
public void send() {
AbstractMessage msg = new MessageImpl() ;
System.out.println(msg.getContent()) ; //www.mldn.cn
}
class MessageImpl extends AbstractMessage {
public String getContent() {
return "www.mldn.cn" ;
}
}
}
public class JavaDemo{
public static void main(String args[]) {
IChannel channel = new ChannelImpl() ;
channel.send() ;
}
}
内部類還有一些更為有意思的結構,即:如果現在定義了一個接口,那麼可以在内部利用類實作該接口,在JDK1.8之後在接口中追加了static方法可以不受執行個體化對象的控制,現在就可以利用此特性來完成此功能。
範例:接口内部進行接口實作
interface Channel { //定義接口
public void send(String msg) ; //發送消息
class ChannelImpl implements IChannel {
public void send() {
System.out.println("www.mldn.cn") ; //www.mldn.cn
}
}
public static IChannel getInstance() {
return new ChannelImpl() ;
}
}
public class JavaDemo{
public static void main(String args[]) {
IChannel channel = IChannel.getInstance() ;
channel.send() ;
}
}
内部類一種非常靈活的定義結構,隻要文法滿足了,各種需求都可以幫你實作。
想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。
本内容視訊來源于
阿裡雲大學 下一篇:内部類的“獨立”-static内部類 | 帶你學《Java面向對象程式設計》之八十四 更多Java面向對象程式設計文章檢視此處