柚子快報激活碼778899分享:開發(fā)語言 【Java】內(nèi)部類
柚子快報激活碼778899分享:開發(fā)語言 【Java】內(nèi)部類
認(rèn)識內(nèi)部類:Java中內(nèi)部類分如下三種
匿名內(nèi)部類
實例內(nèi)部類
靜態(tài)實例內(nèi)部類
匿名內(nèi)部類
匿名內(nèi)部類顧名思義就是在創(chuàng)建的時候不用賦予名字。
代碼演示:
//匿名內(nèi)部類
interface IA{
void test();
}
public class Main{
public static void main(String[] args) {
new IA(){
@Override
public void test() {
System.out.println("hallo World");
}
}.test();
}
}
我們定義了一個接口 IA 接著我們在 Main 方法中實例化了該接口,但沒有用引用來接收該接口,這就表示內(nèi)部類,接著我們在內(nèi)部類中重寫了 test 方法,并且在最后調(diào)用了該方法。
運行截圖:
實例內(nèi)部類
我們在一個類中定義的變量和方法都叫做實例成員和實例方法,顧名思義定義在一個類中的類就被稱作為實例內(nèi)部類。
代碼演示:
class OutClass{
public int data1 = 1;
private int data2 = 2;
public static int data3 = 3;
class InnerClass{
public int data4 = 4;
private int data5 = 5;
public void test(){
System.out.println("內(nèi)部類的test方法");
}
}
public void test(){
System.out.println("外部類的test方法");
}
}
public class Main{
public static void main(String[] args) {
//獲取實例內(nèi)部類時,要依賴外部類
OutClass outclass = new OutClass();
OutClass.InnerClass innerclass = outclass.new InnerClass();
OutClass.InnerClass innerclass2 = new OutClass().new InnerClass();
innerclass2.test();
innerclass.test();
}
}
我們在 OutClass 類中定義了另外一個類 InnerClass ,在內(nèi)部類中同樣也可以擁有成員權(quán)限修飾符修飾的變量和方法。
既然定義了一個類,那么必然就可以實例化,這里我們實例化內(nèi)部類有兩種方法:
//獲取實例內(nèi)部類時,要依賴外部類
//第一種
OutClass outclass = new OutClass();
OutClass.InnerClass innerclass = outclass.new InnerClass();
//第二種
OutClass.InnerClass innerclass2 = new OutClass().new InnerClass();
我們在實例化內(nèi)部類的時候必須要依靠外部類,也就是說我們先要實例化外部類,再實例化內(nèi)部類。
上述代碼的運行截圖:
?
我們可以看出兩種實例化都可行。
在內(nèi)部類中我們能否有 static 修飾的成員?我們在編譯器中試試看
我們發(fā)現(xiàn)報錯了,為什么呢?我們知道被 static 修飾的成員就會變得不依靠實例,但是我們在實例化內(nèi)部類的時候必須要依靠外部類的實例,很明顯沖突了!
但是我們可以有 final 修飾的成員。
這時就不報錯了!
如果在外部類和內(nèi)部類中有同名的成員,那么如何在內(nèi)部類中訪問外部類的成員。
class OutClass{
public int data1 = 1;
private int data2 = 2;
public static int data3 = 3;
class InnerClass{
public int data4 = 4;
private int data5 = 5;
public int data1 = 6;
public void test(){
System.out.println(OutClass.this.data1);
}
}
public void test(){
}
}
public class Main{
public static void main(String[] args) {
OutClass.InnerClass innerclass2 = new OutClass().new InnerClass();
innerclass2.test();
}
}
運行截圖:
使用 外部類類名.this.重名成員?就可以在內(nèi)部類中訪問外部類的重名成員。
在外部類中是不能直接訪問內(nèi)部類中的成員,如果要訪問就必須要實例化內(nèi)部類。
代碼演示:
class OutClass{
public int data1 = 1;
private int data2 = 2;
public static int data3 = 3;
class InnerClass{
public int data4 = 4;
private int data5 = 5;
public int data1 = 6;
public void test(){
System.out.println(OutClass.this.data1);
}
}
public void test(){
InnerClass innerclass = new InnerClass();
System.out.println(innerclass.data4);
}
}
public class Main{
public static void main(String[] args) {
OutClass outclass = new OutClass();
outclass.test();
}
}
靜態(tài)實例內(nèi)部類
代碼示例:
class OutClass{
private int data1 = 1;
public int data2 = 2;
public static int data3 = 3;
static class InnerClass{
private int data4 = 4;
public int data5 = 5;
public static int data6 = 6;
}
}
public class Main{
public static void main(String[] args) {
OutClass.InnerClass innerclass = new OutClass.InnerClass();
System.out.println(innerclass.data5);
}
}
運行結(jié)果:
我們在實例化靜態(tài)內(nèi)部類的時候就不需要依靠外部內(nèi)部類的實例了,就變得方便了許多。
我們可以看到在靜態(tài)內(nèi)部類中定義成員變量用了 static 修飾,是的靜態(tài)內(nèi)部類可以用 static 修飾,因為靜態(tài)內(nèi)部類的實例化不依靠外部類的實例。
在靜態(tài)內(nèi)部類中是無法直接訪問外部類的成員,并且外部類也無法直接訪問靜態(tài)內(nèi)部類的成員,都必須借助實例化才能訪問。
柚子快報激活碼778899分享:開發(fā)語言 【Java】內(nèi)部類
推薦文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。