1 靜態(tài)static
一個類可以創(chuàng)建n個對象模狭,如果n個對象中的某些數(shù)據(jù)需要n個對象共享,就需要使用static關鍵字修飾這些數(shù)據(jù)顿颅。
1.1 static的作用
在同一個類的對象中共享數(shù)據(jù)怔揩。
1.2 static的修飾屬性
使用static修飾的屬性稱為靜態(tài)屬性或類變量蔗坯。使用static修飾的屬性屬于類砰奕,不屬于具體的某個對象蛛芥。類屬性在類名首次出現(xiàn)時初始化提鸟,即使沒有創(chuàng)建對象,類屬性也是存在的仅淑。
1.3 static的修飾方法
用static修飾的方法稱為靜態(tài)方法或者類方法称勋,類方法不依賴于任何對象,用類名直接加" . "調(diào)用即可漓糙,對象名也可以調(diào)用。使用static修飾的方法屬于類烘嘱,不屬于具體的某個對象昆禽。類方法在類名首次出現(xiàn)時初始化,即使沒有創(chuàng)建對象蝇庭,類方法也是存在的醉鳖。
例:在person類中定義靜態(tài)的showDetails()方法,并調(diào)用哮内。
public class Person {
//定義靜態(tài)方法
public static void showDetails(String name,int age){
System.out.println("自我介紹一下盗棵,姓名:" + name + ",年齡:" + age);
}
public static void main(String[] args) {
Person.showDetails("李逵",20);//類名直接調(diào)用靜態(tài)方法
Person person = new Person();
person.showDetails("阮小二",19);//對象名調(diào)用靜態(tài)方法北发,不推薦
}
}
運行結果如下:
1.4static塊
類名首次出現(xiàn)時纹因,先為靜態(tài)變量分配內(nèi)存,然后調(diào)用靜態(tài)塊琳拨,靜態(tài)塊可以為靜態(tài)變量初始化瞭恰。還可以干別的事情。
靜態(tài)塊只在類名首次出現(xiàn)時調(diào)用一次狱庇,以后再也不調(diào)用了惊畏。
例如:
public class Demo{
//構造為實例變量初始化
public Demo(int i){
this.i = i;
}
//靜態(tài)塊,為static變量初始化密任,靜態(tài)塊在首次類名出現(xiàn)時調(diào)用颜启,但后于分配靜態(tài)變量。
static{
age = 20;
}
static int age=0;
int i;
}
2 實例
2.1 實例的定義
實例浪讳,也叫對象缰盏,就是new出來的堆的內(nèi)存空間,實例是每個對象專有的淹遵,每new一次就分配一次內(nèi)存乳规。
2.2 實例化
new就是實例化的意思,new也是分配內(nèi)存的意思
類名 對象名 = new 類名();
實例
Student s1 =new Student();
Student s2 =new Student();
2.3實例變量
沒有被 static 修飾的成員變量被稱為實例變量合呐。
2.4實例變量的調(diào)用
在類的內(nèi)部暮的,任何非靜態(tài)方法內(nèi)可以直接訪問實例變量;在其他類中淌实,可以通過對象訪問實例變量冻辩。
3 靜態(tài)與實例的區(qū)別
- 實例變量是在new類時在堆中分配內(nèi)存的猖腕。
- 構造函數(shù)可以為實例屬性初始化。構造函數(shù)不會為靜態(tài)屬性初始化恨闪。
- 由于靜態(tài)屬性是所有對象共有的倘感,所有對象不就是類嗎,因此靜態(tài)屬性也稱為類屬性咙咽,或者類變量老玛,或者類成員。
- 既然靜態(tài)屬性屬于類钧敞,不屬于某個具體的對象蜡豹,因此在new對象時,不會給靜態(tài)屬性分配內(nèi)存溉苛。那靜態(tài)時什么時候分配內(nèi)存呢镜廉?
- 當在程序運行期間,首次出現(xiàn)類名時愚战,會暫時停止程序運行娇唯,去為類的靜態(tài)屬性分配內(nèi)存,然后繼續(xù)運行寂玲。
- 靜態(tài)變量被分配在方法區(qū)中塔插,常駐內(nèi)存,永不回收拓哟。靜態(tài)變量只有一份佑淀。相當于c語言的全局變量。
- 靜態(tài)變量由類名操作彰檬,由類名賦值伸刃,取值。
- 類名調(diào)用靜態(tài)屬性時逢倍,可以省略類名捧颅。