- 內部類的重要知識
1.不能直接在主方法裏調用內部類的方法或者屬性
class Outer{
private int a=1;
class Inner{
public void Info(){
System.out.println(a);
}
}
}
class ListSetMap {
public static void main(String[] args) {
new Outer.Inner().Info(); //這樣編譯不通過的
}
}
會報錯
---------- 編譯javac ----------
ListSetMap.java:12: 錯誤: 需要包含Outer.Inner的封閉實例 new Outer.Inner().Info(); //這樣是錯誤的寫法 ^ 1 個錯誤
不是靜態類,因此不能使用“外部類.內部類”的形式。
所以只能通過調用外部類的來調用內部類的方法
class Outer{
private int a=1;
class Inner{
private int b=0; //定義b
public void Info(){
System.out.println(a);
}
}
public void fun()
new Inner().Info(); //生成Inner對象調用方法
System.out.println(new Inner().b); //繼續訪問private int b
}
}
class ListSetMap {
public static void main(String[] args) {
new Outer().fun(); //調用外部類的方法調用內部類
}
}
- 使用static來聲明內部類(即可直接調用)-->解決上面的辦法
class Outer{
private static int a=1;
static class Inner{
public void Info(){
System.out.println(a);
}
}
}
class ListSetMap {
public static void main(String[] args) {
new Outer.Inner().Info();
}
}
輸出 1
- 在外部訪問內部類
對於上面的static方法來訪問內部類,那還有下面這種方法來調用內部類的方法或者屬性
class Outer{
private int a=1; //封裝變量
class Inner{
public void Info(){
System.out.println(a);
}
}
}
class ListSetMap {
public static void main(String[] args) {
Outer out=new Outer(); //實例化外部類對象
Outer.Inner in=out.new Inner(); //實例化內部類對象
in.Info(); //調用內部類的方法
}
}
輸出 1
- 還能在方法中定義內部類
class Outer{
private int a=1;
public void fun(){ //此處若有參數 必須使用final定義
class Inner{
public void Info(){
System.out.println(a);
}
}
new Inner().Info(); //實例化內部對象
}
}
class ListSetMap {
public static void main(String[] args) {
new Outer().fun();
}
}
輸出 1