内部类学习

public class Main {
    /**
     * 内部类分为:成员内部类、方法内部类、匿名内部类、静态嵌套类
     * 
     * 公共特性:
     *         1、内部类是一个独立的类编译后有class文件,但是前面冠以外部类的类名和$符号。
     *         2、内部类是外部类的成员,所以可以随便访问外部类的成员,包括private。
     *         3、内部类是静态的话,只能访问外部类的静态成员了。
     */
    /*************************Main 成员变量    start*************************************/
    
    private int i = 2;//类的成员变量,伴随着类加载而加载,存在堆区。
    
    /*************************Main 成员变量    end*************************************/
    
    
    /** 成员内部类*/
    class MainChild{
        private int j  = 3; //属于内部类的成员变量,伴随着类加载而加载,存在堆区。
        public void print(){
            System.out.println(i);
            System.out.println(j);
        }
    }
    /******************************************************************************************************************************************/
    
    /** 静态内部类或者顶级嵌套类。
     *  静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它。
     *  静态嵌套类仅能访问外部类的静态成员和方法。
     * 
     * */
    
    static class MainStaticChild{
        int j = 3;
        
        private void print1(){
            System.out.println(j);
        }
        static int i = 33;
        
        private static void print2(){
            System.out.println(i);
        }
    }
    
    /******************************************************************************************************************************************/
    
    /*
     * 
     *  方法内部类或局部内部类(Local class)是定义在代码块中的类。它们只在定义它们的代码块中是可见的。

        1、局部类有几个重要特性:
        2、仅在定义了它们的代码块中是可见的;
        3、可以使用定义它们的代码块中的任何局部 final 变量;
        4、局部类不可以是 static 的,里边也不能定义 static 成员;
        5、局部类不可以用 public、private、protected 修饰,只能使用缺省的;
        6、局部类可以是 abstract 的。
        
     * */
    public void test1(){
        
        /*
         *方法的局部变量在调用该栈帧时,存在于局部变量表中,当栈帧结束时,该变量也不存在了,因此在
         *方法内部类中调用该局部变量可能因为栈帧销毁而拿不到j的值,所以设置为final 
         */
        final int j = 3;    
        
        class InnerClass {
            public void print() {
                System.out.println(i);
                System.out.println(j);
            }
        }
        new InnerClass().print();
    }
    
    /******************************************************************************************************************************************/
    
    /*
     * 适用场景:
        只用到类的一个实例 。
        类在定义后马上用到。
        
        注意:
        匿名内部类不能有构造方法。
        匿名内部类不能定义任何静态成员、静态方法。
        匿名内部类不能是public,protected,private,static。
        只能创建匿名内部类的一个实例。
        一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
        因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
     */
    
    public void test2(){
        
        final int j = 3;
        
        IA ia = new IA() {
            @Override
            public void print() {
                System.out.println(i);
                System.out.println(j);
            }
        };
        ia.print();
    }
    
    /******************************************************************************************************************************************/
    

    
    //main函数,测试结果
    public static void main(String[] args) {
        Main main = new Main();
        //成员内部类
        MainChild mainChild = main.new MainChild();
        mainChild.print();
        //静态内部类
        Main.MainStaticChild.print2();
        MainStaticChild staticChild = new Main.MainStaticChild();
        staticChild.print1();
        
        //局部内部类
        main.test1();
        //匿名内部类
        main.test2();
    }
}
posted @ 2016-04-20 09:49  姩澕  阅读(173)  评论(0编辑  收藏  举报