1. static定義內(nèi)部類
1.1 static定義內(nèi)部類
如果說現(xiàn)在內(nèi)部類上使用了static定義,那么這個(gè)內(nèi)部類就變成了“外部類”,static定義的都是獨(dú)立于類的結(jié)構(gòu),所以該類結(jié)構(gòu)就相當(dāng)于是一個(gè)獨(dú)立的程序類了。需要注意,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);
}
}
}
這個(gè)時(shí)候的Inner類是一個(gè)獨(dú)立類 ,如果此時(shí)要想實(shí)例化Inner類對(duì)象,只需要根據(jù)“ 外部類.內(nèi)部類 ”的結(jié)構(gòu)實(shí)例化對(duì)象即可
格式如下 外部類.內(nèi)部類 內(nèi)部類對(duì)象 = new 外部類.內(nèi)部類() ;
這個(gè)時(shí)候類名稱帶有“.”
我們現(xiàn)在實(shí)例化static內(nèi)部類對(duì)象
public class Test {
public static void main(String[] args) {
Outer.Inner in = new Outer.Inner();
in.print();
}
}
輸出結(jié)果是“haha”
所以以后如果發(fā)現(xiàn)類名稱上提供有“.”,首先應(yīng)該立刻想到這是一個(gè)內(nèi)部類的結(jié)構(gòu),如果可以直接進(jìn)行實(shí)例化,則應(yīng)該立刻認(rèn)識(shí)到這是一個(gè)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)部接口,主要是因?yàn)檫@些操作時(shí)屬于一組相關(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(); //方法中直接實(shí)例化內(nèi)部類對(duì)象
}
}
public class Test {
public static void main(String[] args) {
new Outer().fun(2390239023L);
}
}
輸出:haha 和 2390239023
此時(shí)在fun()方法內(nèi)部提供有Inner內(nèi)部類的定義,并且發(fā)現(xiàn)內(nèi)部類可以直接訪問外部類中的私有屬性也可以直接訪問方法中的參數(shù),但對(duì)于方法中的參數(shù)直接訪問時(shí)從JDK1.8開始支持的。而在JDK1.8之前**,如果方法中定義的內(nèi)部類要想訪問方法中的參數(shù)則參數(shù)前必須追加final。**
之所以取消這樣的限制是為了擴(kuò)展函數(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子類只使用唯一的一次,那么是否還有必要將其定義為單獨(dú)的類?那么在這樣的要求下就發(fā)現(xiàn)這個(gè)時(shí)候定義的子類是有些多余了,所以就可以利用內(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)部類不一定要在抽象類或接口上,但只有在抽象類和接口上才有意義。有些時(shí)候?yàn)榱烁臃降捏w現(xiàn)出匿名內(nèi)部類的使用,往往可以利用靜態(tài)方法做一個(gè)內(nèi)部類的匿名內(nèi)部類實(shí)現(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)部類只是一個(gè)沒有名字的只能夠使用一次的,并且結(jié)構(gòu)固定的一個(gè)子類。
4.總結(jié):
好了,內(nèi)部類的使用就介紹完了,大家可以收藏起來,工作中肯定用得到。
-
接口
+關(guān)注
關(guān)注
33文章
8605瀏覽量
151197 -
程序
+關(guān)注
關(guān)注
117文章
3787瀏覽量
81060 -
代碼
+關(guān)注
關(guān)注
30文章
4788瀏覽量
68628 -
static
+關(guān)注
關(guān)注
0文章
33瀏覽量
10372
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論