Java學習筆記之static關鍵字
阿新 • • 發佈:2018-12-25
Java裡可以使用static宣告屬性或者方法,對於非static的屬性和方法,每個物件都佔有各自的內容,如果想要有一個方法或者屬性為所有物件所共有,可以宣告為static型別,聲明瞭static型別的屬性或方法之後,此方法也稱為類方法,可以由類名直接呼叫。
1、使用static宣告屬性
static可以宣告全域性屬性,全域性屬性有什麼作用呢?看一下如下程式碼
public class Demo5 {
public static void main(String[] args) {
Person p1 = new Person("張三", 30);
Person p2 = new Person("李四", 31);
Person p3 = new Person("王五", 32);
p1.getInfo();
p2.getInfo();
p3.getInfo();
System.out.println("----------- 修改 p1 的country 屬性 ----------");
p1.country = "B城";
p1.getInfo();
p2.getInfo();
p3. getInfo();
}
}
class Person{
String name; // 宣告name屬性,暫時不封裝
int age; // 宣告age 屬性,暫時不封裝
String country="A城"; // 宣告country屬性,給預設值
public Person(String name, int age){
this.name = name;
this.age = age;
}
public void getInfo(){
System.out.println( "姓名:" + this.name + " 年齡:" + this.age + " 城市:" + country);
}
}
執行結果:
姓名:張三 年齡:30 城市:A城
姓名:李四 年齡:31 城市:A城
姓名:王五 年齡:32 城市:A城
----------- 修改 p1 的country 屬性 ----------
姓名:張三 年齡:30 城市:B城
姓名:李四 年齡:31 城市:A城
姓名:王五 年齡:32 城市:A城
我們看到,上面的程式基本實現了我們想要的功能,但是當改變country屬性的時候,只有明確修改屬性的p1改變了,p2,p3都沒變,如果只有幾個物件,我們打不了逐個修改,但是如果物件有成千上萬個,那逐個修改就是非常耗時耗力的重複工作,這個時候,我們就可以用static關鍵字來處理,只要把country屬性宣告為static就行
public class Demo5 {
public static void main(String[] args) {
Person p1 = new Person("張三", 30);
Person p2 = new Person("李四", 31);
Person p3 = new Person("王五", 32);
p1.getInfo();
p2.getInfo();
p3.getInfo();
System.out.println("----------- 修改 p1 的country 屬性 ----------");
p1.country = "B城";
p1.getInfo();
p2.getInfo();
p3.getInfo();
}
}
class Person{
String name; // 宣告name屬性,暫時不封裝
int age; // 宣告age 屬性,暫時不封裝
String country="A城"; // 宣告country屬性,給預設值
public Person(String name, int age){
this.name = name;
this.age = age;
}
public void getInfo(){
System.out.println("姓名:" + this.name + " 年齡:" + this.age + " 城市:" + country);
}
}
執行結果:
姓名:張三 年齡:30 城市:A城
姓名:李四 年齡:31 城市:A城
姓名:王五 年齡:32 城市:A城
----------- 修改 p1 的country 屬性 ----------
姓名:張三 年齡:30 城市:B城
姓名:李四 年齡:31 城市:B城
姓名:王五 年齡:32 城市:B城
可以看到,修改一個物件的country屬性值,所有物件的country屬性都發生改變,這表明這個country屬性是所有物件所共享的
說到這裡,順便提一下Java的記憶體區域
- 棧記憶體:可以儲存物件的名稱
- 堆記憶體:每個物件的具體屬性
- 全域性資料區:儲存static型別的屬性
- 全域性程式碼區:儲存所有方法的定義
再回來看一下剛才的程式碼,在修改static屬性的時候,我們用的是 物件.屬性=" "來修改,這種方式其實不推薦,最好是用 “類名稱 . 屬性” 來修改。
2、使用static宣告方法
public class Demo5 {
public static void main(String[] args) {
Person p1 = new Person("張三", 30);
Person p2 = new Person("李四", 31);
Person p3 = new Person("王五", 32);
System.out.println("----------- 修改前 ------------");
p1.getInfo();
p2.getInfo();
p3.getInfo();
Person.setCountry("B城"); // 呼叫靜態方法修改country屬性
System.out.println("----------- 修改後 ------------");
p1.getInfo();
p2.getInfo();
p3.getInfo();
}
}
class Person{
private String name; // 宣告name屬性
private int age; // 宣告age 屬性
private static String country="A城"; // 宣告country屬性,給預設值
public static String getCountry() {
return country;
}
public static void setCountry(String country) {
Person.country = country;
}
public Person(String name, int age){
this.name = name;
this.age = age;
}
public void getInfo(){
System.out.println("姓名:" + this.name + " 年齡:" + this.age + " 城市:" + country);
}
}
執行結果:
----------- 修改前 ------------
姓名:張三 年齡:30 城市:A城
姓名:李四 年齡:31 城市:A城
姓名:王五 年齡:32 城市:A城
----------- 修改後 ------------
姓名:張三 年齡:30 城市:B城
姓名:李四 年齡:31 城市:B城
姓名:王五 年齡:32 城市:B城
注意:靜態方法不能呼叫非靜態屬性或方法