[Java] 内部类

1. 创建内部类

创建内部类的方式就是把类的定义置于外围类的里面,例如:

class Test1 {
  class Test2 {
    private int i = 1;
    public void value() {
      System.out.println(i);
    }
  }
  public void f() {
      Test2 t = new Test2();
      t.value();
  }
}
public class Main {
  public static void main(String[] args) {
    Test1 t = new Test1();
    t.f();
  }
}

更典型的情况是外部类将有一个方法,返回一个指向内部类的引用,例如:

class Test1 {
  class Test2 {
    private int i = 1;
    public void value() {
      System.out.println(i);
    }
  }
  public Test2 f() {
      return new Test2();
  }
}
public class Main {
  public static void main(String[] args) {
    Test1 t1 = new Test1();
    Test1.Test2 t2 = t1.f();
    t2.value();
  }
}


2. .this与.new

如果需要生成对外部类对象的引用,可以使用外部类的名字后紧跟.this,这样产生的引用自动地具有正确的类型,例如:

class Test1 {
  class Test2 {
    public Test1 outer() {
      return Test1.this;
    }
  }
  public Test2 inner() {
    return new Test2();
  }
  public void f() {
    System.out.println("Hello World!");
  }
}
public class Main {
  public static void main(String[] args) {
    Test1 t1 = new Test1();
    Test1.Test2 t2 = t1.inner();
    t2.outer().f();
  }
}

有时可能想要告知某些其他对象去创建其某个内部类的对象,必须在new表达式中提供对其他外部类对象的引用,这时需要.new,例如:

class Test1 {
  class Test2 {
    public void f() {
        System.out.println("Hello World!");
    }
  }
}
public class Main {
  public static void main(String[] args) {
    Test1 t1 = new Test1();
    Test1.Test2 t2 = t1.new Test2();
    t2.f();
  }
}

在拥有外部类之前是不能创建内部类对象的,但是如果创建的是嵌套类(静态内部类),那么它就不需要对外部类对象的引用,例如:

class Test1 {
  static class Test2 {
    public void f() {
        System.out.println("Hello World!");
    }
  }
}
public class Main {
  public static void main(String[] args) {
    Test1.Test2 t = new Test1.Test2();
    t.f();
  }
}


3. 局部内部类

在方法的作用域内创建一个完整的类,这被称作局部内部类,它在方法之外是不能访问的,例如:

class Test1 {
  void f() {
    System.out.println("Hello World");
  }
}
class Test2 {
  void inner() {
    class Test3 extends Test1 {}
    Test3 t = new Test3();
    t.f();
  }
}
public class Main {
  public static void main(String[] args) {
    Test2 t = new Test2();
    t.inner();
  }
}


4. 匿名内部类

匿名内部类没有名字,不能直接引用它,只能在创建时作为new的一部分来声明。要使用匿名内部类,必须继承一个父类或实现一个接口,例如:

abstract class Test1 {
  abstract void f();
}
class Test2 {
  public Test1 inner() {
    return new Test1() {
      public void f() {
        System.out.println("Hello World");
      }
    };
  }
}
public class Main {
  public static void main(String[] args) {
    Test2 t2 = new Test2();
    Test1 t1 = t2.inner();
    t1.f();
  }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章