1.static關鍵字及內存圖
class Demo1_Static {
public static void main(String[] args) {
Person p3 = new Person();
p3.name = "小明"; //調用姓名屬性並賦值
p3.country = "臺灣"; //調用國籍屬性並賦值
p3.speak();
Person p1 = new Person(); //創建對象
p1.name = "小王"; //調用姓名屬性並賦值
p1.country = "中國"; //調用國籍屬性並賦值
p1.speak();
Person p2 = new Person();
p2.name = "張三"; //調用姓名屬性並賦值
// p2.country = "中國"; //調用國籍屬性並賦值
p2.speak();
Person p4 = new Person();
p4.name = "李四"; //調用姓名屬性並賦值
// p2.country = "中國"; //調用國籍屬性並賦值
p4.speak();
//Person.country = "日本"; //靜態多了一種調用方式,可以通過類名.
//System.out.println(Person.country);
}
}
class Person {
String name; //姓名
static String country; //國籍
public void speak() { //說話的方法
System.out.println(name + "..." + country);
}
}
創建對象內存圖:
2.static關鍵字的特點
A:static關鍵字的特點
* a:隨着類的加載而加載
* b:優先於對象存在
* c:被類的所有對象共享
* 舉例:咱們班級的學生應該共用同一個班級編號。
* 其實這個特點也是在告訴我們什麼時候使用靜態?
* 如果某個成員變量是被所有對象共享的,那麼它就應該定義爲靜態的。
* 舉例:
* 飲水機(用靜態修飾)
* 水杯(不能用靜態修飾)
* 共性用靜態,特性用非靜態
* d:可以通過類名調用
* 其實它本身也可以通過對象名調用。
* 推薦使用類名調用。
* 靜態修飾的內容一般我們稱其爲:與類相關的,類成員
3.static的注意事項
a:在靜態方法中是沒有this關鍵字的
* 如何理解呢?
* 靜態是隨着類的加載而加載,this是隨着對象的創建而存在。
* 靜態比對象先存在。
* b:靜態方法只能訪問靜態的成員變量和靜態的成員方法
* 靜態方法:
* 成員變量:只能訪問靜態變量
* 成員方法:只能訪問靜態成員方法
* 非靜態方法:
* 成員變量:可以是靜態的,也可以是非靜態的
* 成員方法:可是是靜態的成員方法,也可以是非靜態的成員方法。
* 簡單記:
* 靜態只能訪問靜態。
class Demo2_Static {
public static void main(String[] args) {
//Demo d = new Demo();
//d.print1();
//Demo d = new Demo();
//System.out.println(d.num1);
System.out.println(Demo.num1);
//Demo.print2();
}
}
class Demo {
int num1 = 10; //非靜態的成員變量
static int num2 = 20; //靜態的成員變量
/*public void print1() { //非靜態的成員方法,既可以訪問靜態的成員也可以訪問非靜態的
System.out.println(num1);
System.out.println(num2);
}*/
public static void print2() { //靜態的成員方法
//System.out.println(this.num1);//靜態的成員方法不能訪問非靜態的,錯誤: 無法從靜態上下文中引用非靜態 變量 num1
System.out.println(num2);
}
}
靜態內存圖: