该知识点是自己从书籍中学习的笔记。
嵌套类就是在类中定义的类,嵌套类仅仅是为它的外部类服务的。如果还需要给其他外部的类服务的话,那么就需要将该嵌套类提升一个层次。目前有四种嵌套套:静态成员类,非静态成员类,匿名类,局部类。除第一种类外,其他都可以成为内部类。
静态成员类可以看作仅仅是外部类的一个静态成员,如果静态成员类被声明为private的,那么该类就只能够在外部类的内部中使用。静态成员类只能够访问外部类的静态变量和静态方法。
public class StaticMemberClassTest {
private static int a;
private static class StaticMemberClass {
public void doMethod1() {
System.out.println("doMethod1. a=" + a);
}
}
public void doMethod() {
StaticMemberClass s = new StaticMemberClass();
s.doMethod1();
System.out.println("doMethod.");
}
public static void main(String[] args) {
StaticMemberClassTest s = new StaticMemberClassTest();
s.doMethod();
}
}
非静态成员类可以通过“外部类名.this.变量”来访问外部类的静态变量,方法则是直接访问外部类的方法;如果外部类的方法要访问非静态成员类,则需要生成一个非静态成员变量的实例。
public class NoStaticMemberClassTest {
private int a = 2;
class NoStaticMemberClass {
public void doMethod1() {
int a = 3;
doMethod();
System.out
.println("doMethod1. a=" + NoStaticMemberClassTest.this.a);
}
}
public void doMethod() {
System.out.println("doMethod");
}
public static void main(String[] args) {
NoStaticMemberClassTest n = new NoStaticMemberClassTest();
n.doMethod();
NoStaticMemberClass nsmc = new NoStaticMemberClassTest().new NoStaticMemberClass();
nsmc.doMethod1();
}
}
匿名类不是外部类的一个成员,匿名类没有类名,匿名类的使用和实例化仅仅是在那个点上。
public class AnonymousClassTest {
public static void main(String[] args) {
Thread a = new Thread(new Runnable() {
@Override
public void run() {
}
});
}
}
局部类是放在方法中的,不访问外部类方法中的局部变量,除非变量被声明为final的。
public class LocalClassTest {
private int a = 2;
public void method() {
final int b = 3;
class LocalClass {
public void method1() {
System.out.println("method1. b=" + b);
}
}
LocalClass l = new LocalClass();
l.method1();
}
public static void main(String[] args) {
LocalClassTest l = new LocalClassTest();
l.method();
System.out.println(l.a);
}
}