該知識點是自己從書籍中學習的筆記。
嵌套類就是在類中定義的類,嵌套類僅僅是爲它的外部類服務的。如果還需要給其他外部的類服務的話,那麼就需要將該嵌套類提升一個層次。目前有四種嵌套套:靜態成員類,非靜態成員類,匿名類,局部類。除第一種類外,其他都可以成爲內部類。
靜態成員類可以看作僅僅是外部類的一個靜態成員,如果靜態成員類被聲明爲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);
}
}