一、Java中的static使用之靜態(tài)變量
1.Java 中被static修飾的成員稱為靜態(tài)成員或類成員。它屬于整個(gè)類所有,而不是某個(gè)對(duì)象所有,即被類的所有對(duì)象所共享、且優(yōu)先于對(duì)象存在。靜態(tài)成員可以使用類名直接訪問,也可以使用對(duì)象名進(jìn)行訪問。使用 static 可以修飾變量、方法和代碼塊。
2.public 修飾符表示公開的、公有的,靜態(tài)變量使用static修飾
3.靜態(tài)方法中可以直接調(diào)用同類中的靜態(tài)成員,但不能直接調(diào)用非靜態(tài)成員。
1
2
3
4
5
6
7
8
|
public class HellWorld{ String name = “Java”; //非靜態(tài)變量 static String hobby = “ programing”; //靜態(tài)變量 public static void print(){ System.out.println(“歡迎您:” + name + ” !”); //不能直接調(diào)用非靜態(tài)變量 System.out.println(“歡迎您:” + hobby + ” !”); //可以直接調(diào)用靜態(tài)變量 } } |
4.如果希望在靜態(tài)方法中調(diào)用非靜態(tài)變量,可以通過創(chuàng)建類的對(duì)象,然后通過對(duì)象來訪問非靜態(tài)變量?!?/p>
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class HellWorld{ String name = “Java”; //非靜態(tài)變量 static String hobby = “program ”; //靜態(tài)變量 //靜態(tài)方法中調(diào)用非靜態(tài)變量 public static void print(){ //創(chuàng)建類的對(duì)象 HelloWorld hello= new HelloWorld(); //通過對(duì)象來實(shí)現(xiàn)在靜態(tài)方法中調(diào)用非靜態(tài)變量 System.out.println(“歡迎您:”+hello.name+”!”); //靜態(tài)方法中可以直接調(diào)用靜態(tài)變量 System.out.prinltn(“歡迎喜歡”+program+”的”+hello.name); } } |
5.在普通成員方法中,則可以直接訪問同類的非靜態(tài)變量和靜態(tài)變量
1
2
3
4
5
6
7
8
|
public class HellWorld{ String name = “Java”; //非靜態(tài)變量 static String hobby = “ programing”; //靜態(tài)變量 public void print(){ //普通方法 System.out.println(“歡迎您:” + name + ” !”); System.out.prinltn(“歡迎喜歡”+program+”的”+hello.name); } } |
6.靜態(tài)方法中不能直接調(diào)用非靜態(tài)方法,需要通過對(duì)象來訪問非靜態(tài)方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public class HellWorld{ String name = “Java”; //非靜態(tài)變量 static String hobby = “program ”; //靜態(tài)變量 //非靜態(tài)方法 public void show(){ System.out.println(“我是非靜態(tài)方法,不能被靜態(tài)方法直接調(diào)用。。。”); } //靜態(tài)方法 public static void show2(){ System.out.println(“我是靜態(tài)方法,可以直接被靜態(tài)方法調(diào)用”); } //靜態(tài)方法中通過對(duì)象來調(diào)用非靜態(tài)方法。可以直接調(diào)用靜態(tài)方法 public static void print(){ //創(chuàng)建類的對(duì)象 HelloWorld hello= new HelloWorld(); //通過對(duì)象來實(shí)現(xiàn)在靜態(tài)方法中調(diào)用非靜態(tài)方法 hello.show(); //靜態(tài)方法中可以直接調(diào)用靜態(tài)方法 show2(); } } |
二、Java 中的 static 使用之靜態(tài)初始化塊
1.在類的聲明中,可以包含多個(gè)初始化塊,當(dāng)創(chuàng)建類的實(shí)例時(shí),就會(huì)依次執(zhí)行這些代碼塊。如果使用 static 修飾初始化塊,就稱為靜態(tài)初始化塊。
2.實(shí)例變量和類變量的區(qū)別:
a) 存放位置:類變量隨著類的加載而存放于方法區(qū)中;實(shí)例變量隨著對(duì)象的建立存在于堆內(nèi)存中。
b) 生命周期:類變量生命周期最長(zhǎng),隨著類的消失而消失;實(shí)例變量生命周期隨著對(duì)象的消失而消失。
3.靜態(tài)初始化塊只在類加載時(shí)執(zhí)行,且只會(huì)執(zhí)行一次,同時(shí)靜態(tài)初始化塊只能給靜態(tài)變量賦值,不能初始化普通的成員變量。程序運(yùn)行時(shí),靜態(tài)初始化快先被執(zhí)行并優(yōu)先于主函數(shù),然后執(zhí)行普通初始化塊,最后才執(zhí)行構(gòu)造方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public class StaticDemo { int num1; //聲明變量1 int num2; //聲明變量2 static int num3; //聲明靜態(tài)變量3 public StaticDemo(){ //構(gòu)造方法 num1 = 88 ; System.out.println( "通過構(gòu)造方法為變量1賦值" ); } { //初始化塊 num2 = 99 ; System.out.println( "通過初始化塊為變量2賦值" ); } static { //靜態(tài)初始化這里不能giel普通變量賦值 num3 = 77 ; System.out.println( "通過靜態(tài)初始化塊為靜態(tài)變量3賦值" ); } public static void main(String[] args) { StaticDemo hello = new StaticDemo(); //創(chuàng)建類的對(duì)象hello System.out.println( "num1:" + hello.num1); System.out.println( "num2:" + hello.num2); System.out.println( "num3:" + hello.num3); StaticDemo hello1 = new StaticDemo(); } } |
運(yùn)行結(jié)果: