構造函數:
1. 函數名和類名相同,不用定義返回值類型、沒有具體的返回值
2. 其實就是在創建對象時調用的函數,創建對象都必須經過構造函數初始化
3. 當使用自定義構造函數的時候,必須在寫一個默認的構造函數
構造函數和普通函數區別:
1. 構造函數是在對象創建時進行調用,對對象進行初始化
2. 普通函數是在對象創建後,需要該函數時才進行調用
3. 構造函數僅在對象創建時調用一次
4. 普通函數可以重複的調用
5. 構造函數可以調用普通函數,而普通函數不能調用構造函數
6. 構造函數可以寫return, 但是注意不要寫return value;
什麼時候使用構造函數:
在描述事物時,該事物一存在就具備了一些內容,這些內容都定義在構造函數中
構造函數重載:
和普通函數重載同,即函數的參數個數或者類型不同,函數名完全相同
重寫:
函數名和參數個數及類型完全相同,具體實現內容不同
this關鍵字:
1. 當成員變量和局部變量重名,可以使用this關鍵字來區分
2. 本質上:this就代表對象(當前對象),即this就是所在函數所屬對象的引用
簡單而言,就是哪個對象調用this所在的函數,this就代表哪個對象
3. this關鍵字也用於在構造函數中調用其他的構造函數
注意:只能定義在構造函數的第一行,因爲初始化動作要先執行
Static關鍵字:
1. 數據被static修飾之後,數據將保存在堆內存中。
2. 在類中,所有對象共享的數據,一般初始化爲靜態數據
3. 靜態數據在對象實例化之前就已經初始化在堆內存裏面了。即隨着類的加載而初始化
4. Static修飾的成員被所有對象共享
5. Static優先於對象存在,因爲static的成員隨着類的加載就已經存在了
6. Static修飾的成員可以被對象調用,也可以被類名直接調用(類名.靜態成員)
7. Static修飾的數據是共享數據,對象中存儲的是特有數據
成員變量&實例變量&靜態變量:
1. 成員變量也叫做實例變量;靜態變量也叫做類變量
2. 成員變量隨着對象的存在而存在,隨着對象的消亡而消亡;
3. 靜態變量隨着類的加載而存在,隨着類的消失而消失
4. 成員變量只能被對象調用,靜態變量既可以被對象調用也可以被類調用(強烈不推薦
使用對象調用,因爲靜態成員先於對象存在)
5. 成員變量數據存儲在堆內存的對象中,因此也叫做對象的特有數據
6. 靜態變量數據存儲在共享數據區,所以也叫對象的共享數據。
內存分類:本地方法區、寄存器、共享數據區(方法區)、堆、棧
靜態方法只能訪問靜態成員(成員變量和成員方法),非靜態方法既可以訪問靜態成員也能訪問非靜態
靜態方法中不可以使用this或者super關鍵字,因爲靜態方法是由類名調用的,不依賴於對象,因此不能使用this,而構造方法是非靜態的,因此不能使用super關鍵字
主函數:
1. 主函數是靜態的
2. 主函數特殊之處:格式固定、被jvm虛擬機所識別和調用
3. 主函數是public,權限必須是最大的
4. 主函數必須是static,因爲主函數不需要由對象來調用
4. 主函數必須是void,沒有具體的返回值
5. Main:函數名,不是關鍵字,只是一個jvm識別的固定的名字
6. String[] args:args是主函數的參數列表,是一個數組類型的參數,而且元素都是字符串類型。
什麼時候使用static修飾符?
1. 靜態變量:當分析對象中所具備的值都是相同的,則這個成員就可以被靜態修飾。只要數據在
對象中是不同的,就是對象的特有數據,必須存儲在對象中,是非靜態的;如果是相同的數據,
對象不需要修改,只需要使用即可,不需要存儲在對象中,定義成靜態的。
2. 靜態函數:函數是否用靜態修飾,只參考一點,該函數功能是否有訪問到對象的特有數據。簡
單點說,從源代碼看,該功能是否需要訪問非靜態成員,如果需要,該功能就是非靜態的;如
果不需要,就可以將該功能定義成靜態的,當然,也可以定義成非靜態,但是非靜態需要被對
象調用,而僅創建對象訪問非靜態方法沒有訪問特有數據的方法,該對象的創建時沒有意義的。
靜態代碼塊:
1. 隨着類的加載而執行,而且只執行一次(注意:類只加載一次,即使執行兩次創建對象,也不會
執行兩次,因爲只加載一次)
2. 作用:用於給類進行初始化
3. 例如
class StaticCode
{
static int age = 0;
static {
age = age + 20;
}
static void show()
{
System.out.println(age);
}
}
class StaticCodeDemo
{
public static void main(String[] args)
{
StaticCode.show();
}
}
靜態代碼塊使用比較少,一般在類中全是靜態成員的時候可能會需要靜態代碼塊。
構造代碼塊:
1. 定義在類中沒有被static修飾的代碼塊,即爲構造代碼塊
2. 與靜態代碼塊不同,構造代碼塊可以給所有對象進行初始化,每次創建對象都會執行,在調用構造方法之前執行;注意與構造方法的差別,構造方法是用來給對應的對象進行針對性的初始化。
局部代碼塊:
1. 定義在方法中
2. 用於限定局部變量的生命週期