1. 程式人生 > 其它 >自學java第二十二天

自學java第二十二天

Java內部類的分類和定義格式
1. 成員內部類
修飾符 class 外部類名稱{
修飾符 class 內部類名稱{
//...
}
//...
}
例項化內部類
Outer.Inner obj = new Outer().new Inner();
obj.methodInner();
如果出現了重名現象,格式為:
外部類名稱.this.外部類成員變數名
外部類名稱.this.成員方法名
注意不是super關鍵字,成員內部類不是子類
public class Outer {
int num = 10;

public class Inner {
int num = 20;

public void methodInner() {
int num = 30;
System.out.println(num);//30
System.out.println(this.num);//20
System.out.println(Outer.this.num);//10
}
}
}
2. 區域性內部類
修飾符 class 外部類名稱{
修飾符 返回值型別 外部類方法名(引數列表){}
class 區域性內部類名稱{
//...
}
}
//...
}
外部類方法中需要對內部類例項化才可以使用,不能到外面使用,看下面例子
public class Outer {
int num = 10;

public void methodInner() {
class Inner{
int num = 20;
public void methodInner(){
System.out.println(num);
}
}
Inner obj = new Inner();
obj.methodInner();
}
}
public class Demo05Main {
public static void main(String[] args) {
Outer obj = new Outer();
obj.methodInner();
}
}
如果區域性內部類想要訪問成員方法的區域性變數,那麼這個區域性變數必須是有效final的
從Java 8開始只要區域性變數實施不變,那麼final關鍵字可以省略。
原因:

new出來的物件存在堆記憶體中
區域性變數是跟著方法走的,在棧記憶體中
方法執行結束後,方法立即處棧,區域性變數就會立即消失
但是new出來的物件會在堆記憶體中持續存在,知道垃圾回收消失
類的許可權修飾符
public > protected > (default) > private

定義一個類的時候,許可權修飾符規則:
**外部類:**public /(default)
**成員內部類:**public > protected > (default) > private
**區域性內部類:**什麼都不能寫,但也不是default