Inner Class

内部类

  1. 内部类共分为4种:
  • 静态内部类(static inner class):只能访问外部类的静态成员变量与静态方法,生成静态内部类对象的方式为:OuterClass.InnerClass inner = new uterClass.InnerClass()

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class StaticInner {
    private static int a = 4;
    public static class Inner{
    public void test() {
    System.out.println(a);
    }
    }
    }
    class StaticInnerTest {
    public static void main(String[] args) {
    StaticInner.Inner inner = new StaticInner.Inner();
    inner.test();
    }
    }
  • 成员内部类(menber inner class):可以访问外部类的静态与非静态的方法与成员变量。生成成员内部类对象的方式为:MemberInner.Inner2 inner2 = new MemberInner().new Inner2();

  • 若想在局部内部类中访问外部类成员变量,语法为:
    OuterClass.this.a;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class MemberInner {
    private int a = 4;
    public class Inner2{
    private int a = 5;
    public void doSomething() {
    //访问外部类属性
    System.out.println(MemberInner.this.a);
    }
    }
    }
    class MemberInnerTest {
    public static void main(String[] args) {
    MemberInner.Inner2 inner2 = new MemberInner().new Inner2();
    inner2.doSomething();
    }
  • 局部内部类(Local Inner Class):定义在方法当中,只能访问方法中声明的final类型的变量。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public class LocalInnerClass {
    public void doSomething() {
    final int b = 4;
    class Inner3 {
    public void test() {
    System.out.println(b);
    }
    }
    new Inner3().test();
    }
    }
    class LocalInnerClassTest {
    public static void main(String[] args) {
    LocalInnerClass localInnerClass = new LocalInnerClass();
    localInnerClass.doSomething();
    }
    }
  • 匿名内部类(g):匿名内部类会隐式地集成一个父类或实现一个接口。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public class AnonymousInnerClass {
    @SuppressWarnings(value = "deprecation")
    public String get(Date date) {
    return date.toLocaleString();
    }
    public static void main(String[] args) {
    AnonymousInnerClass anonymousInnerClass = new AnonymousInnerClass();
    // String str = anonymousInnerClass.get(new Date());
    // System.out.println(str);
    //匿名内部类继承了date类
    String str = anonymousInnerClass.get(new Date(){
    @Override
    public String toLocaleString() {
    return "hello world";
    }
    });
    System.out.println(str);
    }
    }