Nested classes 是指定义在类内部的类,Nested classes分两类:静态与非静态,静态叫static nested classes,非静态的叫inner claess。
class OuterClass {
...
static class StaticNestedClass {
...
}
class InnerClass {
...
}
}
Nested classes是外围类(enclosing classes)的一个成员,所以可以声明为private, protected , public 或 package private(default)。(外围类只能声明为public, 和default)
Java为什么引入Nested classes
- 使类的设计更合理,比如一个类仅在一个地方使用,此时Nested classes更合适
- 使封装性更好
- 可读性和可维护性更好
- 可以补充实现多继承(Thinking in Java 4e P259 Why inner classes)
Anonymous inner classes
Anonymous inner classes定义在方法中,因为没有类名,所以都通过new 直接创建它的实例。在Anonymous inner classes中可以访问外围的所有成员。
Anonymous inner classes:
class Base {
String name;
public Base() { name = "Base"; }
public Base(String name) {this.name = name;}
}
public class AnonymousInnerClasserTest {
public Base createBase(){
//Must be final, refer to relative links in bottom
final String str = "inner";
return new Base() {
void setName(){
this.name = str;
}
};
}
}
Non-final arguments in constructor
public class AnonymousInnerClasserTest {
public Base createBase(){
String str = "inner";
return new Base(str) {
void print() {}
};
}
}
Anonymous constuctor in inner class
public class AnonymousInnerClasserTest {
public Base createBase(){
String str = "inner";
return new Base(str) {
{System.out.println(this.name);}
void print() {}
};
}
}
Static nested classes
static nested classes 不能访问外部成员,因为静态类无法访问非静态成员
Inner class 与static nested classes区别:
- Inner class可以访问外围成员,static nested classes不能
- inner class不能拥有静态成员,static nested classes可以
public class InnerAndNested {
int outer = 10;
//Inner class
private class InnerClass {
//inner class can't have static member, complier error
//static String STRING = "TEST";
//static void test() {}
void print(){
System.out.println(outer);
}
}
//Static nested class
private static class NestedClass {
static String STRING = "TEST";
static void test() {}
//static class can't reference non-static member
void print(){
//System.out.println(outer);
}
}
}
相关链接:
How does java implement inner class closures?
Why inner classes require “final” outer instance variables [Java]?
Cannot refer to a non-final variable inside an inner class defined in a different method