構造方法
8.1構造方法介紹
構造方法的格式:
修飾符 構造方法名(參數列表)
{
}
l 構造方法的體現:
n 構造方法沒有返回值類型。也不需要寫返回值。因為它是為構建對象的,對象創建完,方法就執行結束。
n 構造方法名稱必須和類名保持一致。
n 構造方法沒有具體的返回值。
構造方法的代碼體現
class Person {
// Person的成員屬性age和name
private int age;
private String name;
// Person的構造方法,擁有參數列表
Person(int a, String nm) {
// 接受到創建對象時傳遞進來的值,將值賦給成員屬性
age = a;
name = nm;
}
}
8.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();
}
}
1、首先會將main方法壓入棧中,執行main方法中的 new Person(23,"張三");
2、
3、在堆內存中分配一片區域,用來存放創建的Person對象,這片內存區域會有屬於自己的內存地址(0x88)。然后給成員變量進行默認初始化(name=null,age=0)。
4、執行構造方法中的代碼(age = a ; name = nm;),將變量a對應的23賦值給age,將變量nm對應的”張三賦值給name,這段代碼執行結束后,成員變量age和name的值已經改變。執行結束之后構造方法彈棧,Person對象創建完成。將Person對象的內存地址0x88賦值給p2。
8.3默認構造方法和細節
在之前學習的過程中,描述事物時,並沒有顯示指定構造方法,當在編譯Java文件時,編譯器會自動給class文件中添加默認的構造方法。如果在描述類時,我們顯示指定了構造方法,那么,當在編譯Java源文件時,編譯器就不會再給class文件中添加默認構造方法。
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;
}
}
8.4構造方法和一般方法區別
構造方法在對象創建時就執行了,而且只執行一次。
一般方法是在對象創建后,需要使用時才被對象調用,並可以被多次調用
this關鍵字
9.1this調用構造方法
構造方法之間的調用,可以通過this關鍵字來完成。
class Person {
// Person的成員屬性
private int age;
private String name;
// 無參數的構造方法
Person() {
}
// 給姓名初始化的構造方法
Person(String nm) {
name = nm;
}
// 給姓名和年齡初始化的構造方法
Person(String nm, int a) {
// 由於已經存在給姓名進行初始化的構造方法 name = nm;因此只需要調用即可
// 調用其他構造方法,需要通過this關鍵字來調用
this(nm);
// 給年齡初始化
age = a;
}
}
9.2this的原理圖解
package com.oracle.demo11;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name=name;
this.age=age;
}
public void speak(){
System.out.println("我叫"+this.name+",今年"+this.age+"歲了");
}
}
package com.oracle.demo11;
public class Test {
public static void main(String[] args) {
Person p=new Person("欣欣",16);
p.speak();
}
}
運行結果:
流程圖:
9.3成員變量和局部變量同名問題
當在方法中出現了局部變量和成員變量同名的時候,那么在方法中怎么區別局部變量成員變量呢?可以在成員變量名前面加上this.來區別成員變量和局部變量
package com.oracle.demo12;
public class Person {
private String name;
private int age;
private String gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Person(){
}
public Person(String n,int a,String g){
name=n;
age=a;
gender=g;
}
public void study(){
System.out.println("正在學習");
}
public void sleep(){
System.out.println("正在睡覺");
}
public void speak(){
System.out.println("我叫:"+name+",年齡為:"+age+",性別"+gender);
}
}
package com.oracle.demo12;
public class Test02 {
public static void main(String[] args) {
Person p=new Person("萌萌",23,"女");
p.speak();
p.study();
p.sleep();
Person p1=new Person();
p1.speak();
p1.study();
p1.sleep();
}
}
運行結果: