Java

2019-03-08 Java Inner 02

2019-03-08  本文已影响0人  yangsunior

为什么内部类能直接访问外部类中成员呢?

答: 那是因为内部类持有了外部类的引用。 外部类名.this

class Outer
{
    int num = 3;
    class Inner
    {
        int num = 4;
        void show()
        {
            int num = 5;
            System.out.println("out num:" + Outer.this.num + "; inner nun:" + num);
        }
    }
    void method()
    {
        new Inner().show();
    }
}

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

Test Result:

out num:3; inner nun:5

匿名内部类

内部类的简写格式。

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();
    }
}

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

TestResult:

show ...4

以上代码等效于下面代码

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 Demo()//匿名内部类。
        {
            void show()
            {
                System.out.println("show ........"+num);
            }
        }.show();
    }
}

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

TestResult:

show ........4

匿名内部类作为实参传递

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

class Outer
{
    class Inner implements Inter
    {
        public void show1()
        {
            System.out.println("show1 .....");
        }
        public void show2()
        {
            System.out.println("show2 .....");
        }
    }

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

//      Inter in = new Inter()
//      {
//          public void show1()
//          {
//              
//          }
//          public void show2()
//          {
//          
//          }
//          
//      };
//      in.show1();
//      in.show2();
    }
}

/*
通常的使用场景之一:
当函数参数是接口类型时,而且接口中的方法不超过三个。
可以用匿名内部类作为实际参数进行传递
*/
class InnerClassDemo5 
{

    public static void main(String[] args) 
    {
        System.out.println("Hello World!");
        show(new Inter()
        {
            public void show1(){}
            public void show2(){}
        });

        method();
    }

    public static void method()
    {
        Outer out = new Outer();
        Outer.Inner in = out.new Inner();
        
        //new Outer().new Inner();
    }

    public static void show(Inter in)
    {
        in.show1();
        in.show2();
    }
}
上一篇下一篇

猜你喜欢

热点阅读