Java應用程式開發學習之static關鍵字應用
Java的static關鍵字和C/C++語言的關鍵字有所不同:
一旦在Java裡使用了static關鍵字,那麼這樣的內容不再屬於物件自己,而是屬於類本身的,所以凡是本類的物件,都共享一份。
1、使用Java static關鍵字修飾成員變數
以下是Stundent類。
package app_one; public class Student { private int id = 0 ; private int age = 0; private String name = null; static int id_count = 0 ; public Student(int age , String name) { this.age = age ; this.name = name ; this.id = ++id_count ; } public int getage() { return age; } public void setage(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
以下是主類:
package app_one; public class hello { public static void main(String[] args) { Student st1 = new Student(14,"小明"); System.out.println("年齡:" + st1.getage() + " 姓名:" + st1.getName() + " 序號:" + Student.id_count); Student st2 = new Student(15,"小紅"); System.out.println("年齡:" + st2.getage() + " 姓名:" + st2.getName() + " 序號:" + Student.id_count); Student st3 = new Student(18,"小李"); System.out.println("年齡:" + st3.getage() + " 姓名:" + st3.getName() + " 序號:" + Student.id_count); } }
執行結果:
從上面的案例可以看到,id_count是可以自動進行計數的,每一次例項化Student類的時候,id_count就自動+1,然後賦值給成員變數id,由於定義了static關鍵字的變數不再屬於物件,而是屬於類,所以在訪問的時候,我們可以用類名稱().靜態變數的形式來進行訪問。
2、使用static修飾成員方法
將上述程式中Student類的id_count修改為私有的靜態變數,並新增一個靜態的Get_idcount方法。
private static int id_count = 0 ; public static int Get_idcount() { return id_count ; }
在主類中獲取id_count不通過類.變數的方式獲取,而是改為類.方法()的方式獲取。
Student.Get_idcount()
強調兩點:
1、
(1)成員方法可以訪問成員變數
(2)成員方法可以訪問靜態變數
(3)靜態方法可以訪問靜態變數
(4)靜態方法不可以訪問成員變數(非靜態)
原因:因為在記憶體中是先有的靜態內容,後有的非靜態內容
2、
(1)靜態方法當中不能使用this
原因:因為this代表當前物件,通過誰呼叫的方法,誰就是當前物件
總結:
一旦使用了static修飾成員方法,那麼這就成為了靜態方法,不屬於物件,而是屬於類本身的。
對於靜態方法來說,可以通過物件名進行呼叫,也可以直接通過類名稱來呼叫。
如果沒有static關鍵字,那麼必須首先建立物件,然後通過物件才能使用它
如果有了static關鍵字,那麼不需要建立物件,直接就能通過類名稱進行呼叫。
無論是成員變數,還是成員方法,如果有了static,都推薦使用類名稱進行呼叫。
靜態變數:類名稱.靜態變數
靜態方法:類名稱.靜態方法();
對於本類中的靜態方法,可以省略類名稱。
3、靜態static的記憶體圖
參照學習傳智的Java課程給出的圖,清晰易懂。
4、靜態程式碼塊
靜態程式碼塊格式:
public class 類名稱{
static
{
//靜態程式碼塊的內容
}
}
(1)特點:當第一次用到本類時,靜態程式碼塊執行唯一的一次,靜態內容總是優先於非靜態,所以靜態程式碼塊比構造方法先執行
(2)典型用途:用來一次性地對靜態成員變數進行賦值。
針對上面的案例做修改,在Student類中新增一個靜態程式碼塊:
package app_one;
public class Student {
private int id = 0 ;
private int age = 0;
private String name = null;
private static int id_count = 0 ;
static
{
System.out.println("靜態程式碼塊執行!");
}
public Student(int age , String name)
{
System.out.println("構造方法執行!");
this.age = age ;
this.name = name ;
this.id = ++id_count ;
}
public int getage() {
return age;
}
public void setage(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static int Get_idcount()
{
return id_count ;
}
}
然後主程式修改如下:
package app_one;
public class hello {
public static void main(String[] args)
{
Student st1 = new Student(14,"小紅");
System.out.println("姓名: "+st1.getName() + " 年齡: " + st1.getage() + " 序號: "+Student.Get_idcount());
Student st2 = new Student(14,"小李");
System.out.println("姓名: "+st2.getName() + " 年齡: " + st2.getage() + " 序號: "+Student.Get_idcount());
}
}
執行結果:
很明顯得出結論。