內(nèi)部類

內(nèi)部類訪問特點:

1,內(nèi)部類可以直接訪問外部類中的成員。
2,外部類要訪問內(nèi)部類,必須建立內(nèi)部類的對象。

一般用于類的設(shè)計。

分析事物時,發(fā)現(xiàn)該事物描述中還有事物,而且這個事物還在訪問被描述事物的內(nèi)容。
這時就把還有的事物定義成內(nèi)部類來描述。

成員內(nèi)部類:

定義方式:Outer.Inner in = new Outer().new Inner();(詳細(xì)代碼如下)
直接訪問外部類中的內(nèi)部類中的成員。
in.show();

靜態(tài)內(nèi)部類
定義方式:
如果內(nèi)部類是靜態(tài)的。 相當(dāng)于一個外部類
Outer.Inner in = new Outer.Inner();
in.show();

注意:

  1. 內(nèi)部類中既可以有靜態(tài)成員,也可以有非靜態(tài)成員
    但是,如果內(nèi)部類中定義了靜態(tài)成員,該內(nèi)部類也必須是靜態(tài)的
  2. 如果內(nèi)部類是靜態(tài)的,成員是靜態(tài)的??梢酝ㄟ^類名.成員的方式調(diào)用
    Outer.Inner.function();
class Outer
{
    private static int num = 31;

    class Inner// 內(nèi)部類。
    {
        void show()
        {
            System.out.println("show run..."+num);
        }
        /*static void function()//如果內(nèi)部類中定義了靜態(tài)成員,該內(nèi)部類也必須是靜態(tài)的。
        {
            System.out.println("function run ...."+num);
        }
        */
    }

    public void method()
    {
        Inner in = new Inner();
        in.show();
    }
}


class InnerClassDemo
{
    public static void main(String[] args) 
    {
//      Outer out = new Outer();
//      out.method();
        //直接訪問外部類中的內(nèi)部類中的成員。
//      Outer.Inner in = new Outer().new Inner();
//      in.show();

        //如果內(nèi)部類是靜態(tài)的。 相當(dāng)于一個外部類
//      Outer.Inner in = new Outer.Inner();
//      in.show();

        //如果內(nèi)部類是靜態(tài)的,成員是靜態(tài)的。
//      Outer.Inner.function();
        
    }
}

局部內(nèi)部類
內(nèi)部類可以存放在局部位置上。即內(nèi)部類放在方法中
內(nèi)部類在局部位置上只能訪問局部中被final修飾的局部變量。包括方法傳入的參數(shù)也必須是final修飾的

class Outer
{
    int num = 3;
    Object method()
    {

        final int x = 9;

        class Inner
        {
            public String toString()
            {
                return "show ..."+x;
            }
        }

        Object in = new Inner();
        return in;//0x0045
//      in.show();
    }


    
}

class InnerClassDemo3 
{
    public static void main(String[] args) 
    {
        Outer out = new Outer();
        Object obj = out.method();
        System.out.println(obj);

    }
}

匿名內(nèi)部類。就是內(nèi)部類的簡寫格式。

必須有前提:
內(nèi)部類必須繼承或者實現(xiàn)一個外部類或者接口。

**匿名內(nèi)部類:其實就是一個匿名子類對象。 **

格式:new 父類or接口(){子類內(nèi)容}

*/
示例一

abstract class Demo
{
    abstract void show();
}

class Outer
{
    int num = 4;
    /*
    class Inner extends Demo
    {
        void show()
        {
            System.out.println("show ..."+num);
        }
    }
    */
    public void method()
    {
        //new Inner().show();
        new Demo()//匿名內(nèi)部類。
        {
            void show()
            {
                System.out.println("show ........"+num);
            }
        }.show();
    }
}


class InnerClassDemo4 
{
    public static void main(String[] args) 
    {
        new Outer().method();
    }
}

示例二:利用多態(tài),向上轉(zhuǎn)型,利用父類或接口聲明一個變量,接受匿名子類對象,這樣來調(diào)用多個方法。

interface Inter
{
    void show1();
    void show2();
}

class Outer
{
    /*
    class Inner implements Inter
    {
        public void show1()
        {
        }
        public void show2()
        {
        
        }
    }
    */

    public void method()
    {
//      Inner in = new Inner();
//      in.show1();
//      in.show2();
        

        Inter in = new Inter()
        {
            public void show1()
            {
                
            }
            public void show2()
            {
            
            }
            
        };
//利用多態(tài),向上轉(zhuǎn)型,利用父類或接口聲明一個變量,接受匿名子類對象,這樣來調(diào)用多個方法
        in.show1();
        in.show2();
    }
}

通常的使用場景之一:
當(dāng)函數(shù)參數(shù)是接口類型時,而且接口中的方法不超過三個。
可以用匿名內(nèi)部類作為實際參數(shù)進(jìn)行傳遞



interface Inter{
    public abstract void show1();
    public abstract void show2();
}
class InnerDemo5 
{

    
    public static void main(String[] args) 
    {
        System.out.println("Hello World!");

        show(new Inter()
        {
            public void show1(){}
            public void show2(){}
        });
    }


    public static void show(Inter in)
    {
        in.show1();
        in.show2();
    }
}

示例三:向上轉(zhuǎn)型的弊端:限制調(diào)用子類的特有方法

class Outer
{
    void method()
    {
        Object obj = new Object()
        {
            public void show()
            {
                System.out.println("show run");
            }

        };
        obj.show();//因為匿名內(nèi)部類這個子類對象被向上轉(zhuǎn)型為了Object類型。
                    //這樣就不能在使用子類特有的方法了。


    }
}

class InnerClassDemo6 
{
    public static void main(String[] args) 
    {
        new Outer().method();
    }
}

補充:
構(gòu)造代碼塊初始化過程

圖中紅色標(biāo)志為執(zhí)行順序

構(gòu)造代碼塊初始化過程.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java 內(nèi)部類 分四種:成員內(nèi)部類、局部內(nèi)部類、靜態(tài)內(nèi)部類和匿名內(nèi)部類。 1、成員內(nèi)部類: 即作為外部類的一個成...
    ikaroskun閱讀 1,355評論 0 13
  • 一、介紹 內(nèi)部類是指在一個外部類的內(nèi)部再定義一個類。類名不需要和文件夾相同。內(nèi)部類可以是靜態(tài)static的,也可用...
    一只好奇的茂閱讀 1,042評論 4 21
  • 一、繼承 當(dāng)兩個事物之間存在一定的所屬關(guān)系,即就像孩子從父母那里得到遺傳基因一樣,當(dāng)然,java要遺傳的更完美,這...
    玉圣閱讀 1,121評論 0 2
  • 2017年6月27日 周二 請原諒我今天早上只寫了一百多個字就離開板凳,跑到廚房去做飯了。早上6點半的鬧鐘響了之后...
    青衣雨翼_shape閱讀 318評論 0 0
  • 2017年6月4日 3:44分 聚焦網(wǎng)初五原創(chuàng) 鄭州 張婷 星期日 分享第一天 第11天從新始 星期六的...
    心愿幸福閱讀 143評論 0 0

友情鏈接更多精彩內(nèi)容