• Java 内部类


    /*
    为什么内部类能直接访问外部类中成员呢?
    那是因为内部类持有了外部类的引用。  外部类名.this
    */
    class Outer
    {
        int num = 3;
        class Inner
        {
            int num = 4;
            void show()
            {
                int num = 5;
                System.out.println(Outer.this.num);
            }
        }
        void method()
        {
            new Inner().show();
        }
    }
    
    
    class InnerClassDemo2 
    {
        public static void main(String[] args) 
        {
            new Outer().method();
        }
    }
    局部内部类
    /*
    局部内部类可以存放在局部位置上。 
    内部类在局部位置上只能访问局部中被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);
    
        }
    }
    *
    匿名内部类。就是内部类的简写格式。
     
    必须有前提:
    内部类必须继承或者实现一个外部类或者接口。
     
    匿名内部类:其实就是一个匿名子类对象。 
     
    格式:new 父类or接口(){子类内容}
     
    */
    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()//匿名内部类。
            {
                void show()
                {
                    System.out.println("show ........"+num);
                }
            }.show();
        }
    }
    
    
    class InnerClassDemo4 
    {
        public static void main(String[] args) 
        {
            new Outer().method();
        }
    }
    ////////////////////////////////////////////////////////////////////////
    
    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()
                {
                
                }
                
            };
            in.show1();
            in.show2();
        }
    }
    /*
    通常的使用场景之一:
    当函数参数是接口类型时,而且接口中的方法不超过三个。
    可以用匿名内部类作为实际参数进行传递
    */
    class InnerClassDemo5 
    {
    
        class Inner
        {
        }
        public static void main(String[] args) 
        {
            System.out.println("Hello World!");
            /*
            show(new Inter()
            {
                public void show1(){}
                public void show2(){}
            });
            */
    
    //        new Inner();
        }
    
        public void method()
        {
            new Inner();
        }
    
        public static void show(Inter in)
        {
            in.show1();
            in.show2();
        }
    }
    
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    class Outer
    {
        void method()
        {
            Object obj = new Object()
            {
                public void show()
                {
                    System.out.println("show run");
                }
            };
            //obj.show();   //error : 因为匿名内部类这个子类对象被向上转型为了Object类型。
               //这样就不能在使用子类特有的方法了。
            
            new Object()
            {
                public void show()
                {
                    System.out.println("show run");
                }
    
            }.show();
        }
    }
    
    public class FieldDemo 
    {
        public static void main(String[] args)
        {  
            new Outer().method();    
        }  
      
    }  
  • 相关阅读:
    监视和调整硬件性能
    ASP.NET MVC三个重要的描述对象:ActionDescriptor
    REST in Practice
    软硬件错误的排查之道
    OMCS 多媒体连接系统
    逻辑层 vs 物理层
    深入浅出裸测之道单元测试的单元化
    简单的网络爬虫实现
    WCF返回JSON与传入JSON(普通参数或对象)
    .NET程序员的一个礼物——TypeMonster
  • 原文地址:https://www.cnblogs.com/xiarongjin/p/8306675.html
Copyright © 2020-2023  润新知