淺談Java內(nèi)部類——靜態(tài)內(nèi)部類
今天來說說Java中的最后一種內(nèi)部類——靜態(tài)內(nèi)部類
所謂的靜態(tài)內(nèi)部類,自然就是用static修飾的內(nèi)部類,那用static修飾過后的內(nèi)部類,跟一般的內(nèi)部類相比有什么特別的地方呢?
首先,它是靜態(tài)的,這就意味著它的創(chuàng)建不依賴于外部類,創(chuàng)建內(nèi)部類的實例不需要像普通內(nèi)部類一樣先創(chuàng)建外部類實例才能創(chuàng)建。
其次,有優(yōu)勢必然有劣勢,它不能像普通內(nèi)部類一樣無限制的訪問外部類的方法和成員變量,只能訪問靜態(tài)成員變量和靜態(tài)方法。
話不多說,先來看個栗子:
public class StaticInnerClass {
//外部類的非靜態(tài)成員
private int numA = 1;
//外部類的靜態(tài)成員
private static int numB = 2;
//靜態(tài)內(nèi)部類
static class Inner {
//內(nèi)部類的非靜態(tài)成員
private int numC = 3;
//內(nèi)部類的靜態(tài)成員
private static int numD = 4;
public void printInner(){
System.out.println("printInner");
System.out.println(numB);//訪問外部類的靜態(tài)成員
System.out.println(numC);//訪問內(nèi)部類的非靜態(tài)成員
System.out.println(numD);//訪問內(nèi)部類的靜態(tài)成員
}
}
//外部類的普通成員方法
public void printOuter(){
System.out.println("printOuter");
}
public static void main(String[] args) {
StaticInnerClass outer = new StaticInnerClass();
outer.printOuter();
Inner inner = new StaticInnerClass.Inner();
inner.printInner();
System.out.println(StaticInnerClass.numB);
System.out.println(Inner.numD);
}
}
輸出如下:
printOuter
printInner
2
3
4
2
4
看起來,內(nèi)部類跟外部類的使用上是差不多的,更像是一個暫存在外部類中的一個類,跟外部類并沒有什么太多本質(zhì)上的聯(lián)系,但是創(chuàng)建的時候需要使用Outer.Inner的方式來定義,就像給類加了一個命名空間一樣。
再舉個栗子來看看靜態(tài)內(nèi)部類和非靜態(tài)內(nèi)部類的區(qū)別:(知乎上看到的一段話,覺得比喻比較形象)
如果把類比喻成雞蛋,內(nèi)部類為蛋,,外部類是蛋殼。那么靜態(tài)類相當(dāng)于熟雞蛋,就算蛋殼破碎(外部類沒有實例化),蛋黃依然完好(內(nèi)部類可以實例化);而非靜態(tài)類相當(dāng)于生雞蛋,蛋殼破碎(無實例化),蛋黃也會跟著xx(不能實例化)。
至于原因?其實就是因為非靜態(tài)內(nèi)部類中保存有外部類的指針,所以可以無限制訪問外部類的所有屬性,而靜態(tài)內(nèi)部類則沒有,所以靜態(tài)內(nèi)部類無法訪問外部類的非靜態(tài)成員和方法,僅僅是借用一下它的殼而已。
再來看一個栗子:
public class Caculate {
//定義一個pair類來將兩個數(shù)捆綁
static class Pair{
private int first;
private int second;
public Pair(int first, int second) {
this.first = first;
this.second = second;
}
public int getFirst() {
return first;
}
public int getSecond() {
return second;
}
}
//獲取一個int數(shù)組中的最大和最小值
public static Pair getMaxMin(int[] values){
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int i:values){
if (min > i) min = i;
if (max < i) max = i;
}
return new Pair(min,max);
}
public static void main(String[] args){
int[] list = {1,3,5,2,77,23,25};
Caculate.Pair pair = Caculate.getMaxMin(list);
System.out.println(pair.getFirst());
System.out.println(pair.getSecond());
System.out.println(pair.first);
System.out.println(pair.second);
}
}
這里getMaxMin里需要一次返回兩個值,所以用了一個Pair類來將兩個數(shù)捆綁到一起,而因為這個類只在Caculate類中使用,而且兩者并沒有依賴關(guān)系,所以這里使用靜態(tài)內(nèi)部類是最合適的。
靜態(tài)內(nèi)部類還有很多適用的場景,這就需要大家在今后的使用中慢慢體會了。
至此,本篇講解完畢,歡迎大家繼續(xù)關(guān)注。
以上就是淺談Java內(nèi)部類——靜態(tài)內(nèi)部類的詳細(xì)內(nèi)容,更多關(guān)于Java 靜態(tài)內(nèi)部類的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
hibernate關(guān)于session的關(guān)閉實例解析
這篇文章主要介紹了hibernate關(guān)于session的關(guān)閉實例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02
Java中優(yōu)先隊列PriorityQueue常用方法示例
這篇文章主要介紹了Java中優(yōu)先隊列PriorityQueue常用方法示例,PriorityQueue是一種特殊的隊列,滿足隊列的“隊尾進、隊頭出”條件,但是每次插入或刪除元素后,都對隊列進行調(diào)整,使得隊列始終構(gòu)成最小堆(或最大堆),需要的朋友可以參考下2023-09-09
獲取Spring的上下文環(huán)境ApplicationContext的最簡單方式
這篇文章主要介紹了獲取Spring的上下文環(huán)境ApplicationContext的最簡單方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08

