天天看點

JAVA學習筆記10------内部類 匿名内部類

内部類

内部類可以直接通路外部類成員 包括私有成員

外部類要通路内部類中的成員必須要建立内部類的對象

class Outer
{
    private int num = 3;
    class Inner
    {    void show()
        {
            直接通路num
        }
    }
    public void method()
    {
        Inner in = new Inner;
        in.show();
    }
}
           

内部類一般用于類的設計

分析事物時 發現該事物描述中還有事物 而且這個事物還在通路被描述事物的内容 

這時就可以将還有的事物用内部類來描述

直接通路外部類中的内部類的成員

Outer.Inner in = new Outer().new Inner();

in.show();//少用

如果内部類是靜态的話 代表 外部類一加載内部類就存在 此時 就相當于一個外部類

Outer.Inner in = new Outer.Inner();這個時候就是可以直接new内部類

當内部類中定義了靜态成員 那麼該内部類必須是靜态

隻有内部類是靜态的那麼該靜态成員才可以是屬于那種類一加載就能通路

為什麼内部類能直接通路外部類中成員呢?

因為内部類持有了外部類的引用  即 外部類名.this

内部類放在局部位置

比如函數内部

内部類通路局部變量的時候 變量一定是final類型 ?

内部類在局部位置隻能通路局部中被final修飾的局部變量

匿名内部類 

實質就是匿名子類對象

new 父類or接口(){子類内容}

内部類的簡寫格式

前提 内部類必須繼承或者實作一個外部類或者接口

首先要匿名 就是沒有名字 new什麼 new他父親 (){方法要實作其父親的方法}

abstract class Demo
{
    abstract void show();

}
class Outer
{
    int num = 4;

    public void method()
    {
        new Demo()//這就是匿名内部類
        {
            public void show()
            {
                    System.out.println("show....");
            }
        }//在這裡還可以調用裡面的show方法
    }
}
           

以上格式若想調用方法隻能再new在. 如何不new調用多個方法

那要給匿名内部類一個标志 并不是給内部類起名字

abstract Inter{
    abstract void show1();
    abstract void show2();
}
class Outer
{
    //原始寫法
    //class Inner extedns Inter
    //{
    //    void show1(){}
    //    void show2(){}
    //}
    public void method()
    {
        //原始寫法
        //Inner in = new Inner();
        //in.show1();
        //in.show2();

        //匿名寫法
        Inner in = new Inter(){
            void show1(){}
            void show2(){}
        };
        in.show1();
        in.show2();
    }
}
           

使用場景:

當函數參數是接類型的時候 而且接口中的方法不超過三個

可以用匿名内部類作為實際參數進行傳遞參數過多就容易臃腫 

class InnerClass
{
    public static void main(String[] args)
    {
        System.out.println("hello world");

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

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

内部類細節

匿名内部類就是基于多态的基礎上用父類應用指向一個子類對象 

是以匿名内部類真的不能通路子類中未重寫父類方法的方法 即 子類特有的方法