安全程式設計(十二) - static
阿新 • • 發佈:2018-11-12
1.引言
java中被static修飾的成員叫做靜態成員或類成員。她屬於整個類所有,而非某一個物件所有,即被類的所以物件所共享。靜態成員可以使用類名直接訪問,也可以使用物件名進行訪問。大多時候推薦使用類名進行訪問。
static可以修飾變數、程式碼、方法塊。
靜態成員屬於整個類,當第一次使用該類時系統會為她分配記憶體空間,直到該類被解除安裝才會回收資源空間。
2.例項
2.1靜態變數:
在一個類中定義一個靜態變數:
package cn.nuist.pers.September20; public class StaticVariable { static String str1 = "isleiyi"; public static void main(String[] args) { System.out.println("1.output:" + StaticVariable.str1); //1.直接通過類名進行訪問,無需建立物件 StaticVariable staVar = new StaticVariable(); //2.建立類的物件 System.out.println("2.output:" + staVar.str1); //使用類的物件訪問靜態變數 staVar.str1 = "newleiyi"; //3.使用物件名的形式來修改靜態變數的值 System.out.println("3.output:" + staVar.str1); //修改後的靜態變數的值 } }
輸出結果:
1.output:isleiyi
2.output:isleiyi
3.output:newleiyi
2.2靜態方法:
用static修飾的方法叫做靜態方法,如我們常使用的main也是靜態方法。靜態方法的使用如下:
package cn.nuist.pers.September20; public class StaticMethod { public static void print() { System.out.println("StaticMethod Test"); } public static void main(String[] args) { StaticMethod.print(); //直接使用類名呼叫靜態方法 StaticMethod staMet = new StaticMethod(); //建立物件呼叫靜態方法 staMet.print(); } }
結果:
StaticMethod Test
StaticMethod Test
2.2.1靜態方法中可以直接呼叫同類的靜態成員,但不能呼叫非靜態成員。
package cn.nuist.pers.September20;
public class StaticMethodTest1 {
String str1 = "helo";
static String str2 = "hello";
public static void main(String[] args) {
System.out.println("str1 output:" + StaticMethodTest1.str1); //呼叫非靜態變數
System.out.println("str2 output:" + StaticMethodTest1.str2); //呼叫靜態變數
}
}
結果:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Cannot make a static reference to the non-static field StaticMethodTest1.str1
at cn.nuist.pers.September20.StaticMethodTest1.main(StaticMethodTest1.java:8)
如果希望在靜態方法中呼叫非靜態成員,可以建立該類的物件,然後通過物件來訪問非靜態成員。
package cn.nuist.pers.September20;
public class StaticMethodTest1 {
String str1 = "helo";
static String str2 = "hello";
public static void main(String[] args) {
// System.out.println("str1 output:" + StaticMethodTest1.str1); //呼叫非靜態變數會出錯
StaticMethodTest1 smt = new StaticMethodTest1(); //建立該類的物件來呼叫非靜態成員
System.out.println("str1 output:" + smt.str1);
System.out.println("str2 output:" + StaticMethodTest1.str2); //呼叫靜態變數
}
}
結果:
str1 output:helo
str2 output:hello
2.2.2在普通成員方法中,可以訪問到該類中的非靜態成員和靜態成員。
package cn.nuist.pers.September20;
public class StaticMethodTest2 {
String str1 = "helo";
static String str2 = "hello";
public void show() { //普通成員方法可以訪問到靜態非靜態變數
System.out.println("1.output:" + str1);
System.out.println("2.output:" + str2);
}
}
2.2.3靜態方法中不能直接呼叫非靜態方法,需要通過建立物件來呼叫非靜態方法。
package cn.nuist.pers.September20;
public class StaticMethodTest3 {
public void show() {
System.out.println("helo");
}
public static void print() {
System.out.println("Helo");
}
public static void main(String[] args) {
StaticMethodTest3 smt3 = new StaticMethodTest3(); //靜態方法不能直接呼叫非靜態方法,需要
smt3.show(); //通過物件來呼叫
print(); //可以直接呼叫靜態方法
}
}
結果:
str1 output:helo
str2 output:hello
3.總結
多動手,多動腦;活到老,學到老!
參考資料:https://www.cnblogs.com/dianqijiaodengdai/p/6144698.html