1. 程式人生 > 其它 >java內部類與匿名類詳解

java內部類與匿名類詳解

內部類

一個類的內部又完整的嵌套了另一個類結構。被巢狀的類稱為內部類。
類的五大成員:屬性,方法,構造器,程式碼塊,內部類。
內部類與區域性內部類

class Outer
{
    private int n= 100;
    private void m2()
    {

    }
    public void m1()
    {
        class Inner  //區域性內部類
        {
            //可以直接訪問外部類的所有成員,包括私有
            //內部類相當於區域性變數,不能新增訪問修飾符,但是可以使用final修飾
            //作用域:僅僅在定義它的方法或程式碼塊中
            private int n= 20;
            public void f()
            {
                System.out.println(n);//20
                //當外部類與區域性類重名 就近原則,呼叫外部類 外部類名.this.成員
                System.out.println(Outer.this.n);//100
                m2();
            }
        }
        //建立區域性內部類
        Inner inner = new Inner();
        inner.f();
    }
    //內部類,定義在成員位置上,相當於一個類的成員
    //可以新增任何修飾符
    public class Inner2()
    {
    	public void say()
    	{
    		System.out.println(666);
    	}
    }
    

}

匿名內部類(超重點)
作用:簡化開發,對於某些物件只需要存在一次,則可用匿名類。
1.本質是類 2.內部類 3. 該類沒有名字 4.同時是一個物件

class Outer2
{
    private int n2 = 10;
    public void method()
    {
        //匿名內部類
        //fish 的編譯型別 A
        //fish 的執行型別 Outer2$1
        //在底層 自動分配一個類
        //class Outer2$1 implements A
//        {
//            @Override
//            public void cry()
//            {
//                System.out.println("fish cry");
//            }
//        }
       A fish= new A()
        {
            @Override
            public void cry()
            {
                System.out.println("fish cry");
            }
        };
       fish.cry();
        System.out.println(fish.getClass());//Outer2$1
        //class Outer2$2 extends Father
        Father father=new Father("pig")
        {
            @Override
            public void test()
            {
                System.out.println("pig eat");
            }
        };
        father.test();
    }

}
interface A  //介面
{
    public void cry();
}
class Father
{
    public Father(String name)
    {}
    public void test()
    {}
}

練習

public class AnonmousClass
{
    public static void main(String[] args)
    {
        CellPhone cellPhone = new CellPhone();

        cellPhone.alarmClock(new Bell()
        {
            @Override
            public void ring()
            {
                System.out.println("wake up");
            }
        });
        cellPhone.alarmClock(new Bell()
        {
            @Override
            public void ring()
            {
                System.out.println("go to study");
            }
        });
    }
}

interface Bell
{
    void ring();
}

class CellPhone
{
    public void alarmClock(Bell bell)//形參型別是Bell
    {
        bell.ring();//實現方法
    }
}