黑馬程序員---關(guān)于Java中的內(nèi)部類
關(guān)于Java中的內(nèi)部類? ? ? ? ? ? ? ? ??
內(nèi)部類:如果A類需要直接訪問B類中的成員,而B類又需要建立A類的對(duì)象。這時(shí),為了方便設(shè)計(jì)和訪問,直接將A類定義在B類中。就可以了。A類就稱為內(nèi)部類。內(nèi)部類可以直接訪問外部類中的成員。而外部類想要訪問內(nèi)部類,必須要建立內(nèi)部類的對(duì)象。
?
1. 成員位置內(nèi)部類,可以被成員修飾符修飾
? ? 內(nèi)部類可以直接使用外部類成員
?
//=====================================================
? 調(diào)用內(nèi)部類方法三種格式:
? ? 外部類.內(nèi)部類 變量名 = new 外部類().new內(nèi)部類();
? ? Outer .Inner in = new ?Outer.new Inner();//這種形式很少用。
? ? 內(nèi)部類,內(nèi)部類方法,都是非靜態(tài)
? ? 外部類.內(nèi)部類.方法()
? ? 內(nèi)部類靜態(tài),內(nèi)部類方法靜態(tài)
? ? 外部類.內(nèi)部類 變量 = new 外部類.內(nèi)部類();
? ? 內(nèi)部類靜態(tài),內(nèi)部類方法非靜態(tài)
/*
? main方法中
? 直接訪問內(nèi)部類方法
? 第一種格式:
? ? 內(nèi)部類是非靜態(tài)修飾的,內(nèi)部類的方法也是非靜態(tài)修飾
? ? 通過外部類,找到內(nèi)部類
?建立外部類對(duì)象,建立內(nèi)部類對(duì)象
?*外部類名.內(nèi)部類名 變量 = new 外部類對(duì)象().new內(nèi)部類對(duì)象()
? 第二種格式:
? ? 內(nèi)部類是靜態(tài)的,內(nèi)部類方法也是靜態(tài)的
?直接類名調(diào)用
?通過外部類,找到內(nèi)部類,內(nèi)部類方法
?*外部類名.內(nèi)部類名.內(nèi)部類方法
? 第三種格式:
? ? 內(nèi)部類是靜態(tài)的,內(nèi)部類方法是非靜態(tài)的
?通過外部類,找到內(nèi)部類,靜態(tài)內(nèi)部類
?內(nèi)部類對(duì)象,訪問方法
?*外部類名.內(nèi)部類名 變量 = new 外部類.內(nèi)部類對(duì)象()
*/class?Outer{?static?class?Inner?{??public?void?show(){??????????System.out.println("innerclass..show");??}?}}class?InnerClassDemo1{?public?static?void?main(String[]?args)?{?//?Outer.Inner?oi?=?new?Outer().new?Inner();?//?oi.show();?//?Outer.Inner.show();??Outer.Inner?oi?=?new?Outer.Inner();??oi.show();?//?System.out.println("Hello?World!");?}}
?
//=====================================================
? 2. 局部位置內(nèi)部類
? ? 運(yùn)行局部位置內(nèi)部類,必須依靠外部類中的方法,這個(gè)方法中創(chuàng)建內(nèi)部類對(duì)象
? ? 局部位置內(nèi)部類,訪問局部變量加final,原因是生命周期問題
? ? final的方法,巧妙的解決的生命周期
/*
? 內(nèi)部類,定義在外部類的方法中
? 局部位置內(nèi)部類,局部,私有,靜態(tài)不能修飾
? 調(diào)用abc方法,建立Inner對(duì)象,Inner是show方法的局部位置變量
? show方法要是不運(yùn)行,可能創(chuàng)建Inner對(duì)象嗎
? 在show方法中,創(chuàng)建Inner對(duì)象
? 內(nèi)部類的方法,訪問局部變量,局部變量必須加final修飾
? 為什么,生命周期
? show方法進(jìn)棧,帶著變量x一起進(jìn)棧
? 運(yùn)行完畢了,show出棧,變量x死亡
? Inner是一個(gè)類,創(chuàng)建對(duì)象的,
? 如果show方法死亡,Inner還有可能有對(duì)象存在
? 對(duì)象調(diào)用abc 變量x已經(jīng)死亡
? 第一種說
? ? 加final后,變量,變成常量,存儲(chǔ)位置發(fā)生了變化
?常量池 'a' 12 生命最長(zhǎng)的
?即使show出棧后,變量,還在常量池
? 第二種說
? ? 變量加上final后,生命周期沒有改變
?跟著show的存在而存在,消失而消失
?x終身已經(jīng)固定了,因此javac編譯
? ? 生成的class文件,abc方法中,寫進(jìn)去了abc2
*/
class Outer
{
?public void show(){
? ?final int x = 3;
? ?class Inner
? ? {
? ? public void abc(){
? ? ? System.out.println("Inner...abc"+x);
? ? }
? ? }
? ?new Inner().abc();
?}
}
class InnerClassDemo3
{
?public static void main(String[] args)
?{
? new Outer().show();
?// System.out.println("Hello World!");
?}
}
//=====================================================
? 3. 匿名內(nèi)部了
? ? 匿名內(nèi)部類,是一種簡(jiǎn)化形式,簡(jiǎn)化子類或者實(shí)現(xiàn)類的一種寫法
? ? 格式:
? ? ? new 接口或者父類(){
? ? ? ? 重寫方法
? ? ? }.方法();
? ? ? 接口或者父類 變量 = new 接口或者父類(){
? ? ? ? 重寫多個(gè)方法
? ? ? };
? ? ? 變量.方法();
? ? ? 變量.方法();
abstract class Animal
{
?public abstract void eat();
}
class NiMingTest
{
?public static void main(String[] args)
?{
? //調(diào)用eat方法
? new Animal(){
? ? ?public void eat(){
? ? ? ?System.out.println("貓吃魚");
? ? ?}
? }.eat();
?}
}
//==============//=====================================================
interface MSFace
{
?void windows();
}
class Sun
{
?//補(bǔ)齊代碼,程序可以編譯運(yùn)行
?public static MSFace getMs(){
? //返回值是一個(gè)接口類型,那么,肯定return子類對(duì)象
? ? return new MSFace(){
? ? public void windows(){
? ? ? System.out.println("windows nt6.1");
? ? }
? };
?}
}
class NiMingTest1
{
?public static void main(String[] args)
?{
? //接口 = 類.方法
? MSFace ms = Sun.getMs();
? ms.windows();
?}
}
//=====================================================
interface A
{
?public abstract void function();
?public abstract void function2();
}
/*class AImpl implements A
{
?public void function(){
?
?}
?public void function2(){
?
?}
}*/
class Outer
{
?public void show(){
? ?//匿名內(nèi)部類,就是實(shí)現(xiàn)接口和重寫方法的簡(jiǎn)化形式
? ?//格式: new 接口 不是以分號(hào)結(jié)束,是以大括號(hào)結(jié)束的,大括號(hào)中,重寫抽象方法
? A a = new A(){
? ? ? public void function(){
? ? ? ?System.out.println("匿名內(nèi)部類...function");
? ?}
? ?public void function2(){
? ? ? ?System.out.println("匿名內(nèi)部類...function22222");
? ?}
? ?};
? ?a.function();
? ?a.function2();
? ?//以上一段代碼,看成是A接口的實(shí)現(xiàn)類的對(duì)象
?}
}
class NiMingClass
{
?public static void main(String[] args)
?{
? new Outer().show();
? //System.out.println("Hello World!");
?}
}
//=====================================================
/*
? 內(nèi)部類,實(shí)現(xiàn)接口
? 從main中,調(diào)用內(nèi)部類的show方法
? 分析:內(nèi)部類,私有的,不能直接通過外部類獲得內(nèi)部類
? 在外部類,提供我一個(gè)公共方法,可以返回內(nèi)部類的對(duì)象呢
? 多態(tài)機(jī)制
*/
interface Face
{
?void show();
}
class Outer
{
?private class Inner implements Face
?{
? public void show(){
? ? ?System.out.println("內(nèi)部類重寫接口方法");
? }
?}
? ? //返回值,返回的是接口類型,其實(shí)返回的是接口的實(shí)現(xiàn)類對(duì)象
?//實(shí)現(xiàn)類,私有的內(nèi)部類
?public Face getInner(){
? ? return new Inner();
?}
}
class InnerClassDemo2
{
?public static void main(String[] args)
?{
? Outer o = new Outer();
? //Face接口,指向自己的實(shí)現(xiàn)類對(duì)象,實(shí)現(xiàn)類對(duì)象,沒有直接new,通過getInnerf方法獲取的
? Face x = o.getInner();
? in.show();
?}
}
? ? ? ? ? ? ? ? ??