【黑馬程序員】面向對象(二) 第六天

-------  android培訓java培訓java學習型技術博客、期待與您交流! ----------

知識點

(來自百度百科)有時你希望定義一個類成員,使它的使用完全獨立於該類的任何對象。通常情況下,類成員必須通過它的類的對象訪問,但是可以創建這樣一個成員,它能夠被它自己使用,而不必引用特定的實例。在成員的聲明前面加上關鍵字static(靜態的)就能創建這樣的成員。如果一個成員被聲明爲static,它就能夠在它的類的任何對象創建之前被訪問,而不必引用任何對象。你可以將方法和變量都聲明爲static。static 成員的最常見的例子是main()。因爲在程序開始執行時必須調用main() ,所以它被聲明爲static。
聲明爲static的變量稱爲靜態變量類變量。可以直接通過類名引用靜態變量,也可以通過實例名來引用靜態變量,但最好採用前者,因爲後者容易混淆靜態變量和一般變量。靜態變量是跟類相關聯的,類的所有實例共同擁有一個靜態變量。
聲明爲static的方法稱爲靜態方法類方法。靜態方法可以直接調用靜態方法,訪問靜態變量,但是不能直接訪問實例變量和實例方法。靜態方法中不能使用this關鍵字,因爲靜態方法不屬於任何一個實例。靜態方法不能被子類的靜態方法覆蓋。

01)static靜態關鍵字

public class PersonDemo {
	public static void main(String[] args) {
		Person p = new Person();
		p.show();
		System.out.println(p.country);//通過引用調用。
		System.out.println(Person.country);//通過類名直接調用
	}
}
class Person{
	String name;//成員變量,實例變量。
	static String country = "CH";//靜態變量。被static修飾的屬性在方法區(共享區、數據區)被創建。被所有創建的對象所共享。
	void show(){
		System.out.println(name + "的國籍是:" + country);
	}
}
運行結果如下圖所示:


02)main函數


public class MainDemo {
	public static void main(String[] args) {//參數args是可以更改的。arsg、ag、xx都可以。【args】只是一種習慣。
		String[] arr = {"hah", "huohuo", "heh", "hihi", "hiahia"};
		MainTest.main(arr);//通過類之間調用靜態方法(main)。
	}
}
class MainTest{
	public static void main(String[] args) {
		System.out.println("一共有"+ args.length + "個元素,分別是:");
		for (int i = 0; i < args.length; i++){
			System.out.print(args[i] + " ");
		}
	}
}
運行結果如下圖所示:


03)何時使用靜態?(static)

要從兩方面考慮:因爲靜態修飾的內容有成員變量函數(方法)。
如果想讓一個類的所有實例共享數據,就要使用靜態變量(類變量)。(對象中的特有數據要定義成非靜態存在堆內存中。)
什麼時候定義靜態函數呢?
當功能內部沒有訪問到非靜態數據(對象的特有數據),那麼該功能可以定義成靜態的。
public class PersonDemo_2 {
	public static void main(String[] args) {
//		Person_2 p = new Person_2();
//		p.show();//如果只是調用show()方法,樓上的創建對象將變的無意義。
		Person_2.show();//直接通過類名調用。
	}
}
class Person_2{
	String name;
	public static void show(){//因爲方法不訪問name變量,所以需要修飾爲static。
		System.out.println("Welcome to Java!");
	}
}
運行結果如下圖所示:


04)靜態的應用——工具類




代碼:
首先創建工具類:ArrayTool。
然後創建測試類:ArrayToolDemo。運行。
public class ArrayTool {//工具類
	private ArrayTool(){}//私有化。
	
	public static int getMax(int[] arr){//獲取最大值。
		int max = arr[0];
		for (int i = 1; i < arr.length; i++){
			if (arr[i] > max)
				max = arr[i];
		}
		return max;
	}
	
	public static int getMin(int[] arr){//獲取最小值。
		int min = arr[0];
		for (int i = 1; i < arr.length; i++){
			if (arr[i] < min)
				min = arr[i];
		}
		return min;
	}
	
	public static void selectSort(int[] arr){//選擇排序:升序。
		for (int i = 0; i < arr.length - 1; i++){
			for (int j = i + 1; j < arr.length; j++){
				if (arr[i] > arr[j])
					swap(arr, i, j);
			}
		}
	}
	
	public static void bubbleSort(int[] arr){//冒泡排序:降序。
		for (int i = arr.length - 1; i > 0 ; i--){
			for (int j = i - 1; j > -1 ; j--){
				if (arr[i] > arr[j])
					swap(arr, i, j);
			}
		}
	}
	
	private static void swap(int[] arr, int a, int b){//位置置換。
		int temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}
	
	public static void printArray(int[] arr){
		System.out.print("[");
		for (int i = 0; i < arr.length; i++){
			if (i != arr.length - 1)
				System.out.print(arr[i] + ", ");
			else
				System.out.println(arr[i] + "]");
		}
	}
}
創建測試類:ArrayToolDemo。運行。
public class ArrayToolDemo {
	public static void main(String[] args) {
		int[] arr = {31, 321, 4325, 6, 412, 4, 423};
		/*
		//爲了讓程序更嚴謹,就不需要通過創建對象來調用方法,所以ArrayTool類中的方法都可以修飾爲static。
		ArrayTool tool = new ArrayTool();
		int max = tool.getMax(arr);
		System.out.println("Max is: " + max);
		int min = tool.getMin(arr);
		System.out.println("Min is: " + min);
		tool.printArray(arr);//排序前
		tool.selectSort(arr);
		tool.printArray(arr);//排序後
		tool.bubbleSort(arr);
		tool.printArray(arr);//排序後
		*/
		
		int max = ArrayTool.getMax(arr);
		System.out.println("Max is: " + max);
		int min = ArrayTool.getMin(arr);
		System.out.println("Min is: " + max);
		ArrayTool.printArray(arr);//排序前
		System.out.println("--------------分割線---------------");
		ArrayTool.bubbleSort(arr);//升序
		ArrayTool.printArray(arr);//排序後
		System.out.println("--------------分割線---------------");
		ArrayTool.selectSort(arr);//降序
		ArrayTool.printArray(arr);//排序後
	}
}
運行結果如下圖所示:


05)幫助文檔的製作。


/**
 * 這是一個可以對數組進行操作的工具類,該類中提供了獲取最值,排序(升降序),打印數組中元素等功能。
 * @author	(作者)
 * @version (版本)
 * @param   (參數)
 * @return  (返回)
 */
cmd運行示例
將doc文檔創建到D盤myhelp文件中。

創建結果如下圖所示:

注意:


06)靜態代碼塊

/*
 * 靜態代碼塊。
 * 格式:
 * static{
 * 		靜態代碼塊中的執行語句。
 * }
 * 特點:隨着類的加載而執行,只執行一次。
 * 		用於給類進行初始化,並優先有主函數。
 *
 */
class StaticCode{
	static{//靜態代碼塊。
		System.out.println("a");
	}
}
public class StaticCodeDemo {
	static{//靜態代碼塊。
		System.out.println("b");
	}
	public static void main(String[] args) {
		new StaticCode();//
		new StaticCode();//這兩個只執行一次,上面執行後,這行將不執行。
		System.out.println("Over");
	}
	static{//靜態代碼塊。
		System.out.println("c");
	}
}
運行結果如下圖所示:


07)對象的初始化過程




附言:我是Java新人,如有錯誤的地方請指出。
每天學習一點點,糾錯一點點,進步很大點。

-------  android培訓java培訓java學習型技術博客、期待與您交流! ----------


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