含淚咬牙學習的第七天
今天總結static關鍵字,個人認爲還是比較重要
static關鍵字
用於修飾成員(成員變量和成員函數)
特點
- 隨着類的加載而加載
- 優先於對象存在
- 被所有對象所共享
- 可以直接被類名調用
注意
- 靜態方法只能訪問靜態成員
- 靜態方法中不可以寫this / super 關鍵字
- 主函數是靜態的
- 非靜態成員既可以訪問非靜態成員也可以訪問靜態成員(例:就像下列代碼中show()方法就不能被static所修飾,因爲輸出語句中的name和age包含this關鍵字)
內存運行圖
圖解:
- 在main函數進棧前代碼區和靜態代碼區就已經存在
- 然後main函數進棧,實例化對象s1
- s1指向堆裏的一部分空間,存放了類中的name和age,並且可以指向靜態代碼區
- s1.show()方法進棧執行,
- 執行完畢彈棧
- 實例化對象s2
- 與s1相同,s2指向堆裏另一部分空間,並且,s2可以指向同一靜態代碼區
- s2.show()方法進棧執行,
- 執行完畢彈棧
- 10.main函數執行完畢彈棧
靜態方法的調用還可以直接類名加屬性名,不用再通過對象
package com.b;
class Student{
static String school="CSDN"; //被static所修飾 靜態變量
int age;
String name; //成員變量
Student(String name,int age)
{
this.name=name;
this.age=age;
}
public void show(){
System.out.println(name+",來自"+school+","+age+"歲");
}
}
public class Demo5 {
public static void main(String[] args)
{
Student s1=new Student("zs",20);
s1.show();
Student s2=new Student("ls",21);
s2.show();
System.out.println(s1.school); //對象 訪問方式
System.out.println(Student.school); //類名 訪問方式
}
}
成員變量與靜態變量的區別
1.存儲位置不同
- 成員變量 在堆內存中存儲(對象有特有的數據)
- 靜態變量 在靜態靜態代碼區存儲(所有對象共享數據)
2.調用方式不同
- 成員變量 通過對象來調用
- 靜態變量 可以通過對象,也可以通過類名來調用
3.生命週期不同
- 成員變量 隨對象的產生而產生,隨對象消失而消失
- 靜態變量 隨類的產生而產生,隨類的消失而消失
4.別名不同
- 成員變量 --實例變量
- 靜態變量 --類變量