java构造方法基础_Java 基础:构造方法
目錄:
一、 概述
二、 構造方法的重載
三、 類的初始化過程
四、this 關鍵字
五、子父類中的構造方法
六、 super 關鍵字
七、 static 關鍵字
八、 final 關鍵字
一、 概述
1. 構造方法作用和定義
構造方法作用:new 對象的同時給成員變量賦值,給對象屬性進行 初始化
構造方法定義:
修飾符 構造方法名 (參數列表){
}
2. 構造方法的特點
構造方法 沒有返回值類型,連 void 也沒有
也不需要寫返回值。因為它是為構建對象的,對象創建完,方法就執行結束。
構造 方法名 必須和 類名 保持一致
只有在 創建對象 的時候 自動 調用執行,而且只執行 一次
3. 注意事項
每一 class 類都 必須有一個構造方法,如果自己不寫,系統會給出 默認 構造方法
編譯 的時候,系統會自動檢查類中是否有構造方法,如果沒有編譯器就會自動添加一個構造方法
如果你提供了構造方法,系統將不再提供默認的構造方法
構造方法也是可以 重載 的
在創建對象時,會調用與 參數列表對應 的構造方法
構造方法的內存圖
構造方法
二、 構造方法的重載
一個類中可以有 多個 構造方法,多個構造方法是以 重載 的形式存在的
意義在于:可以根據不同的需求,定義不同的構造方法,靈活地初始化對象的成員變量
構造方法是可以被 private 修飾,作用是:其他程序無法創建該類的對象
class Person {
private int age;
private String name;
// 私有無參數的構造方法,即外界不能通過new Person();語句創建本類對象
private Person() {
}
// 多個構造方法是以重載的形式存在
Person(int a) {
age = a;
}
Person(String nm, int a) {
name = nm;
age = a;
}
}
三、 類的初始化過程
Student s = new Student(); 在內存中做了哪些事情?
加載 Student.class 文件進入內存
在棧內存為 s 開辟空間
在堆內存為學生對象開辟空間
對學生對象的成員變量進行默認初始化
對學生對象的成員變量進行顯示初始化
通過構造方法對學生對象的成員變量賦值
學生對象初始化完畢,把對象地址賦值給 s 變量
類的初始化過程內存圖
完整對象初始化過程
四、this 關鍵字
1. this 關鍵字:本類對象的引用
this 是在方法中使用的,哪個對象調用了該方法,那么, this 就代表調用該方法的對象引用
this 什么時候存在的? 當創建對象的時候, this 就存在了
this 的作用:用來區別同名的成員變量與局部變量(this .成員變量)
2. 成員變量隱藏
在局部變量作用域中,如果定義了一個和成員變量同名的局部變量,此時,在局部變量作用域中,就無法用變量名訪問到成員變量,而只能訪問到同名的局部變量
當需要訪問成員變量是,只需要在成員變量前面加上 this. 即可
調用其他構造方法的語句 必須 定義在構造方法的 第一行,原因是初始化動作要 最先執行。
五、子父類中的構造方法
1. 調用
在創建子類對象時,父類的構造方法會 先執行,因為子類中所有構造方法的第一行有默認的隱式 super(); 語句,它是用來訪問父類中的空參數構造方法,進行父類成員的初始化操作
this()是調用本類的構造方法,super() 是調用父類的構造方法, 且兩條語句 不能同時存在
無論如何,子類的所有構造方法,直接或間接 必須調用 到父類構造方法; 子類的構造方法什么都不寫,默認 的構造方法第一行super()
子類初始化內存圖:
子類初始化
2. 當父類中沒有無參數構造方法的時候,怎么辦?
通過super(參數) 訪問父類有參構造方法
通過 this(參數) 訪問本類中其他構造方法
注意:本類中的其他構造方法必須已經能夠正常訪問父類構造方法
3. 為什么子類對象創建都要訪問父類中的構造方法?
因為子類繼承了父類的內容,所以創建對象時,必須要先看父類是如何對其內容進行初始化的。
所以子類在初始化時,必須先到父類中去執行父類的初始化動作。這樣,才可以使用父類中的內容。
總結:子類的初始化要保證,在初始化子類成員之前,必須首先初始化父類成員,因為,子類功能的實現,常常會依賴父類,所以在初始化的時候,保證先初始化父類,再初始化子類
4. 創建子類對象過程的細節
如果子類的構造方法 **第一行寫了 this **調用了本類其他構造方法,那么 super 調用 父類的語句還有嗎?
這時是沒有的,因為 this() 或者 super(),只能定義在構造方法的第一行,因為初始化動作要先執行。
父類構造方法中是否有隱式的 super 呢?
也是有的。只要是構造方法默認第一行都是 super();
六、 super 關鍵字
指的是父類的存儲空間(理解為父類的引用)
調用父類的成員變量:
super.成員變量;
調用父類的構造方法:
super(參數);
調用方法的成員方法:
super.成員方法();
關鍵字super 可以在任意的非靜態方法中使用
七、 static 關鍵字
1. static 特點
被 static 修飾的成員變量 屬于類,不屬于這個類的某個對象。優先于對象存在,被類的所有對象共享
也就是說,多個對象在訪問或修改 static 修飾的成員變量時,其中一個對象將 static 成員變量值進行了修改,其他對象中的 static 成員變量值會跟著改變,即多個對象共享同一個 static 成員變量
被 static 修飾的成員可以并且建議通過 類名 直接訪問
訪問靜態成員的格式:
類名.靜態成員變量名
類名.靜態成員方法名(參數)
對象名.靜態成員變量名 ------不建議使用該方式,會出現警告
對象名.靜態成員方法名(參數) -----不建議使用該方式,會出現警告
2. static 注意事項
靜態內容是優先于對象存在的,只能訪問靜態 。靜態修飾的內容存于內存的 靜態區。
main 方法為靜態方法,僅僅為程序執行入口,它不屬于任何一個對象,可以定義在任意類中
靜態上下文中,不能引用非靜態的成員變量或成員方法
靜態方法中無法訪問普通成員; 靜態成員方法中,不能調用非靜態的成員方法(靜態只能訪問/調用靜態)
在靜態上下文中,無法使用 this/super 關鍵字, 因為 this/super 指代的是對象
3. 靜態變量和成員變量的區別
所屬不同
靜態變量屬于 類,所以也稱為為 類變量。
成員變量屬于 對象,所以也稱為 實例變量(對象變量)
內存中位置不同
靜態變量存儲于方法區的靜態區
成員變量存儲于堆內存
內存出現時間不同
靜態變量隨著 類 的加載而加載,隨著類的消失而消失
成員變量隨著 對象 的創建而存在,隨著對象的消失而消失
調用不同
靜態變量可以通過類名調用,也可以通過對象調用
成員變量只能通過 對象名 調用
靜態變量和方法的初始化內存圖:
靜態變量和方法的初始化
4. 定義靜態常量
public static final 修飾的變量來完成定義,此時 變量名用全部大寫,多個單詞使用 下劃線 連接
public static final 數據類型 變量名 = 值;
當我們想 使用類的靜態成員 時,不需要創建對象,直接使用類名 來訪問即可
接口中的每個成員變量都 默認 使用public static final 修飾。
所有接口中的成員變量已是 靜態常量,由于接口沒有構造方法,所以必須 顯示 賦值。可以直接用 接口名 訪問。
八、 final 關鍵字
1. 概述
繼承的出現提高了代碼的復用性,并方便開發。但隨之也有問題,有些類在描述完之后,不想被繼承,或者有些類中的部分方法功能是固定的,不想讓子類重寫??墒钱斪宇惱^承了這些特殊類之后,就可以對其中的方法進行重寫,那怎么解決呢?
要解決上述的這些問題,需要使用到一個關鍵字 final , final 的意思為最終,不可變。 final 是個修飾符,它可以用來修飾 類,類的成員,以及局部變量
2. 特點
final 修飾 類 不可以被繼承,但是可以繼承其他類。
final 修飾的 方法不可以被覆蓋,但父類中沒有被 final 修飾方法,子類覆蓋后可以加 final
final 修飾的 變量 稱為常量,這些變量只能賦值一次。
final 修飾的 引用類型的變量 值為對象地址值,地址值不能更改,但是地址內的對象屬性值可以修改
final 修飾 成員變量 ,需要在創建對象前賦值,否則報錯。(當沒有顯式賦值時,多個構造方法的均需要為其賦值。)
3. 自定義常量的初始化
自定義常量的初始化,可以通過 構造方法 來初始化
注意事項: 如果通過構造方法,來對自定義常量進行初始化,要保證,每一個構造方法中 都必須有初始化自定義常量的初始化語句
總結
以上是生活随笔為你收集整理的java构造方法基础_Java 基础:构造方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java的源代码文件扩展名_【单选题】J
- 下一篇: java图像分类源码_在Android设