java中有几种内部类,Java中的四种内部类
四種內部類
在Java 中,可以將一個類定義在另一個類里面或者一個方法里面,這樣的類稱為內部類。廣泛意義上的 內部類一般來說包括這四種:靜態內部類、匿名內部類、成員內部類和局部內部類,下面我們一一介紹。
目錄
四種內部類
一. 成員內部類
二. 靜態內部類
三.?匿名內部類
四. 局部內部類
一. 成員內部類
成員內部類,顧名思義,是作為對象的一個成員來定義的類。
下面給出代碼例子:
public class Test2 {
public int a = 0;
public double b = 0.0;
//成員內部類
class T1{
public int i;
}
public static void main(String[] args) {
//成員內部類依賴外部類的對象,因為他是一個外部類的一個成員
//T1 t = new T();
Test2 test2 = new Test2();
//這樣也是不行的,沒辦法new T1();
//new T1();
}
}
成員內部類作為外部類的一個屬性是不能脫離外部類實例化的所以可見上面代碼中的 new T() 都無法成功。
二. 靜態內部類
我們直接給出代碼例子
public class Test2 {
public int a = 0;
public double b = 0.0;
//靜態內部類 == 成員內部類 + static
static class T2{
public int i;
}
public static void main(String[] args) {
// 靜態內部類
// 靜態內部類類似于類屬性,可以直接初始化
T2 t2 = new T2();
}
}
靜態內部類 == 成員內部類 + static
靜態內部類相當于外部類的一個類屬性,可以脫離外部類實例,直接初始化。
三.?匿名內部類
匿名內部類的定義,是在一個方法或是代碼塊中定義的類,并且沒有顯示申明類的名稱,比如這樣:
public class Test2 {
public int a = 0;
public double b = 0.0;
public void fun(){
System.out.println("哈哈哈");
}
public void fun1(){
System.out.println(a);
}
public static void main(String[] args) {
// 匿名內部類
// 定義在方法或者代碼塊里
// 這個類沒有名字,是Test2類的一個子類,繼承于Test2
Test2 test2 = new Test2() {
//可以重寫方法
@Override
public void fun(){
System.out.println("內部類");
}
//也可以添加屬性,但是這個屬性想在外部訪問的時涉及向下轉型
//在外部訪問的時候是通過指向父類的引用訪問的
//就不可以向下轉型,因為向下轉型需要子類引用(但是子類的名字不知道)
//所以在外部訪問沒有太大意義
//但是可以在這個類的內部訪問這個屬性
public int c = 1;
//在類內部訪問該屬性
@Override
public void fun1(){
System.out.println("訪問內部類新添加的屬性 c " + c);
}
};
System.out.println("通過內部類訪問外部類的屬性" + test2.a);
//直接外部訪問不可行
//System.out.println(test2.c);
//調用方法在類內部訪問該屬性
test2.fun1();
//調用重寫后的方法
test2.fun();
}
}
參考上面代碼,匿名內部類沒有名字,它是外部類的一個子類,所以它繼承了外部類的所有的屬性和方法。
我們可以在這個內部類中重寫外部類的方法,這是匿名內部類的主要用途。
我們也可以在這個內部類中添加新的屬性和方法,但是在外部訪問就沒有那么容易了。
由于我們不知道內部類的名字,所以無法用內部類引用的類型指向內部類實例(內部類 引用 = new 內部類() 向這樣的代碼無法辦到),所以只能用父類引用指向子類實例,就是所謂的向上轉型,根據 Java 多態的語法,無法用父類的引用訪問到子類新添加的屬性和方法。
我們現在來解釋一下上面的代碼:
匿名內部類是外部類的一個子類,我們在這個內部類中重寫 fun() 和 fun1() 方法,而且添加了新的屬性 c ,
根據 Java 中多態的語法( Test2 test2 = new Test2(){......} 這一句涉及到向上轉型),我們通過指向內部類(這個內部類同時是子類)的引用來調用重寫后的 fun() 和 fun1() 方法,而在 fun1() 中,我們訪問了新添加的屬性,所以代碼的執行結果為:
四. 局部內部類
聯想到局部變量,局部內部類的作用域也是和局部變量類似,是在方法或是代碼塊中定義。
下面給出代碼例子:
public class Test2 {
public int a = 0;
public double b = 0.0;
public void fun(){
System.out.println("哈哈哈");
}
public static void main(String[] args) {
//局部內部類 定義到方法內部作為局部變量
class T3{
//屬性,方法等
public int a = 10;
public void fun(){
System.out.println("hahaha");
}
}
T3 t3 = new T3();
t3.fun();
System.out.println(t3.a);
}
}
局部內部類 定義到方法內部作為局部變量,可以在它的作用域范圍進行實例化。
上面代碼中,我們在類 T3 中寫的一個 fun() 方法,注意這里不是方法重寫,因為 T3 和 Test2 沒有父子關系。
代碼的運行結果為:
今天的分享就到這里,需要重點掌握的是匿名內部類,這在今后的開發中也比較常用。希望大家多多評論,相互提高。
總結
以上是生活随笔為你收集整理的java中有几种内部类,Java中的四种内部类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java spring 上传图片,spr
- 下一篇: php fastcgi_param,ng