當類是定義在其他的類裡面時,可以說它是內部類。
可以定義的位置:
class
構造器
初始化區塊
方法
類只會使用public、default進行權限的修飾。
內部類可以使用4種權限修飾(private 、default 、protected 、public ),並且也可以使用static 將內部類變成靜態。
public class A {
public class B {}
public static class C {}
public A() {
public class D {}
}
{
public class E {}
}
public void method() {
public class F {
void method() {
System.out.println("方法中的局部內部類");
}
}
F f = new F();
f.method(); // 方法中的局部內部類
}
}
當要實例化一個內部類時使用這樣的方式:
public class Test {
public static void main(String[] args) {
A a = A.new B();
A b = new A.C();
}
}
非靜態內部類實例化:A a = A.new B(); ,要記得super class 的型別是放在new 的前面。靜態內部類實例化:A b = new A.C(); ,這邊是使用A. 的方式,因為C 是靜態內部類 ,所以當A 載入時,就已經存在了,只是尚未被實例化。在方法中定義一個局部內部類,並且用一般實例化類的方式後使用類的方法。
public class A {
public void method() {
public class F {
void method() {
System.out.println("方法中的局部內部類");
}
}
F f = new F();
f.method(); // 方法中的局部內部類
}
}
運用多態的概念定義了一個繼承 了B 的匿名類。
public class A {
public void method() {
B b = new B() {
@override
void method() {
System.out.println("方法中的局部匿名內部類1");
}
}
b.method(); //方法中的局部匿名內部類1
}
}
public class B {
void method() {
System.out.println("方法中的局部內部類");
}
}
💡雖然b 看起來好像是B 的類別,但實際上它是透過多態 的方式,繼承了B 的匿名類。
這邊可以看到,在new B() 這個構造器後面加上了{}。
完全匿名,連物件的名稱都沒有。
public class A {
public void method() {
new B() {
@override
void method() {
System.out.println("方法中的局部匿名內部類1");
}
}.method(); //方法中的局部匿名內部類1
}
}
public class B {
void method() {
System.out.println("方法中的局部內部類");
}
}
💡也可以使用這種方式,連物件都不宣告了,直接在匿名類 的後面使用匿名類 中的方法。
一般在開發中較少使用到內部類 的形式,但是匿名類 還是有機會會遇到~~~