Java之静态
? ? ? ? 靜態這個概念在很多編程語言中都有體現,比如C++中,Java是面向對象的,某些特殊情況下,通常是實用方法但是不需要類的實例。static這個關鍵字就可以標記處需要類實例的方法。
1、靜態方法
1)靜態方法不能調用非靜態的變量
? ? ? ?帶有靜態方法的類通常(雖然不一定是這樣)不打算要被初始化的,我們知道抽象類是不能被初始化的。靜態方法是在物管特定類的實例情況下進行的,靜態方法是通過類的名稱來調用,所以靜態方法無法引用到該類的任何實例變量,因而在此情況下靜態方法也不會知道可以使用哪個實例變量值。
? ? ? 那如果在靜態方法中使用實例變量,會出現什么問題呢?
public class UserDuck {private int size;public static void main(String [] args){System.out.println("Size of duck is "+size);}public void setSize(int s) {size = s;}public int getSize() {return size;} }2)靜態的方法不能調用非靜態的方法
public class UserDuck {private int size;public static void main(String [] args){System.out.println("Size of duck is "+getSize());}public void setSize(int s) {size = s;}public int getSize() {return size;} }2、靜態變量
? ? ? 所謂的靜態方法就是在變量定義的時候加上static聲明,且靜態變量只會在載入的第一次的時候被初始化,且被所有實例共享。
public class UserDuck {private int size;private static int duckCount = 0;public UserDuck() {duckCount++;}public void setSize(int s) {size = s;}public int getSize() {return size;} }靜態變量是在類被加載時初始化的。類之所以會被加載,是因為Java虛擬機認為它該被加載,通常,Java虛擬器會加載某個類時因為第一次有人闡釋創建該類的實例,或者使用該類的靜態方法或者變量。因此:
1)靜態變量會在該類的任何對象創建之前就完成初始化
2)靜態變量會在該類的任何和靜態方法執行之前就初始化
class Duck{static int size = 0;private String name;public Duck(String n) {name = n;size++;}}public class UserDuck {public static void main(String[] args) {System.out.println(Duck.size);Duck d= new Duck("Duck Duck");System.out.println(Duck.size);} }注意:對于long活著了short,int等primitive主數據類型整數的默認值是0,否點數默認值是0.0,boolean是false,對象引用是null,靜態變量如果沒有給其賦初始值,它會被設定默認值,int會被設定為0,靜態變量的默認值回事該變量類型的默認值。
1)靜態final變量是常量
一個被標記為final的變量達標它是一旦被初始化之后就不會被改動。
public static final double PI = 3.1415926;此變量標識為public,因此可供各方讀寫;
此變量標識位static,不需要類的實例
此變量表示為final,為常量,常量變量的名稱都要大寫
那靜態的final變量如何初始化呢,有以下兩種方法:
1)聲明的時候直接初始化
public class Foo{public static final int FOO_X = 1024; }2)靜態初始化程序中
public class BAR{public static final double BAR_SIGN;static{ BAR_SIGN = (double)Math.random();} }當然final還有其他的用法,比如
final變量為常量,無法改變其值;
final的method表示不能覆蓋該methon;
final的類代表不能繼承該類,即不能創建該類的子類。
總結
- 上一篇: Java之空间分配
- 下一篇: Java之主数据类型的包装