在Java中不能Top class定义为static, 只有Nested classes才可以为static。 在Java里有四种,主要使用两种Nested Class,一种是Static Nested也被叫做静态嵌套类;另一种是Non Static Nested也被叫做普通内部类(Inner Class) 。
Static nested classes
获取方式:
- OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass(); OuterClass的一个实例中可以有多个Static nested classes存在。
public class OuterClass {
private static int a = 1;
private int b=2;
/**
* public 修饰后可以在OuterClass的外部使用;
* private 后只能在OuterClass中使用
*/
private static class InnerClass {
private static int b=3;
public void execute() {
System.out.println(a + b);
}
}
public static void main(String[] args) {
InnerClass a = new InnerClass();
a.execute();
}
}
Non-Static nested classes(inner classes)
获取方式:
- OuterClass.InnerClass innerClass = outerObject.new InnerClass(); OuterClass一个实例只能存在一个innerClass的实例。也叫做enclosing instance
public class OuterClass {
private int a=1;
private int b=2;
class Inner{
private int a=3;
public void method() {
System.out.println(a);
System.out.println(OuterClass.this.a);
System.out.println(b);
}
}
public static void main(String[] args) {
Inner inner = new OuterClass().new Inner();
inner.method();
}
}
local inner classes
这种是定义在方法内部的, 所以也被叫做Method local inner class。 类似于局部变量,不能定义为public,protected,private或者static类型。 定义方法中,只能方法中声明为final类型的变量。
public class OuterClass {
public static void main(String[] args) {
new OuterClass().method();
}
void method() {
/**
* 如果在OuterClass有'Local'的inner class, 要想使用该处的Local必须在声明后实例使用
*/
class Local {
void method() {
System.out.println("Local");
}
}
new Local().method();
}
}
anonymous inner classes
- 永远不能为abstract
- 隐含是final的
- 是一个local inner class并且不是静态的。
获取方式:
- new ParentClassName(constructorArgs) {members}
- new InterfaceName() {members}
public class OuterClass {
public void print( Date date ) {
System.out.println( date );
}
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
outerClass.print( new Date() {
public String toString() {
return "ParentClassName anonymous ";
}
});
new Runnable() {
@Override
public void run() {
System.out.println("InterfaceName anonymous");
}
}.run();
}
}