Java語法——內部類(JDK 1.1)
內部類概念
Java類中的組成有:構造器、字段(成員變量)、方法(成員方法)、內部類(成員內部類、匿名內部類和局部內部類)、語句塊。除了構造器外,其他四種組成都有靜態的(又稱“類的”)和非靜態的(又稱“實例的”)兩類。相應地,使用一個類的成員有兩種方式,一是類名.靜態成員
(操作類),二是new 構造器().實例成員
(操作對象)。
類的成員(member)指成員變量(memberVariable)、成員方法(memberMethod)和成員內部類(memberInner)。靜態成員是對類的初始化,構造器是對類的對象的初始化。實例成員中可以使用靜態成員,但靜態成員中不可以直接使用實例成員(通過構造器new出對象後纔可使用)。
Java類之間的交互:
一個類中使用到其他類的地方有:構造器、成員方法、語句塊。
一個類中可以被其他類使用的組成有:成員變量、成員方法、成員內部類。
一般情況,我們把類定義成獨立的單元。有些情況下,我們把一個類放在另一個類的內部定義,稱爲內部類(innerclasses)。內部類具體分爲成員內部類(非靜態內部類、靜態內部類)、匿名內部類、局部內部類。成員內部類是靜態的還是實例的,取決於外部類以外的地方使用成員內部類時,是否需要通過外部類對象,若需要則是實例的,若不需要則是靜態的。
內部類可以使用public、default、protected 、private以及static修飾。而外部頂級類(我們以前接觸的類)只能使用public和default修飾。
內部類只是一個編譯時概念,一旦我們編譯成功,就會成爲完全不同的兩個類。對於一個名爲Outer的外部類和其內部定義的名爲Inner的內部類。編譯完成後會出現Outer.class和Outer$Inner.class兩個類的字節碼文件。
代碼說明
非靜態內部類
/**
* 外部類以外的類
*/
class Test{
public static void main(String[] args) {
// 外部類以外的地方 訪問 非靜態內部類的實例成員
Outer.Inner inner = new Outer().new Inner();
inner.innerInstanceMethod();
int a = inner.innerInstanceField;
}
}
/**
* 外部類
*/
class Outer {
private int outerInstanceField;
private static int outerStaticField;
public void outerInstanceMethod(){
// 外部類實例成員中 訪問 非靜態內部類的實例成員
Inner inner = new Inner();
inner.innerInstanceMethod();
int b = inner.innerInstanceField;
}
public static void outerStaticMethod(){
// 外部類靜態成員中 不能訪問 非靜態內部類的實例成員!
// 非靜態內部類對象的創建,依賴外部類的對象,因此非靜態內部類的對象不能在外部類的靜態成員中創建
// Inner inner = new Inner();
// inner.innerInstanceMethod();
// int b = inner.innerInstanceField;
}
/**
* 非靜態內部類
*/
public class Inner {
public int innerInstanceField;
public void innerInstanceMethod(){
// 非靜態內部類實例成員中 訪問 外部類靜態成員
outerStaticMethod();
int a = outerStaticField;
// 非靜態內部類實例成員中 訪問 外部類實例成員
Outer outer = new Outer();
outer.outerInstanceMethod();
int b = outer.outerInstanceField;
}
} // end Inner{}
} // end Outer{}
靜態內部類
/**
* 外部類以外的類
*/
class Test{
public static void main(String[] args) {
// 外部類以外的地方 訪問 靜態內部類的靜態成員
Outer.Inner.innerStaticMethod();
int b = Outer.Inner.innerStaticField;
// 外部類以外的地方 訪問 靜態內部類的實例成員
Outer.Inner inner = new Outer.Inner();
inner.innerInstanceMethod();
int a = inner.innerInstanceField;
}
}
/**
* 外部類
*/
class Outer {
private int outerInstanceField;
private static int outerStaticField;
public void outerInstanceMethod(){
// 外部類實例成員中 訪問 靜態內部類的靜態成員
Inner.innerStaticMethod();
int a = Inner.innerStaticField;
// 外部類實例成員中 訪問 靜態內部類的實例成員
Inner inner = new Inner();
inner.innerInstanceMethod();
int b = inner.innerInstanceField;
}
public static void outerStaticMethod(){
// 外部類靜態成員中 訪問 靜態內部類的靜態成員
Inner.innerStaticMethod();
int a = Inner.innerStaticField;
// 外部類靜態成員中 訪問 靜態內部類的實例成員
Inner inner = new Inner();
inner.innerInstanceMethod();
int b = inner.innerInstanceField;
}
/**
* 靜態內部類
*/
public static class Inner {
public int innerInstanceField;
public static int innerStaticField;
public void innerInstanceMethod(){
// 靜態內部類實例成員中 訪問 外部類靜態成員
outerStaticMethod();
int a = outerStaticField;
// 靜態內部類實例成員中 訪問 外部類實例成員
Outer outer = new Outer();
outer.outerInstanceMethod();
int b = outer.outerInstanceField;
}
public static void innerStaticMethod(){
// 靜態內部類靜態成員中 訪問 外部類靜態成員
outerStaticMethod();
int a = outerStaticField;
// 靜態內部類靜態成員中 訪問 外部類實例成員
Outer outer = new Outer();
outer.outerInstanceMethod();
int b = outer.outerInstanceField;
}
} // end Inner{}
} // end Outer{}
匿名內部類
/**
* 外部類以外的類
*/
class Test {
public static void main(String[] args) {
Outer outer = new Outer();
outer.inner.greet();
outer.inner.greetSomeone("cty");
}
} // end Test{}
/**
* 匿名內部類接口
*/
interface HelloWorld {
void greet();
void greetSomeone(String name);
} // end HelloWorld{}
/**
* 外部類
*/
class Outer {
/**
* 匿名內部類
* 通過實現接口來創建,適用於類只使用一次的場景
* 匿名內部類沒有訪問修飾符,沒有構造方法(類名都沒有,何來構造方法)
*/
HelloWorld inner = new HelloWorld() {
String name = "world";
@Override
public void greet() {
greetSomeone(name);
}
@Override
public void greetSomeone(String name) {
this.name = name;
System.out.println("Hello " + name);
}
}; // 不要忘記分號!
} // end Outer{}
/**
* Hello world
* Hello cty
*/
局部內部類
/**
* 外部類以外的類
*/
class Test {
public static void main(String[] args) {
new Outer().greet();
}
} // end Test{}
/**
* Hello World
*/
/**
* 外部類
*/
class Outer {
public void greet(){
/**
* 局部內部類
* 僅在greet方法的作用域下有效
*/
class Inner {
public void helloWorld(){
System.out.println("Hello World");
}
} // end Inner{}
new Inner().helloWorld();
} // end greet()
} // end Outer{}
運行環境
- jdk-1.7
- Intellij IDEA 2019.3
參考
[1] 內部類的分類