課程
/后端開發
/Java
/Java入門第二季 升級版
為什么在創建內部類對象之前要先創建外部類對象,而不能直接用Inner i=HelloWorld.new Inner();
2015-09-17
源自:Java入門第二季 升級版 7-6
正在回答
先說=的左邊?
Inner是內部類 是有所屬的外部類的你標識出內部類所屬的外部類,java不知道去哪里找這個內部類所以=的左邊是 Outer.Inner i?
再說=的右邊?
內部類你可以看成是外部類的一個成員,你調用外部類的成員時(如方法) 必須先創建外部類的對象,然后通過對象來調用,所以你調用內部類也必須有一個外部類的對象 所以=的右邊應該是new Outer().new Inner()
另外.如果內部類是靜態的
也就相當與是靜態成員,也就就不需要創建外部對象 ?=的右邊直接 new Outer.Inner()即可
魯文杰 提問者
你這里的Inner是一個靜態內部類吧!你把這個內部類想象成一個普通的靜態方法、或者是靜態屬性,那么你要怎么去調用這個方法和屬性?那肯定是類名.方法(或屬性):比如HelloWorld.print();那么靜態內部類也是一樣,你要聲明它的對象,得用外部類名去調用:即HelloWorld.new Inner();
然后前面加上new:new ? ? ? ? ??HelloWorld.new Inner();(不是new HelloWorld ? ? ? ? .new Inner);
你看一下這個代碼,里面有四種內部類對象的聲明,把他們想成一個方法,這樣一個方法該怎么去調用,那么這個類就如何去聲明。代碼如下:
package com.briup.pojo;
public class InnerClassTest {
????public void Test(){
?????class LocalInner{ ???????????????????????????????? //局部內部類,與局部變量類似,只能在此方法里聲明
????LocalInner li = new LocalInner();????????? ? //聲明局部內部類
}
public void getStudent(){
????Adb a = ?new Adb(){ ???????????????????????????? //匿名內部類,沒有名字的內部類,定義類時就同時聲明了
????????????????????????????????????????????????????????????????? ? //Adb是一個抽象類,最下面有代碼
????};
public static class StaticInner{????????????//靜態內部類,想象靜態方法是怎么調用的
????
class MemberInner{???????????????????????????? //成員內部類,你可以把它理解成一個特殊的屬性
public static void main(String[] args) {
StaticInner s = new ? ? ? ? ? InnerClassTest.StaticInner();????????//聲明靜態內部類
MemberInner m = (new InnerClassTest()).new MemberInner(); ? ?//聲明成員內部類
---------------------------
public abstract class Adb{
把內部類與處于同樣位置的方法、屬性類比,就知道如何去聲明了。
舉報
課程升級!以終為始告別枯燥,在開發和重構中體會Java面向對象編程的奧妙
4 回答創建類和創建對象
2 回答類和創建對象
1 回答創建類的對象
1 回答o.new Inner() 類對象創建
1 回答創建內部類 對象
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2015-09-18
先說=的左邊?
Inner是內部類 是有所屬的外部類的你標識出內部類所屬的外部類,java不知道去哪里找這個內部類所以=的左邊是 Outer.Inner i?
再說=的右邊?
內部類你可以看成是外部類的一個成員,你調用外部類的成員時(如方法) 必須先創建外部類的對象,然后通過對象來調用,所以你調用內部類也必須有一個外部類的對象 所以=的右邊應該是new Outer().new Inner()
另外.如果內部類是靜態的
也就相當與是靜態成員,也就就不需要創建外部對象 ?=的右邊直接 new Outer.Inner()即可
2015-09-17
你這里的Inner是一個靜態內部類吧!你把這個內部類想象成一個普通的靜態方法、或者是靜態屬性,那么你要怎么去調用這個方法和屬性?那肯定是類名.方法(或屬性):比如HelloWorld.print();那么靜態內部類也是一樣,你要聲明它的對象,得用外部類名去調用:即HelloWorld.new Inner();
然后前面加上new:new ? ? ? ? ??HelloWorld.new Inner();(不是new HelloWorld ? ? ? ? .new Inner);
你看一下這個代碼,里面有四種內部類對象的聲明,把他們想成一個方法,這樣一個方法該怎么去調用,那么這個類就如何去聲明。代碼如下:
package com.briup.pojo;
public class InnerClassTest {
????public void Test(){
?????class LocalInner{ ???????????????????????????????? //局部內部類,與局部變量類似,只能在此方法里聲明
????LocalInner li = new LocalInner();????????? ? //聲明局部內部類
}
}
public void getStudent(){
????Adb a = ?new Adb(){ ???????????????????????????? //匿名內部類,沒有名字的內部類,定義類時就同時聲明了
????????????????????????????????????????????????????????????????? ? //Adb是一個抽象類,最下面有代碼
????};
}
public static class StaticInner{????????????//靜態內部類,想象靜態方法是怎么調用的
????
}
}
class MemberInner{???????????????????????????? //成員內部類,你可以把它理解成一個特殊的屬性
}
}
public static void main(String[] args) {
StaticInner s = new ? ? ? ? ? InnerClassTest.StaticInner();????????//聲明靜態內部類
MemberInner m = (new InnerClassTest()).new MemberInner(); ? ?//聲明成員內部類
}
}
---------------------------
package com.briup.pojo;
public abstract class Adb{
}
把內部類與處于同樣位置的方法、屬性類比,就知道如何去聲明了。