首页 > 代码库 > java内部类

java内部类

#1,成员内部类

public class TestInnerClass {
    private int id;
    private String name;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    /**
     * @param args
     * @author wangbiao
     * @Java内部类的使用
     */
    public static void main(String[] args) {
        
        //编译这个java文件,会产生两个class文件,TestInnerClass.class和TestInnerClass$Inner.class
        //能够访问成员内部类必须经过外部类对象
        TestInnerClass outer = new TestInnerClass();
        Inner inner = outer.new Inner();
        inner.setName("inner");
        outer.setName("outer");
        outer.setId(1234567890);
        inner.work();
        
    }
    
    void test(){//外部类非静态方法访问成员内部类
        Inner inner = new Inner();
        inner.work();
    }
    
    class Inner{
        private String name;
        
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }

        //不可申明static类型的变量,else 编译报错
        void work(){
        System.out.println(id);
        System.out.println(name);//优先内部类属性
        System.out.println(this.name);//内部类对象
        System.out.println(TestInnerClass.this.name);//外部类对象
        }
    }
    
}

#2,方法内部类

//方法里面的内部类
    void _test(String name){
    //方法内部类,只能在定义改内部类的方法里面实例化该内部类
    //方法内部类不能访问方法里面非final的变量,原因是存活期不同,方法里面的变量保存在栈中,而内部类对象是保存在堆中
    //方法执行完后,保存在栈中的非final局部变量就会被删除,但是内部类对象可能仍然在堆中。
        //方法里的内部类更像是局部变量,只能用final 和 abstact修饰
        final int a = 10;
        class Inner_Second{
            void test(){
                System.out.println(a);
            }
        }
        
    }
    static void test_one(){
        //只能访问外部类的静态变量
        final int a = 10;
        class Inner_Second{
            void test(){
                System.out.println(VERSION+"-"+a);
            }
        }
    }

#3,静态内部类

//静态内部类相当于外部类之外的其他类,不能访问外部类的成员和方法。
        TestInnerClass.Static_Inner static_Inner = new TestInnerClass.Static_Inner();

#4,匿名内部类

继承式+接口式+参数式