1.static關鍵字
static簡介
static是靜態的意思,是一個修飾符,能夠用於成員變量和成員屬性。
特點
能夠通過類名直接進行調用,被static修飾的成員屬性變成了類屬性,被static修飾的成員方法變成了類方法, 類屬性 和 類方法能夠不用創建對象直接被調用
//普通類
public class Persion {
//static修飾后成為類屬性
public static String str="hello,sttaic";
//static修飾后成為類方法
public static void sleep(){
System.out.println("好吧!,我睡了");
}
}
//Main主線程
public static void main(String[] args) {
//能夠不用創建對象直接調用
//類名.成員變量
String aa=Persion.str;
//類名.成員方法
Persion.sleep();
}
靜態屬性被該類的說有對象所共享
靜態變量(類變量)和非靜態變量(實例變量)的區別
a.內存中的位置
類變量隨着類的加載而存在於方法區中
實例變量隨着對象的創建而存在於堆內存中
b.生命周期
靜態變量的生命周期最長,隨着類的加載而加載,隨着類的消失而消失;實例變量的生命周期隨着對象的創建而產生,消失而消失,靜態屬性要早於對象而存在。
c.所屬關系不同
類變量所屬於整個類,被類的所有對象所共有。
實例變量是對象的特有數據,僅僅屬於某個對象。
優缺點
優點: 對於對象的共享數據提供單獨的存儲空間,節省了控件,沒必要所有對象都存儲一份。
缺點: 生命周期過於長,訪問有一定的局限性,(靜態方法只能訪問靜態屬性)
2.代碼塊
說明
代碼塊就是被{ }包裹的部分,Java中的代碼塊分為:
普通代碼塊,又稱為局部代碼塊,存在於方法體中
構造代碼塊,又稱為初始化代碼塊,在使用new關鍵字創建對象時執行,且先於構造方法執行
靜態代碼塊,被static直接修飾的代碼塊,在類被加載時就執行,只執行一次
public class CodeBlock {
//1.靜態代碼塊 類加載的時候進行執行
static{
System.out.println("這是靜態代碼塊");
}
//2.構造代碼塊 創建對象的時候執行
{
System.out.println("這是構造代碼塊(初始化代碼塊)");
}
public CodeBlock(){
System.out.println("這是構造方法");
}
public void hello(){
//局部代碼塊 當方法被調用的時候開始執行
{
int i=100;
System.out.println("這是普通代碼塊(局部代碼塊)");
}
int i=1;
}
//主函數
public static void main(String[] args) {
//1.在創建對象前 靜態代碼塊首先執行
//2.在創建對象時 構造代碼塊開始執行
//3.在創建對象時 構造代方法開始執行(構造代碼塊先於構造方法執行)
CodeBlock cb1=new CodeBlock();
//4.方法被調用時 普通代碼塊執行
cb1.hello();
System.out.println("-------割-------");
//靜態代碼塊只在加載類的時候調用且只調用一次
CodeBlock cb2=new CodeBlock();
cb2.hello();
}
}
當執行CodeBlock p = new CodeBlock(); 時,內存變化情況
1,將Person.class文件加載進內存
2,在方法區為靜態屬性分配內存並進行默認初始化
3,執行靜態代碼塊,靜態方法進方法區
4,p是對象(變量),那么在棧內存中開辟一個變量空間p
5,在堆內存中給對象分配空間,並分配內存地址值
6,普通方法進方法區
7,非靜態屬性進堆內存,並進行默認初始化
8,調用構造代碼塊(初始化代碼塊)
9,調用對應的構造方法進行對象初始化,對象初始化完畢
10,將對象內存地址賦值給p變量,讓p變量指向該對象
3.Main方法
main方法是一個特殊的方法,作為程序執行的入口可以被JVM識別。
main方法是靜態的,所以可以被JVM直接調用,非常方便。
main不是Java關鍵字,但用來被JVM識別為程序執行的入口。
4.匿名對象
沒有名字的對象
CodeBlock p=new CodeBlock(); p只是一個對象的名字(引用), newCodeBlock()才是創建出來的對象
new Person().eat();
缺點:同一個對象只能調用一次方法
作用:傳參
a.自定義的類型也可以作為參數的類型去使用
b.形參的類型是Person,那么實參的類型也必須是Person
c.實參在傳參時可以匿名
d.實參這個對象傳到方法中后,可以在方法里調用它的方法