Java允许在类的内部声明一个嵌套类,要么是非静态内部类,要么是静态内部类
嵌套类是其所在的外部类的一个成员属性,非静态嵌套类(inner class)可以访问其所在外部类的所有成员,包括private修饰的,静态嵌套类无法访问其外部类实例的成员
内部类
内部类只能存在于外部类的实例中,它可以访问外部类实例的所有私有变量。静态内部类只能访问外部类的静态成员
class Test {
public static void main(String[] args) {
/* 非静态内部类只能存在于外部类的实例中 - 所以要先实例化一个外部类实例 */
Test test = new Test();
Test.innerClass inner = test.new innerClass();
inner.setName("world");
System.out.println(inner.getName());
/* 静态内部类可以直接访问(如果访问修饰符合适的话) */
Test.StaticInnerClass staticInner = new Test.StaticInnerClass();
System.out.println(staticInner.getName());
}
private String name = "hello";
private static String sName = "hello";
public class innerClass {
public String getName() {
/* 非静态内部类中使用 外部类名.this 来引用外部类实例 */
return Test.this.name;
}
public void setName(String name) {
Test.this.name = name;
}
}
public static class StaticInnerClass {
public String getName() {
return Test.sName;
}
}
}
本地类或匿名类
除了在类内部定义嵌套类外,甚至还可以在块(如方法体)内声明嵌套类,这种嵌套类叫做本地类或匿名类(如果没有类名的话)。
本地类可以访问其所在外部类的成员。本地类还能访问块内的本地变量,但是这个本地变量必须是final或者effectively final
effectively final是指“某个变量虽然没有使用final修饰符,但它的值自初始化后就再也没有被更改过”
本地类的使用和内部类是类似的
匿名类其实就是表达式,即通过表达式来创建了类并实例化了对象。它的使用同构造函数类似,只是它包含了类的实现
class AnonymouseClass {
interface HelloWorld {
public void sayHi();
}
public void sayHello() {
HelloWorld chineseSay = new HelloWorld() {
public void sayHi() {
System.out.println("你好");
}
};
chineseSay.sayHi();
}
}