靜態方法、靜態變量

靜態方法用static關鍵詞進行標記,靜態方法的調用是使用  類名+「.」運算符。而非靜態方法則是使用  引用變量名+「.」運算符調用。dom

//非靜態方法,能夠聲明實例變量。經過引用變量名+「.」運算符調用,例如player.playSound(title);
public class Song {
    String title;
    public Song(String t) {
        title=t;
    }
    public void play() {
        SoundPlayer player=new SoundPlayer();        //建立SoundPlayer的實例。
        player.playSound(title);
    }

}

//靜態方法,沒法建立實例變量,直接用類名+「.」運算符,例如Math.min(80,50)
public static int min (int a,int b) {
    //返回a,b中的較小值
}

 

靜態方法不能調用非靜態變量,同時,靜態方法也不能調用非靜態方法。函數

/*
 * 靜態方法不能調用非靜態的變量
 * 靜態方法也不能調用非靜態的方法
 */

public class Duck {
    private int size;
    public static void main(String[] args) {
        System.out.println("Size of duck is "+size);    //調用了實例變量size,此時根本沒法知道是哪一個size
        
        System.out.println("Size is "+getSize);           //這一句沒法經過編譯。調用了getSize()會須要用到size實例變量,
    }
    
    public void setSize(int s) {
        size=s;
    }
    public int getSize() {
        return size;
    }

}

由上面的代碼可知,非靜態方法中有實例變量沒法經過編譯,若非靜態方法中沒有實例變量也沒法經過編譯。spa

 

靜態變量會在第一次載入的時候初始化一次,若程序循環調用該變量不會被反覆初始化,而實例變量則會不斷初始化。下面這段程序,每有一個Duck duck1=new Duck(3);其構造函數就會被執行一次,其中的duckCount1每次都會被初始化爲0,duckCount2只會在第一次被初始化爲0。code

public class Duck {
    private int size;
    int duckCount1=0;
    static int duckCount2=0;

    public Duck() {
        duckCount1++;        //每當該構造函數被執行時,此變量的值會不斷被初始化爲0
        duckCount2++;        //而此變量則會不斷執行遞增,duckCount2只會在第一次載入是被初始化爲0
    }
    public void setSize(int s) {
        size=s;
    }
    public int getSize() {
        return size;
    }

}

同一個類的全部實例共享,實例變量每一個實例有一個,靜態變量每一個類只有一個。duckCount2會在載入類的時候被初始化爲0。若沒有給靜態變量賦初值,其就會被設定爲默認值,int、long、short會被設定爲0,浮點數默認爲0.0,boolean默認爲false。一樣,靜態變量也是經過 類名+「.」運算符調用blog

final變量一旦被初始化值後就就會一直維持這個值不會再改變。以下面的PI爲例,public表示該變量能夠被各方讀取,static表示你不須要實例,標記爲final表示其值不變。需注意常數變量的名稱應該要都是大寫字母並如下劃線分隔,符合命名慣例。繼承

1     public static final double PI=3.1415926535;

靜態final變量初始化的方法有兩種:get

/*
 * 靜態final變量初始化的兩種方法:
 *             一、聲明變量的時候直接初始化
 *          二、在靜態初始化程序中初始化
 *  靜態初始化程序是一段在加載類時會執行的程序代碼,它會在其餘程序可使用該類以前就執行,所以很適合放入final變量的起始程序。
 */
public class Bar {
    
    //一、聲明變量時直接初始化
    public static final int BAR_SIGN1=25;
    
    //二、在靜態初始化程序中初始化
    public static final int BAR_SIGN2;
    static {
        BAR_SIGN2=(int)Math.random();
    }

}

final還能夠用於其餘方面,final的變量(包括實例變量)表明你不能改變其值,final的方法表明你不能覆蓋這個方法,final的類表明你不能繼承該類,也就是不能建立其子類。it

    //非靜態的final變量
    class Foof{
        final int size=3;
        final int whuffie;
        Foof(){
            whuffie=42;
        }
        void doStuff(final int x) {
            //x的值不能被改變
        }
        void doMore() {
            final int z=7;
            //z不能被改變
        }
    }
    
    //final的方法
    class Poof{
        final void calcWhuffie() {
            //絕對不能被覆蓋
        }
    }
    
    //final的類
    final class MyMostPerfectClass{
        //不能被繼承
    }
相關文章
相關標籤/搜索