靜態方法用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{ //不能被繼承 }