構造方法
其實在寫好一個自定義的類時,這個類本身就有一個默認的空參數構造方法,只是不用自己去寫出來,但是在有些時候,需要對它的成員變量在創建對象的時候就進行初始化值,這時就需要重寫構造方法,也就是構造器。
構造方法的作用就是對成員變量進行默認初始化值。
構造方法的定義格式
修飾符 方法名(參數列表){
}
修飾符:也就是它的權限問題
方法名:定義必須和類名完全一致
參數列表:如果需要對成員變量在創建對象的時候就進行賦值,就寫參數,如果不需要,不需要寫參數列表。
構造方法在創建對象的時候就運行了,具體代碼演示如下:
l Person類
package cn.itcast.ConstructorMethod; /* * 構造方法的創建 */ public class Person { //定義姓名,年齡,將其私有化 private String name; private int age; //構造方法,實驗這個構造方法是在什麼時候被運行的 public Person(){ System.out.println("我是一個空參數的構造方法"); } //get方法set方法 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; } }
l 測試類
package cn.itcast.ConstructorMethod; /* * 測試構造方法是在什麼時候被運行的 */ public class Test { public static void main(String[] args) { //創建Person類對象 Person p = new Person(); } }
運行結果:
在創建對象的時候就對成員變量進行初始化值,具體的代碼演示如下:
l PersonName類
package cn.itcast.ConstructorMethod; /* * 創建構造方法 */ public class PersonName { //定義姓名 private String name; //重寫構造方法,對其傳入有參的參數,也就是姓名 public PersonName(String name){ this.name = name; } //get方法set方法 public String getName() { return name; } public void setName(String name) { this.name = name; } }
l 測試類
package cn.itcast.ConstructorMethod; /* * 測試構造方法是否在創建對象時初始化姓名值 */ public class TestName { public static void main(String[] args) { //創建PersonName類的對象,對構造方法初始化值,其實就是在調用這個構造方法 PersonName pm = new PersonName("王傑"); //查看一下是否在創建對象時對姓名進行初始化值 System.out.println(pm.getName()); } }
構造方法的重載
類中的構造方法可以有重載,只要其參數列表不同即可,下面用一段代碼來演示構造方法的重載:
l Person類
package cn.itcast.ConstructorMethodOverLoad; /* * 構造方法的重載 */ public class Person { //定義姓名,年齡 private String name; private int age; //構造方法的重載,空參構造方法 public Person(){ } //構造方法的重載,有參構造方法 public Person(String name,int age){ this.name = name; this.age = age; } //get方法set方法 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; } }
l 測試類
package cn.itcast.ConstructorMethodOverLoad; /* * 測試構造方法的重載 */ public class Test { public static void main(String[] args) { //創建Person類對象,調用空參構造方法 Person p = new Person(); p.setName("張三"); p.setAge(18); System.out.println(p.getName()); System.out.println(p.getAge()); //創建對象,調用有參的構造方法 Person p2 = new Person("李四", 19); System.out.println(p2.getName()); System.out.println(p2.getAge()); } }
運行結果:
構造方法和一般方法的區別:
構造方法在創建對象的時候就被調用了,並且只能執行一次,而一般方法在創建對象後,需要被使用纔會被對象所進行調用,一般方法可以被調用多次。
構造方法中this的作用
構造方法中this的作用就是將兩個構造方法進行連接,在一個空參構造方法中通過this的方式對成員進行賦值,可以和有參的構造方法進行聯繫,調用有參的構造方法,傳遞實際參數,具體的使用細節如下:
注意,this的使用必須寫在構造方法中的第一行。
l Person類
package cn.itcast.This; /* * 構造方法中this 的用法 */ public class Person { //定義姓名,年齡 private String name; private int age; //空參構造方法 public Person(){ this("張三",20); } //有參構造方法 public Person(String name,int age){ this.name = name; this.age = age; } //get方法和set方法 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; } }
l 測試類
package cn.itcast.This; /* * 測試類,測試構造方法中this的用法 */ public class Test { public static void main(String[] args) { //創建對象,調用空參構造方法 Person p = new Person(); System.out.println(p.getName()); System.out.println(p.getAge()); } }
構造方法中super關鍵字的用法
在子類中,可以使用super去調用父類的構造方法
super()調用的是父類空參數的構造方法
super(參數)調用的是父類中有參數的構造方法
注意:super必須寫在構造方法中的第一行,super和this,兩者有一個就可以了,如果子類繼承父類,子類都必須直接或間接訪問父類的構造方法。代碼演示如下:
l 人類
package cn.itcast.ConstructorMethodSuper; /* * 父類構造方法 */ public class Person { public Person(int a){ } }
l 學生類
package cn.itcast.ConstructorMethodSuper; /* * 子類繼承父類 * 子類構造方法直接或間接訪問父類構造方法 */ public class Student extends Person{ public Student(){ this(5);//調用本類構造方法,參數爲int的構造方法 } public Student(int a){ super(4);//調用父類的構造方法 } }
super的實例演示
l Person類
package cn.itcast.ConstructorMethodSuper實例; /* * 需求:有學生和工人兩個類,有其共有的屬性name和age,要求在創建這兩個對象時就對name和age賦值 * Person父類,學生和工人抽取的共有內容 * 成員變量私有,重寫構造方法,接收傳遞變量的值 * get,set方法用於獲取私有變量的值 */ public class Person { //私有變量name,age private String name; private int age; //重寫構造方法 public Person(String name,int age){ this.name = name; this.age = age; } //get,set方法 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; } }
l Student類
package cn.itcast.ConstructorMethodSuper實例; /* * 學生類,繼承Person類,重寫構造方法,將創建學生對象後賦的值傳遞給父類的構造方法 */ public class Student extends Person{ //重寫構造方法,創建Student對象時直接賦值name,age public Student(String name,int age){ //將值傳遞給父類的構造方法 super(name,age); } }
l Worker類
package cn.itcast.ConstructorMethodSuper實例; /* * 工人類,繼承Person類,重寫構造方法,將值傳遞給父類的構造方法中 */ public class Worker extends Person{ //重寫構造方法,創建Worker對象時直接賦值name,age public Worker(String name,int age){ //將值傳遞給父類構造方法 super(name, age); } }
l Test測試類
package cn.itcast.ConstructorMethodSuper實例; /* * 測試類 * 創建學生,工人對象時就對name,age賦值,獲取name,age的值 */ public class Test { public static void main(String[] args) { //創建Student對象並賦值 Student s = new Student("張三",30); //獲取name,age的值 System.out.println(s.getName()); System.out.println(s.getAge()); //創建Worker對象並賦值 Worker w = new Worker("李四",20); System.out.println(w.getName()); System.out.println(w.getAge()); } }
運行結果: