一.介紹
在Java中,任何變量在被使用前都必須先設(shè)置初值。Java提供了為類的成員變量賦初值的專門的方法稱之為構(gòu)造方法。
構(gòu)造方法是一種特殊的方法,它是一個(gè)與類同名且返回值類型為同名類類型的方法。對(duì)象的創(chuàng)建就是通過(guò)構(gòu)造方法來(lái)完成,其功能主要是完成對(duì)象的初始化。當(dāng)類實(shí)例化一個(gè)對(duì)象時(shí)會(huì)自動(dòng)調(diào)用構(gòu)造方法。構(gòu)造方法和其他方法一樣也可以重載。
二.知識(shí)點(diǎn)介紹
1、概念與功能
2、構(gòu)造方法特殊定義格式
3、默認(rèn)構(gòu)造方法
4、構(gòu)造方法的習(xí)慣性定義
5、構(gòu)造方法的使用解釋
6、構(gòu)造方法的注意事項(xiàng)
7、構(gòu)造方法與set方法、顯式初始化辨析
三.上課視頻對(duì)應(yīng)說(shuō)明文檔
1、構(gòu)造方法概念與功能
構(gòu)造方法是正常開發(fā)中不可或缺的一部分,是語(yǔ)法上必須存在的。是一個(gè)具有特殊格式的方法,且有特殊的調(diào)用方式。
(1)用來(lái)創(chuàng)建實(shí)例對(duì)象的方法,給對(duì)象的數(shù)據(jù)進(jìn)行初始化,如: Person p = new Person();?
調(diào)用構(gòu)造方法 Person();只是我們沒(méi)有寫這個(gè)方法,而是Java自動(dòng)補(bǔ)齊了這個(gè)方法,是方法就可以傳入?yún)?shù)。
(2)創(chuàng)建對(duì)象時(shí),可以直接為成員變量賦值,無(wú)需再在對(duì)象產(chǎn)生后再賦值。
(3)核心功能創(chuàng)建對(duì)象:只要方法被調(diào)用,就已經(jīng)創(chuàng)建了對(duì)象
(4)為成員變量賦值,在創(chuàng)建對(duì)象的同時(shí),通過(guò)構(gòu)造方法的方法體邏輯,為成員變量賦值,此時(shí)可以為帶參構(gòu)造
2、構(gòu)造方法特殊定義格式
一般定義在其他方法前,成員變量后。
奇怪的方法定義格式:沒(méi)有返回值類型定義,方法名與類名相同,參數(shù)依據(jù)需求而定。
public 類名(參數(shù)類型 參數(shù)1,參數(shù)類型 參數(shù)2){
//創(chuàng)建對(duì)象時(shí)要執(zhí)行的邏輯,經(jīng)常為成員變量賦值
}
如:
public class Person{
private String name;
private int age;
//兩個(gè)構(gòu)造方法為重載關(guān)系
public Person() {} //空參的構(gòu)造方法
public Person(String name,int age) { //帶參的構(gòu)造方法
this.name = name;
this.age = age;
}
}
代碼示例:
package cn.javahelp;
/*
* 自定義類型Person 類
*
* name? age
*
* 吃? 睡
*
* 構(gòu)造方法?
*
* 核心功能創(chuàng)建對(duì)象? 只要方法被調(diào)用,就已經(jīng)創(chuàng)建了對(duì)象
* 為成員變量賦值,在創(chuàng)建對(duì)象的同時(shí),通過(guò)構(gòu)造方法的方法體邏輯,為成員變量賦值,此時(shí)可以為帶參構(gòu)造
*
* 定義格式 一般定義在其他方法前,成員變量后。
*
* public 類名(參數(shù)類型 參數(shù)1,參數(shù)類型 參數(shù)2){
*? //創(chuàng)建對(duì)象時(shí)要執(zhí)行的邏輯,經(jīng)常為為成員變量賦值
* }
*
* 如果沒(méi)有手動(dòng)給出構(gòu)造方法? java會(huì)為我們自動(dòng)補(bǔ)齊一個(gè)空參的構(gòu)造方法
* 如果手動(dòng)給出任意構(gòu)造方法? java將不會(huì)為我們補(bǔ)齊空參構(gòu)造
*
*
* public 代表公共的? 任何包下都可以訪問(wèn)
* 默認(rèn)什么都不寫? 代表默認(rèn)權(quán)限? 當(dāng)前包下可以訪問(wèn)
* private? 代表私有? 本類中可以訪問(wèn)
*
*/
public class Person {
private String name;
private int age;
//定義無(wú)參構(gòu)造方法
Person(){
//方法邏輯
System.out.println("我是Person的無(wú)參構(gòu)造");
}
//定義帶參構(gòu)造一般都是為了給成員變量賦值
public Person(String name ,int age){
System.out.println("我是Person帶參構(gòu)造給成員變量賦值");
this.name = name;
this.age = age;
}
public Person(int number){
System.out.println("我是Person的帶參構(gòu)造,每次調(diào)用我打印n次i love java");
for (int i = 0; i < number; i++) {
System.out.println("i love java");
}
}
public void eat(){
System.out.println("吃");
}
public void sleep(){
System.out.println("吃");
}
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;
}
}
package cn.javahelp;
/*
* 測(cè)試構(gòu)造方法constructor
*/
public class Test {
public static void main(String[] args) {
Person p = new Person();
System.out.println(p.getName());
System.out.println(p.getAge());
System.out.println("--------------------");
Person p2 = new Person("柳巖",18);
System.out.println(p2.getName());
System.out.println(p2.getAge());
System.out.println("--------------------");
Person p3 = new Person(3);
System.out.println(p3.getName());
System.out.println(p.getAge());?
}
}
3、默認(rèn)構(gòu)造方法
構(gòu)造方法是必須存在的,如果沒(méi)有手動(dòng)給出構(gòu)造方法,Java會(huì)自動(dòng)為我們補(bǔ)齊一個(gè)空參的構(gòu)造方法。這個(gè)過(guò)程我們是看不到的。
如果手動(dòng)給出了構(gòu)造方法,java則不會(huì)再自動(dòng)補(bǔ)齊任何構(gòu)造。
4、構(gòu)造方法的習(xí)慣性定義
學(xué)習(xí)階段一般我們會(huì)定義至少兩個(gè)構(gòu)造方法:空參構(gòu)造與帶參構(gòu)造。
(1)空參構(gòu)造是習(xí)慣上存在的。后期一些情況要求我們必須提供空參構(gòu)造。
(2)帶參的構(gòu)造方法通常是為了給屬性賦值的。
構(gòu)造方法在定義時(shí),有時(shí)還會(huì)完成一些初始化動(dòng)作。
5、構(gòu)造方法的使用解釋
同其他方法相同,構(gòu)造方法也是先定義再使用。而不同的是,其他方法的調(diào)用是為了這個(gè)方法對(duì)應(yīng)的功能,而構(gòu)造方法的功能就是創(chuàng)建對(duì)象,同時(shí)可以為屬性賦值。我們?cè)诖酥皠?chuàng)建對(duì)象的方式均是通過(guò)構(gòu)造方法。
這樣當(dāng)對(duì)象創(chuàng)建出來(lái)后就已經(jīng)具備了非默認(rèn)值的初始值。
new 類型(實(shí)際參數(shù));?
//其結(jié)果就是產(chǎn)生了一個(gè)該類型的對(duì)象,具備一個(gè)地址值。
//可以賦值給一個(gè)這種類型的變量。
如:
Person p = new Person();? //產(chǎn)生了Person的對(duì)象
System.out.println(p);? //打印結(jié)果為一個(gè)對(duì)象地址值,如0x9a64
System.out.println(p.getName());? //打印結(jié)果為null
Person p2 = new Person(“AngelaBaby”,18); //產(chǎn)生了一個(gè)Person對(duì)象
System.out.println(p2);? //打印結(jié)果為一個(gè)對(duì)象地址值,如0252b2
System.out.println(p2.getName()); //打印結(jié)果為AngelaBaby
6、構(gòu)造方法的注意事項(xiàng)
構(gòu)造方法不能被繼承。
父類叫person 子類叫student 繼承構(gòu)造方法分不清對(duì)象? 繼承的構(gòu)造方法是public person 要求構(gòu)造方法和類名相同 所以和類名沖突了
構(gòu)造方法的public并不是固定不變的,我們?cè)趯W(xué)習(xí)完四種訪問(wèn)權(quán)限后,可以使用其他格式修飾構(gòu)造方法。

