JAVA基础补漏--内部类

成员内部类

public class InnerClass {

    public static void main(String[] args) {

        System.out.println("+++++++++++++++++++++++");

        Outer.Inner oi = new Outer().new Inner();
        oi.methodInner();
    }

}

public class Outer {

    int num = 10;

    public class Inner{

        int num = 20;

        public void methodInner(){
            int num =30;
            System.out.println(num);
            System.out.println(this.num);
            System.out.println(Outer.this.num);
        }
    }
}

局部内部类

public class InnerClass {

    public static void main(String[] args) {

        Outer out = new Outer();
        out.methodOuter();
    }


}

public class Outer {

    int num = 10;

    public void methodOuter(){

         class Inner{

             int num = 10;
             public void methodInner(){
                 System.out.println(num);
             }

        }

        Inner in = new Inner();
         in.methodInner();
    }

}

权限修饰符

外部类:public / default

成员内部类:public protect default private

局部内部类:什么都不能用

局部内部类,如果希望访问所在方法的局部变量,这个局变量必是final的。如果这个变量不变,final可不写。

原因

1.new 的对象在堆内存中。
2.局部变量跟着方法走,在栈内部中。
3.方法运行结束后,立即出栈,局部变量会消失。
4.但是内部类的方法要使用,必须要new一个对象,new出来对象在内存中一直存在,直到垃圾回收,这时局部变量可能已经销毁了。如果要使用,就自己要拷贝一个,但如果变量总变,没有办法拷贝,如果是final,则可以直接拷贝。

public class Outer {
    
    public void methodOuter{
        
        final int num = 10;
        
        class Inner{
            
            public void methodInner(){
                
                System.out.println(num);
            }
        }
    }
    
}

匿名内部类

如果接口实现类(或者父类的子类)只使用一次,这时候可以省略类的定义,而使用匿名内部类。

格式:

接口类名称 对象 = new 接口名称(){
//覆盖重写所有抽象方法
}

public class main {

    public static void main(String[] args) {



        myInterface obj = new myInterface() {
            @Override
            public void method() {
                System.out.println("Inner method");
            }
            
        };

        obj.method();
        
        new myInterface(){

            @Override
            public void method() {
                System.out.println("匿名对象使用匿名内部类");
            }
        }.method();

    }
}

posted @ 2019-02-27 10:24  comeluder  阅读(146)  评论(0编辑  收藏  举报