1. 程式人生 > >JAVA基礎(50)---靜態方法和靜態程式碼塊

JAVA基礎(50)---靜態方法和靜態程式碼塊

靜態方法

                      用static修飾的方法。靜態的屬性也稱類變數,靜態的方法稱為類方法。

靜態方法什麼時候使用

  • 類屬性作為該類各個物件之間共享的變數,在設計類時,分析哪些類屬性不因物件的 改變而改變,將這些屬性設定為類屬性,相應的方法設定為類方法。
  • 如果方法和呼叫者無關,則這樣的方通常被宣告為類方法,由於不需要建立物件就可以呼叫類方法,從而簡化了方法的呼叫。

靜態方法和靜態變數一樣,屬於類所有,在類載入的同時執行,不屬於某個具體的物件,所有物件均能呼叫,對於靜態方法需要注意以下幾點:

  • 它們僅能呼叫其它的static的方法
  • 它們只能訪問static資料
  • 它們不能以任何方式引用this或super

靜態方法的使用的注意事項

  1. 在靜態的方法中,只能使用靜態的變數,不能使用非靜態的變數
  2.  靜態方法只能呼叫靜態的方法,不能呼叫非靜態的方法
  3.  非靜態可以訪問靜態的,而靜態的不能訪問非靜態的    

在靜態中不能使用this

靜態方法,一般用於宣告工具類中的方法。可以直接拿類名呼叫工具方法進行使用。比如:在Java中,對於陣列的操做,比較頻繁,有一些方法是所有陣列共有的一些操作排序,在陣列中去查詢某一個特定的元素 列印陣列的元素等。

陣列操作的工具類:Arrays

在Arrays這個工具類中,使用二分搜尋法,查詢一個元素的時候:這個陣列必須是經過排序

import java.util.Arrays;

public class ArrayTest {
	
	public static void main(String[] args) {
		int[] arr = {2,3,6,7,1,4};
		int serchResult = Arrays.binarySearch(arr, 4);
		Arrays.sort(arr);
		
		for(int i = 0 ; i < arr.length;i++) {
			
			System.out.println(arr[i]);
		}
		System.out.println(serchResult);
	}
}

靜態方法與普通方法

  • 靜態方法中不可直接呼叫非靜態方法,但是非靜態方法中,可以直接呼叫靜態的。
  • 靜態方法可以呼叫靜態成員變數,呼叫普通成員變數時需要建立物件;非靜態方法可以隨意呼叫靜態成員變數或普通成員變數。
  • 靜態方法和普通方法呼叫特性同上,靜態呼叫普通方法時需要建立物件,而普通方法隨意

 

靜態程式碼塊

                                               static{

                                               }

public class StaticBlock {
	public static void main(String[] args) {
		/*String schoolName = Student.getSchoolName();
		System.out.println(schoolName);*/
		Student stu = new Student();
		Student stu1 = new Student("張三",23);
	}
}

class Student {
	private String name ="";
	private int age;
	private static String schoolName ="太原師院";
	
	static{
		schoolName ="太原師範學院";
		System.out.println("靜態程式碼塊執行");
		
	}
	{
		System.out.println("構造程式碼塊執行");
		
	}
	public Student() {
		System.out.println("無參構造執行");
	}

	public Student(String name, int age) {
		this.name = name;
		this.age = age;
		System.out.println("帶參構造執行");
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public static String getSchoolName() {
		return schoolName;
	}

	public static void setSchoolName(String schoolName) {
		Student.schoolName = schoolName;
	}

}

    靜態程式碼塊(無論建立多少個物件,只執行一次) --》構造程式碼塊(隨著物件的建立而執行,執行的次數,與建立物件的個數相同)--》構造方法 

靜態變數(類變數/類屬性)的初始化

  1. 在宣告變數的時候可以進行初始化
  2. 在靜態程式碼塊中對其進行初始化

什麼情況下我們要使用static呢?

  1. 只想用一個儲存區域來儲存一個特定的資料——無論要建立多少個物件,甚至根本不建立物件。
  2. 我們需要一個特殊的方法,它沒有與這個類的任何物件關聯。也就是說,即使沒有建立物件,也需要一個能呼叫的方法。(常用在工具類中)

靜態變數和成員變數的區別

  • 記憶體分配。靜態靜態,就是當類被載入時,這個記憶體就靜靜的待在這裡,就已經存在,而普通成員變數,只有類被例項化時才分配記憶體。
  • 呼叫方法。成員變數需要物件才能被呼叫;而靜態成員變數可以直接通過類來呼叫,當然也可以直接呼叫
  • 生命週期。靜態成員變數從類被載入開始到類被解除安裝,一直存在;普通成員變數只要在類被例項化也就是建立物件是才開始存在,一直到物件結束,生命也告終。
  • 共享方式。靜態成員變數是全類共享的,即使不是物件,也可以呼叫,並且記憶體不變;普通成員變數是每個物件單獨享用的,就是說你這個物件有一個 int i=1 ,我再給該類建立一個新的物件,他也有一個 int i ,但他可以不等於1,可以等於5,也可以等於10,但無論等於多少,都不會影響之前物件的i的值,而靜態成員變數不是這樣。

static對效能的影響

為什麼說 static塊 可以用來優化程式效能,是因為它的特性:只會在類載入的時候執行一次。static final 用來修飾成員變數和成員方法,可簡單理解為“全域性常量”, 常量必須要加static關鍵字修飾。

static 就是靜態變數,宣告為 static 的變數實質上就是全域性變數,如果一個成員被宣告為 static ,它就能夠在它的類的任何物件建立之前被訪問,而不必引用任何物件!

static的優點

  1. 一個靜態屬性在堆記憶體只能存在一個,即大家可以共享該屬性值。
  2. 如果一個物件陣列中其中的某個屬性大家都是相同的,即可以使用靜態,這樣可以節省記憶體空間。
  3. 靜態一旦建立,生命週期就會從建立開始到該程式結束才會死亡。
  4. 靜態依賴於類,而不是物件。

為什麼main方法是靜態的?而且是public static

public,訪問許可權大;static,main方法訪問時候沒有物件,是程式一啟動就訪問的,所以它是靜態的。