java的static關鍵字和c/c++語言的關鍵字有所不同:
一旦在java里使用了static關鍵字,那么這樣的內容不再屬于對象自己,而是屬于類本身的,所以凡是本類的對象,都共享一份。
1、使用java static關鍵字修飾成員變量
以下是stundent類。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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; } } |
以下是主類:
1
2
3
4
5
6
7
8
9
10
11
12
|
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方法。
1
2
3
4
5
|
private static int id_count = 0 ; public static int get_idcount() { return id_count ; } |
在主類中獲取id_count不通過類.變量的方式獲取,而是改為類.方法()的方式獲取。
student.get_idcount()
強調兩點:
①
- (1)成員方法可以訪問成員變量
- (2)成員方法可以訪問靜態變量
- (3)靜態方法可以訪問靜態變量
- (4)靜態方法不可以訪問成員變量(非靜態)
原因:因為在內存中是先有的靜態內容,后有的非靜態內容
②
- (1)靜態方法當中不能使用this
原因:因為this代表當前對象,通過誰調用的方法,誰就是當前對象
小結:
一旦使用了static修飾成員方法,那么這就成為了靜態方法,不屬于對象,而是屬于類本身的。
對于靜態方法來說,可以通過對象名進行調用,也可以直接通過類名稱來調用。
如果沒有static關鍵字,那么必須首先創建對象,然后通過對象才能使用它
如果有了static關鍵字,那么不需要創建對象,直接就能通過類名稱進行調用。
無論是成員變量,還是成員方法,如果有了static,都推薦使用類名稱進行調用。
靜態變量:類名稱.靜態變量
靜態方法:類名稱.靜態方法();
對于本類中的靜態方法,可以省略類名稱。
3、靜態static的內存圖
參照學習傳智的java課程給出的圖,清晰易懂。
4、靜態代碼塊
靜態代碼塊格式:
1
2
3
4
5
6
|
public class 類名稱{ static { //靜態代碼塊的內容 } } |
- (1)特點:當第一次用到本類時,靜態代碼塊執行唯一的一次,靜態內容總是優先于非靜態,所以靜態代碼塊比構造方法先執行
- (2)典型用途:用來一次性地對靜態成員變量進行賦值。
針對上面的案例做修改,在student類中添加一個靜態代碼塊:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
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 ; } } |
然后主程序修改如下:
1
2
3
4
5
6
7
8
9
10
|
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()); } } |
運行結果:
很明顯得出結論。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
原文鏈接:https://blog.csdn.net/morixinguan/article/details/84982486