內部類學習(五)--靜態內部類(Static Inner Class)

來源:互聯網
上載者:User

這裡介紹最後一種比較特殊的內部類――靜態內部類(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

{

public   cn.edu.hust.cm.test.FindMinMax$Pair(double, double);

public  double  getSecond();

public  double  getFirst();

private  double  first;

private  double  second;

}

很清楚的看到,編譯器沒有給我們自動加上一個reference,指向產生它的那個外部類的對象,也沒有給構造方法加上一個FindMinMax型別的參數。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.