静态方法、静态变量
靜態方法用static關鍵詞進行標記,靜態方法的調用是使用? 類名+“.”運算符。而非靜態方法則是使用? 引用變量名+“.”運算符調用。
//非靜態方法,可以聲明實例變量。通過引用變量名+“.”運算符調用,例如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;}}由上面的代碼可知,非靜態方法中有實例變量無法通過編譯,若非靜態方法中沒有實例變量也無法通過編譯。
?
靜態變量會在第一次載入的時候初始化一次,若程序循環調用該變量不會被反復初始化,而實例變量則會不斷初始化。下面這段程序,每有一個Duck duck1=new Duck(3);其構造函數就會被執行一次,其中的duckCount1每次都會被初始化為0,duckCount2只會在第一次被初始化為0。
public class Duck {private int size;int duckCount1=0;static int duckCount2=0;public Duck() {duckCount1++; //每當該構造函數被執行時,此變量的值會不斷被初始化為0duckCount2++; //而此變量則會不斷執行遞增,duckCount2只會在第一次載入是被初始化為0 }public void setSize(int s) {size=s;}public int getSize() {return size;}}同一個類的所有實例共享,實例變量每個實例有一個,靜態變量每個類只有一個。duckCount2會在載入類的時候被初始化為0。若沒有給靜態變量賦初值,其就會被設定為默認值,int、long、short會被設定為0,浮點數默認為0.0,boolean默認為false。同樣,靜態變量也是通過 類名+“.”運算符調用
final變量一旦被初始化值后就就會一直維持這個值不會再改變。如下面的PI為例,public表示該變量可以被各方讀取,static表示你不需要實例,標記為final表示其值不變。需注意常數變量的名稱應該要都是大寫字母并以下劃線分隔,符合命名慣例。
1 public static final double PI=3.1415926535;靜態final變量初始化的方法有兩種:
/** 靜態final變量初始化的兩種方法:* 1、聲明變量的時候直接初始化* 2、在靜態初始化程序中初始化* 靜態初始化程序是一段在加載類時會執行的程序代碼,它會在其他程序可以使用該類之前就執行,因此很適合放入final變量的起始程序。*/ public class Bar {//1、聲明變量時直接初始化public static final int BAR_SIGN1=25;//2、在靜態初始化程序中初始化public static final int BAR_SIGN2;static {BAR_SIGN2=(int)Math.random();}}final還可以用于其他方面,final的變量(包括實例變量)代表你不能改變其值,final的方法代表你不能覆蓋這個方法,final的類代表你不能繼承該類,也就是不能創建其子類。
//非靜態的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{//不能被繼承}?
轉載于:https://www.cnblogs.com/do-hardworking/p/10480439.html
總結
- 上一篇: Windows把内存变成快速虚拟硬盘
- 下一篇: HTTP首部概览