1. static定義內(nèi)部類
1.1 static定義內(nèi)部類
如果說現(xiàn)在內(nèi)部類上使用了static定義,那么這個內(nèi)部類就變成了“外部類”,static定義的都是獨立于類的結(jié)構(gòu),所以該類結(jié)構(gòu)就相當(dāng)于是一個獨立的程序類了。需要注意,static定義的不管是類還是方法只能夠訪問static成員, 所以static定義的內(nèi)部類只能夠訪問外部內(nèi)中的static屬性和方法 ;
public class Outer {
private static final String MSG = "哈哈";
static class Inner{
public void print(){
System.out.println(Outer.MSG);
}
}
}
這個時候的Inner類是一個獨立類 ,如果此時要想實例化Inner類對象,只需要根據(jù)“ 外部類.內(nèi)部類 ”的結(jié)構(gòu)實例化對象即可
格式如下 外部類.內(nèi)部類 內(nèi)部類對象 = new 外部類.內(nèi)部類() ;
這個時候類名稱帶有“.”
我們現(xiàn)在實例化static內(nèi)部類對象
public class Test {
public static void main(String[] args) {
Outer.Inner in = new Outer.Inner();
in.print();
}
}
輸出結(jié)果是“haha”
所以以后如果發(fā)現(xiàn)類名稱上提供有“.”,首先應(yīng)該立刻想到這是一個內(nèi)部類的結(jié)構(gòu),如果可以直接進行實例化,則應(yīng)該立刻認(rèn)識到這是一個static定義的內(nèi)部類,但是static定義內(nèi)部類的形式來講并不常用, static定義內(nèi)部接口的形式最為常用 。
1.2 static定義內(nèi)部接口
上代碼,注意內(nèi)部接口IMessage和IChannel
public interface IMessageWarp {
static interface IMessage{
public String getContent();
}
static interface IChannel{
public boolean connect(); //消息的發(fā)送通道
}
//消息發(fā)送
public static void send(IMessage msg,IChannel channel){
if(channel.connect()){
System.out.println(msg.getContent());
}else{
System.out.println("消息通道無法建立");
}
};
}
public class DefaultMessage implements IMessageWarp.IMessage {
@Override
public String getContent() {
return "哈哈";
}
}
public class NetChannel implements IMessageWarp.IChannel{
@Override
public boolean connect() {
return true;
}
}
public class Test {
public static void main(String[] args) {
IMessageWarp.send(new DefaultMessage() , new NetChannel());
}
}
之所以使用static定義的內(nèi)部接口,主要是因為這些操作時屬于一組相關(guān)的定義,有了外部接口之后可以更加明確的表述出這些接口的主要目的
2.方法中定義內(nèi)部類
內(nèi)部類可以在任意的結(jié)構(gòu)中定義,這就包括了:類中、方法中、代碼塊中。但在方法中定義內(nèi)部類的情況比較多。
public class Outer {
private String msg = "haha";
public void fun (long time){
class Inner { //內(nèi)部類
public void print(){
System.out.println(Outer.this.msg);
System.out.println(time);
}
}
new Inner().print(); //方法中直接實例化內(nèi)部類對象
}
}
public class Test {
public static void main(String[] args) {
new Outer().fun(2390239023L);
}
}
輸出:haha 和 2390239023
此時在fun()方法內(nèi)部提供有Inner內(nèi)部類的定義,并且發(fā)現(xiàn)內(nèi)部類可以直接訪問外部類中的私有屬性也可以直接訪問方法中的參數(shù),但對于方法中的參數(shù)直接訪問時從JDK1.8開始支持的。而在JDK1.8之前**,如果方法中定義的內(nèi)部類要想訪問方法中的參數(shù)則參數(shù)前必須追加final。**
之所以取消這樣的限制是為了擴展函數(shù)式編程準(zhǔn)備的
3.匿名內(nèi)部類
匿名類是一種簡化的內(nèi)部類的處理形式,其主要是在抽象類和接口的子類上使用的。
接口和抽象類是一樣的
public interface IMessage {
public void send(String str);
}
public class MessageImpl implements IMessage {
@Override
public void send(String str) {
System.out.println(str);
}
}
public class Test {
public static void main(String[] args) {
IMessage msg = new MessageImpl();
msg.send("哈哈");
}
}
如果說現(xiàn)在IMessage接口中的MessageImpl子類只使用唯一的一次,那么是否還有必要將其定義為單獨的類?那么在這樣的要求下就發(fā)現(xiàn)這個時候定義的子類是有些多余了,所以就可以利用內(nèi)部類的形式來解決此問題
public interface IMessage {
public void send(String str);
}
public class Test {
public static void main(String[] args) {
IMessage msg = new IMessage() {
@Override
public void send(String str) { //匿名內(nèi)部類
System.out.println(str);
}
};
msg.send("哈哈");
}
}
匿名內(nèi)部類不一定要在抽象類或接口上,但只有在抽象類和接口上才有意義。有些時候為了更加方的體現(xiàn)出匿名內(nèi)部類的使用,往往可以利用靜態(tài)方法做一個內(nèi)部類的匿名內(nèi)部類實現(xiàn)
在接口中直接定義匿名內(nèi)部類
public interface IMessage {
public void send(String str);
}
public interface IMessage {
public void send(String str);
public static IMessage getInstance(){
return new IMessage() {
@Override
public void send(String str) {
System.out.println(str);
}
};
}
}
public class Test {
public static void main(String[] args) {
IMessage.getInstance().send("哈哈");
}
}
與內(nèi)部類相比匿名內(nèi)部類只是一個沒有名字的只能夠使用一次的,并且結(jié)構(gòu)固定的一個子類。
4.總結(jié):
好了,內(nèi)部類的使用就介紹完了,大家可以收藏起來,工作中肯定用得到。
-
接口
+關(guān)注
關(guān)注
33文章
8447瀏覽量
150723 -
程序
+關(guān)注
關(guān)注
116文章
3756瀏覽量
80754 -
代碼
+關(guān)注
關(guān)注
30文章
4722瀏覽量
68234 -
static
+關(guān)注
關(guān)注
0文章
33瀏覽量
10350
發(fā)布評論請先 登錄
相關(guān)推薦
評論