java带参数的构造方法_崤云说 | JAVA面向对象
點擊上面“藍字”關注我們
今天的崤云說,是研發部的周浩宇為大家帶來一篇JAVA技術分享
內容介紹
u?構造方法
1.1?構造方法介紹
在開發中經常需要在創建對象的同時明確對象的屬性值,比如員工入職公司就要明確他的姓名、年齡等屬性信息。
那么,創建對象就要明確屬性值,那怎么解決呢?也就是在創建對象的時候就要做的事情,當使用new關鍵字創建對象時,怎么給對象的屬性初始化值呢?這就要學習Java另外一門小技術,構造方法。
那什么是構造方法呢?從字面上理解即為構建創造時用的方法,即就是對象創建時要執行的方法。既然是對象創建時要執行的方法,那么只要在new對象時,知道其執行的構造方法是什么,就可以在執行這個方法的時候給對象進行屬性賦值。
l?構造方法的格式:
修飾符 構造方法名(參數列表)
{
}
l?構造方法的體現:
l?構造方法沒有返回值類型。也不需要寫返回值。因為它是為構建對象的,對象創建完,方法就執行結束。
l?構造方法名稱必須和類型保持一致。
l?構造方法沒有具體的返回值。
l?構造方法的代碼體現:
class?Person {
// Person的成員屬性age和name
private?int?age;
private?String name;
// Person的構造方法,擁有參數列表
Person(int?a, String nm) {
// 接受到創建對象時傳遞進來的值,將值賦給成員屬性
age?= a;
name?= nm;
}
}
1.2?構造方法調用和內存圖解
理解構造方法的格式和基本功能之后,現在就要研究構造方法是怎么執行的呢?在創建對象的時候是如何初始化的呢?
構造方法是專門用來創建對象的,也就是在new對象時要調用構造方法。現在來看看如何調用構造方法。
class?Person {
// Person的成員屬性age和name
private?int?age;
private?String name;
// Person的構造方法,擁有參數列表
Person(int?a, String nm) {
// 接受到創建對象時傳遞進來的值,將值賦給成員屬性
age?= a;
name?= nm;
}
public?void?speak() {
System.out.println("name="?+ name?+ ",age="?+ age);
}
}
class?PersonDemo {
public?static?void?main(String[] args) {
// 創建Person對象,并明確對象的年齡和姓名
Person p2 = new?Person(23, "張三");
p2.speak();
}
}
上述代碼演示了創建對象時構造方法的調用。即在創建對象時,會調用與參數列表對應的構造方法。
上述代碼的圖解:
l?圖解說明:
1、首先會將main方法壓入棧中,執行main方法中的?new Person(23,"張三");
2、在堆內存中分配一片區域,用來存放創建的Person對象,這片內存區域會有屬于自己的內存地址(0x88)。然后給成員變量進行默認初始化(name=null,age=0)。
3、執行構造方法中的代碼(age = a ; name = nm;),將變量a對應的23賦值給age,將變量nm對應的”張三賦值給name,這段代碼執行結束后,成員變量age和name的值已經改變。執行結束之后構造方法彈棧,Person對象創建完成。將Person對象的內存地址0x88賦值給p2。
1.3?默認構造方法和細節
在沒有學習構造方法之前,我們也可以通過new關鍵字創建對象,并調用相應的方法,同時在描述事物時也沒有寫構造方法。這是為什么呢?
在之前學習的過程中,描述事物時,并沒有顯示指定構造方法,當在編譯Java文件時,編譯器會自動給class文件中添加默認的構造方法。如果在描述類時,我們顯示指定了構造方法,那么,當在編譯Java源文件時,編譯器就不會再給class文件中添加默認構造方法。
class ?Person {
//如果沒有顯示指定構造方法,編譯會在編譯時自動添加默認的構造方法
//Person(){}??//空參數的默認構造方法
}
當在描述事物時,要不要在類中寫構造方法呢?這時要根據描述事物的特點來確定,當描述的事物在創建其對象時就要明確屬性的值,這時就需要在定義類的時候書寫帶參數的構造方法。若創建對象時不需要明確具體的數據,這時可以不用書寫構造方法(不書寫也有默認的構造方法)。
l?構造方法的細節:
1、一個類中可以有多個構造方法,多個構造方法是以重載的形式存在的
2、構造方法是可以被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;
}
}
1.4?構造方法和一般方法區別
到目前為止,學習兩種方法,分別為構造方法和一般方法,那么他們之間有什么異同呢?
構造方法在對象創建時就執行了,而且只執行一次。
一般方法是在對象創建后,需要使用時才被對象調用,并可以被多次調用。
l?問題:
有了構造方法之后可以對對象的屬性進行初始化,那么還需要對應的set和get方法嗎?
需要相應的set和get方法,因為對象在創建之后需要修改和訪問相應的屬性值時,在這時只能通過set或者get方法來操作。
思考,如下代碼有問題嗎?
class?Person {
void?Person() {
}
}
class?PersonDemo {
public?static?void?main(String[] args) {
Person p?= new?Person();
}
}
1.5?知識點總結
l?構造方法:用來給類的成員進行初始化操作
l?格式:
修飾符 類名 (參數列表) {
...
}
l?構造方法的特點:
l?1, 方法名與類名相同
l?2,沒有返回值,也沒有返回值類型,連void也沒有
l?構造方法什么時候會被調用執行?
只有在創建對象的時候才可以被調用
l?繼承中的構造方法注意事項:
1,如果我們手動給出了構造方法,編譯器不會在給我們提供默認的空參數構造方法
如果我們沒寫任何的構造方法,編譯器提供給我們一個空參數構造方法
2, 在構造方法中,默認的第一條語句為 super();
它是用來訪問父類中的空參數構造方法,進行父類成員的初始化操作
3, 當父類中沒有空參數構造方法的時候,怎么辦?
a: 通過 super(參數) 訪問父類有參數的構造方法
b: 通過 this(參數) 訪問本類中其他構造方法
???注意:[本類中的其他構造方法已經能夠正常訪問父類構造方法]
4, super(參數) 與 this(參數) 不能同時在構造方法中存在
總結
以上是生活随笔為你收集整理的java带参数的构造方法_崤云说 | JAVA面向对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何让excel表格排头一直都在_Exc
- 下一篇: 日语输入法电脑版_日语输入法下载及使用教