1. 程式人生 > >java----day_12(面向物件)

java----day_12(面向物件)

目錄

構造方法

this

super


構造方法

  • 概念

      什麼是構造方法呢?從字面上理解即為構建創造時用的方法,即就是物件建立時要執行的方法。既然是物件建立時要執行的方法,那麼只要在new物件時,知道其執行的構造方法是什麼,就可以在執行這個方法的時候給物件進行屬性賦值。格式如下:

Person(String name,int age)//方法名和類名要一直,初始化person的資訊
{
    this.name = name;
    this.age = age;
}
  • 構造方法沒有返回值型別。也不需要寫返回值。因為它是為構建物件的,物件建立完,方法就執行結束。
  • 構造方法名稱必須和型別保持一致。
  • 構造方法沒有具體的返回值。
  • 構造方法呼叫和記憶體圖解

  • 圖解說明:
  1. 首先會將main方法壓入棧中,執行main方法中的 new Person(23,"張三");
  2. 在堆記憶體中分配一片區域,用來存放建立的Person物件,這片記憶體區域會有屬於自己的記憶體地址(0x88)。然後給成員變數進行預設初始化(name=nullage=0)。
  3. 執行構造方法中的程式碼(age = a ; name = nm;,將變數a對應的23賦值給age,將變數nm對應的張三賦值給name,這段程式碼執行結束後,成員變數
    agename的值已經改變。執行結束之後構造方法彈棧,Person物件建立完成。將Person物件的記憶體地址0x88賦值給p2
  • 預設構造方法和細節

      沒定義構造方法時,系統會自動給出一個空的構造方法,當描述的事物在建立其物件時就要明確屬性的值,這時就需要在定義類的時候書寫帶引數的構造方法。若建立物件時不需要明確具體的資料,這時可以不用書寫構造方法

  • 造方法的細節:
  1. 一個類中可以有多個構造方法,多個構造方法是以過載的形式存在的
  2. 構造方法是可以被private修飾的,作用:其他程式無法建立該類的物件。
  • 構造方法和一般方法的區別
  1. 構造方法在物件建立時就執行了,而且只執行一次。
  2. 一般方法是在物件建立後,需要使用時才被物件呼叫,並可以被多次呼叫。

有了構造方法初始化物件之後,還是需要相應的set和get方法,因為物件在建立之後需要修改和訪問相應的屬性值時,在這時只能通過set或者get方法來操作。

this

  • this 呼叫構造方法

構造方法無法通過構造方法名來相互呼叫,構造方法之間的呼叫,可以通過this關鍵字來完成。

public class Person {
	private String name;
	private int age;
	
	Person(String name){
		this.name = name;
	}
	
	Person(String name,int age){
		this(name);
		this.age = age;
	}
}
  •  this的原理圖解

  • 圖列說明:
  1. 先執行main方法,main方法壓棧,執行其中的new Person(“張三”,23);
  2. 堆記憶體中開闢空間,併為其分配記憶體地址0x33,,緊接著成員變數預設初始化(name=null  age = 0);
  3. 擁有兩個引數的構造方法(Person(String nm , int a))壓棧,在這個構造方法中有一個隱式的this,因為構造方法是給物件初始化的,那個物件呼叫到這個構造方法,this就指向堆中的那個物件。
  4. 由於Person(String nm , int a)構造方法中使用了this(nm);構造方法Person(String nm)就會壓棧,並將“張三”傳遞給nm。在Person(String nm , int a)構造方法中同樣也有隱式的this,this的值同樣也為0x33,這時會執行其中name = nm,即把“張三”賦值給成員的name。當賦值結束後Person(String nm , int a)構造方法彈棧。
  5. 程式繼續執行構造方法(Person(String nm , int a)中的age = a;這時會將23賦值給成員屬性age。賦值結束構造方法(Person(String nm , int a)彈棧。
  6. 當構造方法(Person(String nm , int a)彈棧結束後,Person物件在記憶體中建立完成,並將0x33賦值給main方法中的p引用變數。
  • 注意:
  • this到底代表什麼呢?this代表的是物件,具體代表哪個物件呢?哪個物件呼叫了this所在的方法,this就代表哪個物件。

呼叫其他構造方法的語句必須定義在構造方法的第一行,原因是初始化動作要最先執行。

  • 成員變數和區域性變數同名問題

當在方法中出現了局部變數和成員變數同名的時候,可以在成員變數名前面加上this.來區別成員變數和區域性變數

super

      在建立子類物件時,父類的構造方法會先執行,因為子類中所有構造方法的第一行有預設的隱式super();語句。子類會繼承父類中的內容,所以子類在初始化時,必須先到父類中去執行父類的初始化動作。這樣,才可以使用父類中的內容。當父類中沒有空引數構造方法時,子類的構造方法必須有顯示的super語句,指定要訪問的父類有引數構造方法

 

  • 子類物件建立過程的細節​​​​​​​
  • 如果子類的構造方法第一行寫了this呼叫了本類其他構造方法,那麼super呼叫父類的語句還有嗎?

這時是沒有的,因為this()或者super(),只能定義在構造方法的第一行,因為初始化動作要先執行。

  • 父類構造方法中是否有隱式的super呢?

也是有的。記住:只要是構造方法預設第一行都是super();

  • 父類的父類是誰呢?super呼叫的到底是誰的構造方法呢?

Java體系在設計,定義了一個所有物件的父類Object

  • 注意:

        類中的構造方法預設第一行都有隱式的super()語句,在訪問父類中的空引數構造方法。所以父類的構造方法既可以給自己的物件初始化,也可以給自己的子類物件初始化。如果預設的隱式super()語句在父類中沒有對應的構造方法,那麼必須在構造方法中通過this或者super的形式明確要呼叫的構造方法。