java學習(八)——靜態域、靜態方法、靜態初始化塊

 靜態域(也叫做類變量)

如果將域(成員變量)定義爲static形式,這個域就叫做靜態域

 特點:

  1. 這個類的所有實例將共享這個靜態域。
  2. 即使沒有創建該類對象,這個靜態域也存在。它屬於類,不屬於任何獨立的對象,因此也被稱作類域或類變量。
  3. 隨着類的加載而加載。

靜態常量

定義格式:
        public static final 數據類型 常量名(通常大寫)=常量值;

調用格式:類名.靜態常量名

數學常量:public static final double E=2.718281828459045;

                    public static final double PI=3.141592653589793;

更多常量

靜態方法(也稱類方法):被關鍵字static修飾的方法。

特點

  1. 隨着類的加載而加載。
  2. 靜態方法是沒有隱式參數(this)的方法。
  3. 靜態方法不能調用類中的實例域和成員方法,但是可以調用自身類中的靜態域和靜態方法
  4.  即使沒有創建該類對象,這個方法也可以調用

調用格式
            類名.方法名(...);

用途:

  1.  不需要查看或修改對象的狀態,所需要的參數都是通過顯示參數提供,沒有隱式參數
  2.  只需要訪問靜態域,
  3.   用做工廠方法,生成不同格式的對象

          如:LocalDate.now(); LocalDate.of(); NumberFormat();   

NumberFormat c1=NumberFormat.getCurrencyInstance();    //返回當前默認語言環境的貨幣格式。
NumberFormat c2=NumberFormat.getPercentInstance();     //返回當前默認語言環境的整數格式。

 使用靜態工廠方法的原因(《java核心技術 卷一》):
            1.無法命名構造器,構造器的名字必須與類名相同,但是這裏希望將得到的貨幣實例和百分比實例採用不同的名字
            2.當使用構造器時,無法改變所構造的對象類型,而工廠方法將返回一個DecimalFormat類對象,這是NumberFormat的子類

main()方法:在啓動程序時,靜態的main方法將執行並創建程序所需要的對象。

靜態初始化塊:用static標記的代碼

用途:對類的靜態域進行初始化

特點:
            1.在類第一次加載的時候調用
            2.所有的靜態初始化語句和靜態初始化塊按在類中定義的順序執行


class Student
{
	private static int nextNo=1;

	private int no;
	private String name;
	private char sex;

	//構造方法
	public Student(String name,char sex)
	{
		this.name=name;
		this.sex=sex;
		this.no=0;
	}

	public String getName()
	{
		return name;
	}
	public char getSex()
	{
		return sex;
	}
	public int getNo()
	{
		return no;
	}
	public void setNo()
	{
		no=nextNo;
		nextNo++;
	}
	
	public static int getNextNo()
	{
		//name="葉葉";//靜態方法只能訪問靜態變量,無法引用非靜態變量
		return nextNo;
	}

	
	static 
	{
		System.out.println("第一個靜態初始化塊");
	}
	static
	{
		System.out.println("第二個靜態初始化塊");
	}
}
public class StaticDemo
{
	public static void main(String[] args)
	{
		int sno=Student.getNextNo();	//可以不創建對象調用靜態方法
		System.out.println(sno);
		Student[] s1=new Student[5];
		for(int i=0;i<s1.length;i++)
		{
			s1[i]=new Student("葉葉",'男');
			s1[i].setNo();
			System.out.println("學號:"+s1[i].getNo()+"----姓名:"+s1[i].getName()+"----性別:"+s1[i].getSex());
			System.out.println("NextNo="+Student.getNextNo());
		}
	}
}

運行結果


返回目錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章