1. 程式人生 > >內部類學習(五)--靜態內部類(Static Inner Class)

內部類學習(五)--靜態內部類(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將會報錯,除非我們把getMinMaxstatic去掉,同時通過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型別的引數。