內部類學習(五)--靜態內部類(Static Inner Class)
這裡介紹最後一種比較特殊的內部類――靜態內部類(Static Inner Class),即在內部類的前面增加了static修飾符(modifier)。注意,僅僅只有內部類能夠被宣告為static型別,通常我們宣告一個普通類的時候不能使用static,否則編譯出錯。
那麼為什麼我們要使用靜態的內部類呢?在什麼情況下我們需要使用靜態的內部類呢?我們前面講過,編譯器會自動給內部類加上一個reference,指向產生它的那個外部類的物件,如果不想要或者說不需要這個reference,那麼我們就可以把這個內部類宣告為static,禁止這個reference的產生。除此之外靜態類的使用與普通的靜態類是一樣的。例子如下:
package cn.edu.hust.cm.test;
public class StaticInnerClassTest {
public StaticInnerClassTest() {
super();
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
// TODO Auto-generated method stub
double d[]=new double[20];
for(int i=0;i<d.length;i++)
d[i]=100*Math.random();
//FindMinMax test=new FindMinMax();
FindMinMax.Pair pair=FindMinMax.getMinMax(d);
System.out.println("最小值是:"+pair.getFirst());
System.out.println("最大值是:"+pair.getSecond());
}
}
class FindMinMax{
static double min=Double.MAX_VALUE;
static double max=Double.MIN_VALUE;
public static Pair getMinMax(double d[]){
for(double value:d){
if(min>value) min=value;
if(max<value) max=value;
}
return new Pair(min,max);
}
public static class Pair{
public Pair(double first,double second){
this.first=first;
this.second=second;
}
public double getFirst(){
return this.first;
}
public double getSecond(){
return this.second;
}
private double first;
private double second;
}
}
在這個例子中之所以要用靜態內部類,主要是因為getMinMax這個方法是靜態的,由類直接呼叫。而前面說過建立內部類的時候語法是這樣的:
OuterClassObject.new InnerClassName(),如果省略了OuterClassObject則是
this. new InnerClassName(),OuterClassObject或者this指代建立這個內部類物件的一個外部類物件,是一個隱式引數,它將傳入內部類的構造方法(見前所述)。但是現在這個內部類物件是由“類”直接建立的,不會產生這樣的一個隱式引數傳入內部類構造方法,因此內部類也就不需要“編譯器自動給內部類加上一個reference,指向產生它的那個外部類的物件”,所以我們把這個內部類宣告為static。上面的程式碼中如果我們去掉static將會報錯,除非我們把getMinMax的static去掉,同時通過FindMinMax的一個例項來呼叫這個方法,如下:
FindMinMax test=new FindMinMax();
test.getMinMax(d);
我們下面來對內部類所產生的class檔案反射(reflection)一下,結果如下:
class cn.edu.hust.cm.test.FindMinMax$Pair
{
publiccn.edu.hust.cm.test.FindMinMax$Pair(double, double);
publicdoublegetSecond();
publicdoublegetFirst();
privatedoublefirst;
privatedoublesecond;
}
很清楚的看到,編譯器沒有給我們自動加上一個reference,指向產生它的那個外部類的物件,也沒有給構造方法加上一個FindMinMax型別的引數。