(看上面代碼,接口沒(méi)有構(gòu)造方法,抽象類具有構(gòu)造方法。)
7、構(gòu)造方法與set方法、顯式初始化辨析
構(gòu)造方法是為了在創(chuàng)建的同時(shí)直接為屬性賦值。
set方法時(shí)在創(chuàng)建對(duì)象之后,再重新為成員變量賦值,是修改值的過(guò)程。
顯示初始化會(huì)將每個(gè)對(duì)象都提供相同的初始化值,這樣的需求并不常見(jiàn)。
package cn.javahelp2;
/*
* 自定義類型 Animal 用來(lái)辨析 構(gòu)造方法給成員變量賦值? set方法給成員變量賦值? 顯示初始化賦值
*/
public class Animal {
private String name = "柳巖";
private int age;
//無(wú)參
public Animal(){
}
/**
* 帶參的構(gòu)造方法? 用來(lái)給成員變量賦值
* @param name 第一個(gè)參數(shù)需要一個(gè)名字
* @param age? 第二個(gè)參數(shù)需要一個(gè)年齡
*/
public Animal(String name,int age){
this.name = name;
this.age = age;
}
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;
}
}
package cn.javahelp2;
/*
* 測(cè)試
* 構(gòu)造方法給成員變量賦值? set方法給成員變量賦值? 顯示初始化賦值
* 顯示初始化? 所有對(duì)象一旦創(chuàng)建只要沒(méi)有對(duì)成員變量重新賦值 就是顯示初始化的值? 一般不這樣使用
*
* 構(gòu)造方法為成員變量賦值? 當(dāng)對(duì)象一創(chuàng)建就為成員變量賦值了
* set方法賦值? 當(dāng)創(chuàng)建好了一個(gè)對(duì)象后調(diào)用set方法賦值
*/
public class Test {
public static void main(String[] args) {
Animal a = new Animal();
System.out.println(a.getName());
System.out.println(a.getAge());
System.out.println("--------------");
Animal a2 = new Animal("劉柳",20);
a2.setName("劉艷");
System.out.println(a2.getName());
System.out.println(a2.getAge());
}
}