柚子快報邀請碼778899分享:Java之內部類
柚子快報邀請碼778899分享:Java之內部類
目錄
實例內部類
靜態(tài)內部類
局部內部類
匿名內部類
下面將講解實例內部類,靜態(tài)內部類,局部內部類和匿名內部類。
實例內部類
實例內部類(也稱為非靜態(tài)內部類)依賴于外部類的實例。這意味著,要創(chuàng)建實例內部類的實例,你必須先創(chuàng)建外部類的實例。實例內部類可以訪問外部類的所有成員(包括私有成員),而不需要任何特殊條件。
1.如何獲取實例內部類?
? ?獲取實例內部類對象依賴于外部類對象,通過 new 外部類.new 內部類
? ?或者外部類.new 內部類。
2.在實例內部類中,可以定義被final修飾的靜態(tài)的成員變量,例如public static final int x=6;
? ?但是不能定義沒有被final修飾的靜態(tài)的成員變量,例如public static?int x=6。
解釋:
? ?因為x被final修飾,此時x為常量,類加載的時候不回家住普通的成員變量,實例內部類中
? ?又存在static,而static是在類加載的時候創(chuàng)建的。
3.當外部類中的數(shù)據(jù)成員和內部類中的數(shù)據(jù)成員一樣的時候,如何在內部類中訪問外部類中同名的成員,通過? ? 外部類.this.? 來進行訪問。
class OuterClass {
//
public int data1 = 1;
private int data2 = 2;
public static int data3 = 3;
class InnerClass {
public int data1 = 1111;
public int data4 = 4;
private int data5 = 5;
public static final int data6 = 6;
public void test() {
System.out.println(this.data1);
System.out.println(OuterClass.this.data1);
System.out.println(data4);
System.out.println(data5);
System.out.println("內部類的test方法");
}
}
public void test() {
System.out.println("外部類的test方法");
InnerClass innerClass = new InnerClass();
System.out.println(innerClass.data4);
}
}
public class Test {
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
//System.out.println(outerClass.data1);
//獲取實例內部類對象的時候 依賴于外部類對象
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
innerClass.test();
//上面的outerClass.new InnerClass()是new OuterClass().new InnerClass()的簡化形式
OuterClass.InnerClass innerClass2 = new OuterClass().new InnerClass();
innerClass2.test();
}
}
靜態(tài)內部類
靜態(tài)內部類不依賴于外部類的實例。它類似于外部類中的其他靜態(tài)成員,可以通過外部類名直接訪問(如果它是public或protected的)。
1.如何獲取靜態(tài)內部類對象
? ?通過new? 外部類類名.內部類? ? 的方式來獲取。
2.如何在靜態(tài)內部類中訪問外部類的非靜態(tài)的成員
? ?通過在內部類中new創(chuàng)建一個外部類對象,然后通過? ?外部類.成員? ? 的方式來訪問。
class OuterClass2 {
public int data1 = 1;
private int data2 = 2;
public static int data3 = 3;
static class InnerClass {
//public int data1 = 111;
public int data4 = 4;
private int data5 = 5;
public static int data6 = 6;
public void test() {
OuterClass2 outerClass2 = new OuterClass2();
System.out.println(outerClass2.data1);
System.out.println(data3);
System.out.println(data4);
System.out.println(data5);
System.out.println(data6);
System.out.println("內部類的test方法");
}
}
}
public class Test1 {
public static void main(String[] args) {
OuterClass2.InnerClass innerClass = new OuterClass2.InnerClass();
innerClass.test();
}
}
局部內部類
局部內部類是定義在方法、構造器或初始化塊內部的類。局部內部類只能在其定義的作用域內被訪問,并且不能包含靜態(tài)成員。局部內部類可以訪問其外部類的所有成員以及定義它的方法或構造器中的局部變量(但局部變量必須是final或實際上是final的,從Java 8開始,這個限制放寬,只要局部變量是effectively final即可)。
public void func() {
class Inner {
public int data1 = 1;
}
Inner inner = new Inner();
System.out.println(inner.data1);
}
匿名內部類
匿名內部類是沒有名稱的內部類,它通常用于簡化代碼。它通常用于實現(xiàn)接口或繼承其他類(只能繼承非抽象類)的匿名子類。由于它沒有名稱,因此你不能直接引用它。匿名內部類常用于只使用一次的簡單對象。
interface A {
void test();
}
public class Test2 {
public static void main(String[] args) {
int val = 10;
//val = 100;
A a = new A(){
@Override
public void test() {
//默認在這里能訪問的是 被final修飾的
System.out.println("值:"+ val);
//在匿名內部類當中 能夠訪問的是 沒有被修改過的數(shù)據(jù)-->變量的捕獲
}
};
a.test();
System.out.println(val);
}
}
柚子快報邀請碼778899分享:Java之內部類
參考閱讀
本文內容根據(jù)網絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉載請注明,如有侵權,聯(lián)系刪除。