------- android培訓、java培訓、java學習型技術博客、期待與您交流! ----------
知識點
(來自百度百科)有時你希望定義一個類成員,使它的使用完全獨立於該類的任何對象。通常情況下,類成員必須通過它的類的對象訪問,但是可以創建這樣一個成員,它能夠被它自己使用,而不必引用特定的實例。在成員的聲明前面加上關鍵字static(靜態的)就能創建這樣的成員。如果一個成員被聲明爲static,它就能夠在它的類的任何對象創建之前被訪問,而不必引用任何對象。你可以將方法和變量都聲明爲static。static
成員的最常見的例子是main()。因爲在程序開始執行時必須調用main() ,所以它被聲明爲static。
聲明爲static的變量稱爲靜態變量或類變量。可以直接通過類名引用靜態變量,也可以通過實例名來引用靜態變量,但最好採用前者,因爲後者容易混淆靜態變量和一般變量。靜態變量是跟類相關聯的,類的所有實例共同擁有一個靜態變量。
聲明爲static的方法稱爲靜態方法或類方法。靜態方法可以直接調用靜態方法,訪問靜態變量,但是不能直接訪問實例變量和實例方法。靜態方法中不能使用this關鍵字,因爲靜態方法不屬於任何一個實例。靜態方法不能被子類的靜態方法覆蓋。
聲明爲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新人,如有錯誤的地方請指出。
每天學習一點點,糾錯一點點,進步很大點。