更多 Java 基礎知識方面的文章敬矩,請參見文集《Java 基礎知識》
成員內部類 member inner class
- 在類的內部
- 可以訪問外部類的所有屬性,包括 static 和 final蠢挡,因此可以修改外部類
如下所示:
- 內部類 Inner 可以訪問外部類 Outer 的成員變量
i
- 外部類 Outer 可以使用內部類 Inner
- 如果想在其他地方使用內部類 Inner弧岳,需要通過外部類的對象來訪問
public class InnerClass_Test {
public static void main(String[] args) {
Outer outer = new Outer();
outer.f1();
// 如果想在其他地方使用內部類 Inner,需要通過外部類的對象來訪問
// Outer.Inner inner = new Outer.Inner() 編譯錯誤
Outer.Inner inner = outer.new Inner();
inner.f2();
}
}
class Outer {
private int i = 1;
public void f1() {
// 外部類 Outer 可以使用內部類 Inner
Inner i = new Inner();
i.f2();
}
// 內部類 Inner 可以訪問外部類 Outer 的成員變量
class Inner {
public void f2() {
i = 2;
}
}
}
局部內部類 local inner class
- 在類的方法的內部定義并使用
- 不能在方法的外部訪問內部類
- 內部類只能訪問方法中的 final 變量业踏,不能訪問方法外的變量
例如:
public class InnerClass_Test {
public static void main(String[] args) {
Outer outer = new Outer();
outer.f1();
}
}
class Outer {
public void f1() {
// 在類的方法的內部
class Inner {
public void f2() {
// do something
}
}
Inner i = new Inner();
i.f2();
}
}
匿名內部類 anonymous inner class
繼承式
public class InnerClass_Test {
public static void main(String[] args) {
Car c = new Car() {
public void f() {
System.out.println("This is BMW");
}
};
c.f();
}
}
class Car {
public void f() {
System.out.println("This is car");
}
}
接口式
public class InnerClass_Test {
public static void main(String[] args) {
Run r = new Run() {
public void f() {
System.out.println("This is BMW running");
}
};
r.f();
}
}
interface Run {
void f();
}
參數(shù)式
public class InnerClass_Test {
public static void main(String[] args) {
invoke(new Car() {
public void f() {
System.out.println("This is BMW");
}
});
}
public static void invoke(Car c) {
c.f();
}
}
class Car {
public void f() {
System.out.println("This is car");
}
}
靜態(tài)嵌套類 static nested class
- 與成員內部類不同禽炬,在外部使用靜態(tài)嵌套類,不需要通過外部類的對象來訪問勤家。
public class InnerClass_Test {
public static void main(String[] args) {
// 在外部使用靜態(tài)嵌套類腹尖,不需要通過外部類的對象來訪問
Outer.Nested_Outer n = new Outer.Nested_Outer();
n.f();
}
}
class Outer {
static class Nested_Outer {
public void f() {
System.out.println("This is nested class");
}
}
}