乙個類定義在另乙個類的內部,前者稱之為內部類,後者稱之為外部類。
內部類一般用在定義它的類和語句塊內,在外部使用它時需要給出完整的名稱,且不可以與外部類的名稱相同。
使用場景為當乙個事物的內部,還有乙個部分需要乙個完整的結構進行描述,而這個內 部的完整的結構又只為外部事物提供服務,那麼整個內部的完整結構最好使 用內部類。比如:集合中的某些結構
內部類是乙個編譯器行為,與虛擬機器無關。編譯器會將內部類轉換為常規的類檔案,用$分隔外部類類名與內部類名,而虛擬機器對此一無所知。
內部類可以對同乙個包下的其他類隱藏(只有內部類可以是private修飾,而常規類可以有包可見性(預設)與公共可見性(public))。
內部類可以訪問定義所在的這個類的作用域中的資料,包括原有的私有資料。
靜態內部類
非靜態內部類
區域性內部類
匿名內部類
inner class 可以宣告為private 和protected、預設、public,final(最終類),abstract(可被繼承)。
inner class 可以定義成員變數,構造方法,方法(可以是static靜態的)
inner class 並不 包含乙個隱式引用,指向例項化這個物件的外部類物件。
inner class 可以訪問out class 的屬性,方法(包括私有的)。
out calss 的靜態成員部分使用內部類時,可以考慮內部類宣告為靜態的。
只要內部類不需要訪問外圍類物件,就應該使用靜態內部類。
在域之外,引用內部類:outclass.innerclass
arrayalg.pair pair =
newarrayalg.pair
(1.1
,1.2
);
public
class
arrayalg
public
double
getfirst()
public
void
setfirst
(double first)
public
double
getsecond()
public
void
setsecond
(double second)
}public
static pair minmax
(double
values)
return
newpair
(min,max);}
}public
static
void
main
(string[
] args));
system.out.
println
("min = "
+ minmax.
getfirst()
+" max = "
+ minmax.
getsecond()
);}}
inner class 可以宣告為private 和protected、protected、預設,final(最終類),abstract(可被繼承)。
inner class 可以定義成員變數,構造方法,方法,但不可以定義為static的成員。
inner class 包含乙個隱式引用,指向例項化這個物件的外部類物件。
inner class 可以訪問out class 的屬性,方法(包括私有的)。
關於隱式引用:
這個引用在內部類的定義中是不可見的。
外部類的引用在構造器中設定。構造器會修改所有的內部類構造器,新增乙個外部類引用的引數。
在域之外,引用內部類:outclass.innerclass
//語音時鐘類
public
class
talkingclock
//開始時鐘
public
void
start()
public
class
timeprinter
implements
actionlistener
}public
static
void
main
(string[
] args)
}
宣告區域性內部類不能有訪問說明符(public 或private )。區域性內部類的作用域被限定在宣告這個區域性類的塊中。
只能夠定義在方法和**塊內部,而且是先宣告後使用。
但它的物件可以通過外部方法的返回值返回使用,返回值型別只能是區域性內部類的父類或父介面型別。
區域性內部類可以使用外部方法的區域性變數,但是必須是事實的最終變數,即一旦被賦值就不可改變。由於區域性內部類和區域性變數的宣告週期不同所致。
public
class
talkingclock1}
timeprinter listener =
newtimeprinter()
; timer timer =
newtimer
(interval, listener)
; timer.
start()
;}}
關於區域性變數在區域性內部類中使用的說明:
編譯器檢測到區域性變數的訪問,為每乙個變數建立相應的例項字段,並將區域性變數複製到構造器,從而初始化這些例項字段。
class
talkingclock1$1timeprinter
此處的beep在區域性內部類中被使用,因此會為其建立乙個例項字段,並通過構造器初始化。
使用區域性內部類,如果只想建立這個類的乙個物件,設定不需要為類指定名字,這樣的乙個類稱之為匿名內部類。
乙個匿名內部類一定是在new的後面,用其隱含實現乙個介面或 實現乙個類。
new
supertype
(引數列表)
如果supertype是乙個類,那麼內部類就要擴充套件這個類。
如果supertype是乙個介面,那麼內部類就要實現這個介面。
同時由於構造器的名稱必須與類名相同,而匿名內部類沒有類名,因此匿名內部類沒有構造器。
實際上構造引數是要傳遞給超類構造器,因此內部類實現乙個介面,就不能有任何引數(介面無構造器方法),但仍然提供一對小括號。
new
inte***cetype()
儘管匿名類不能有構造器,但可以提供乙個物件初始化塊。
new
supertype
(引數列表)
//內部類方法與資料
}
匿名內部類不能定義任何靜態成員、方法和類,只能建立匿名內部類的一 個例項。
public
class
test})
;}public
static
void
print
(arraylist
lists)
}}
注意:建立乙個匿名子類通常會很方便,但對於以下equasl方法使用匿名子類可能會失敗
...
.if(getclass()
!= other.
getclass()
)return
false;.
..
public
class
test})
; set.
add(1)
; set.
add(2)
; set.
add(3)
; system.out.
println
(set);}
}
java物件導向 九 內部類
內部類即在乙個類的內部定義了其他類的情況.範例1 class outer public void fun public class testdemo 以上程式的執行過程 例項化物件 out 呼叫方法 呼叫方法例項化內部的物件 呼叫內部的方法 執行結果 由以上程式可以看出,內部類的最大缺點是破壞了程式...
物件導向 內部類
在學內部類前,我自己先問了自己2個問題!1 什麼是內部類呢?簡單說 就是在乙個類中在建立乙個類。2 而為什麼又要搞這個內部類呢?我想是為了在於現實中的一些建模問題吧,讓事物更加形象。比如要建立 人體 這個類,有很多功能吧,比如 吃飯 看書 而這些功能又需要 嘴巴 眼睛 那麼我們就不得不建立 嘴巴 眼...
物件導向 內部類
asp.net android ios開發 net培訓 期待與您交流!7.1內部類 內部類 將乙個類定義在另乙個類裡面,裡面那個類就稱為內部類.格式 class outclass 注意 內部類可以定義在外部類的成員位置,也可以是在外部類的區域性位置.如 class outclass 注意 內部類可以...