Loading

Java内部类

Java内部类

image

  • 成员内部类
  • 静态内部类
  • 局部内部类
  • 匿名内部类
public class Outer {
    private int outId = 1;
    public void outerMethod() {
        System.out.println("这是一个外部方法");
    }
    public void method() {
        class Innner3 {
            public void in() {
                System.out.println("Innner3.in");
            }
        }
    }

    /**
     * 静态内部类
     */
    public static class StaticInner {
        private int inId = 2;
        public void inMethod() {
            System.out.println("这是一个内部方法");
        }
        public static void staticInMethod() {
            System.out.println("这是一个内部方法");
        }
    }

    /**
     * 成员内部类
     */
    public class Inner {
        private int inId = 2;
        public void inMethod() {
            System.out.println("这是一个内部方法");
        }
        public void getOutId() {
            System.out.println("获取外部Id:"+outId);
        }
    }
}

class Inner2 {
}

interface Test {
    void print();
}

测试类

public class Application {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.outerMethod();
        Outer.Inner inner = outer.new Inner();
        inner.inMethod();
        inner.getOutId();
        System.out.println("=========");
        Outer.StaticInner staticInner = new Outer.StaticInner();
        staticInner.inMethod();
        Outer.StaticInner.staticInMethod();
        Test test = new Test() {
            @Override
            public void print() {
                System.out.println("匿名内部类");
            }
        };
        test.print();
    }
}
public static void main(String[] args) {
    //方法一(局部内部类)
    class Mouse implements USB {
        @Override
        public void service() {
            System.out.println("鼠标接入");
        }
    }
    USB mouse = new Mouse();
    mouse.service();
    //方法二(匿名内部类,可以减少代码量)
    USB usb = new USB() {
        @Override
        public void service() {
            System.out.println("鼠标接入");
        }
    };
    usb.service();
}

补充

/**
 * 局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是【有效final的】
 * 备注:从java8+开始,只要局部变量实际不变,那么final关键字可以忽略
 *
 * 原因:
 * 1. new出来的对象在堆内存中
 * 2. 局部变量是跟着方法走的,在栈内存当中
 * 3. 方法运行结束之后,立刻出栈,局部变量会立刻消失
 * 4. 但是new出来的对象会在堆当中持续存在,直到垃圾回收消失
 *
 */
//外部类
public class MyOuter {
    //方法
    public void outerMethod() {
        //所在方法的局部变量
        int i = 10;
        i++;

        int finalI = i;
        //局部内部类
        class MyInner {
            public void innerMethod() {
                System.out.println(finalI);
            }
        }
    }
}

编译后生成MyOuter.class MyOuter$1MyInner.class文件中的代码如下

public class MyOuter {
    public MyOuter() {
    }

    public void outerMethod() {
        byte var1 = 10;
        int var3 = var1 + 1;

        class MyInner {
            MyInner(int var2) {
                this.val$finalI = var2;
            }

            public void innerMethod() {
                System.out.println(this.val$finalI);
            }
        }

    }
}
class MyOuter$1MyInner {
    MyOuter$1MyInner(MyOuter var1, int var2) {
        this.this$0 = var1;
        this.val$finalI = var2;
    }

    public void innerMethod() {
        System.out.println(this.val$finalI);
    }
}
posted @ 2022-01-21 23:39  Cn_FallTime  阅读(23)  评论(0编辑  收藏  举报