Java構(gòu)造方法\構(gòu)造器
說明,構(gòu)造器(constructor)
- 構(gòu)造器的修飾符可以是默認(rèn)的,也可以是public protected private
- 構(gòu)造器沒有返回值
- 方法名 和類名必須一樣
- 參數(shù)列表 和 成員方法一樣的規(guī)則
- 構(gòu)造器的調(diào)用系統(tǒng)完成
構(gòu)造器是類的一種特殊的方法,它的主要作用是完成對新對象的初始化。它有幾個(gè)特點(diǎn):
- 方法名和類名相同
- 沒有返回值
- 咋創(chuàng)建對象時(shí),系統(tǒng)會(huì)自動(dòng)的調(diào)用該類的構(gòu)造器完成對象的初始化,并不是創(chuàng)建對象
快速入門
package com.demo.day;
public class day02 {
public static void main(String[] args) {
Person1 p1 = new Person1("游書恒",21);
System.out.println("p1的信息如下:");
System.out.println("p1的對象name=" + p1.name);
System.out.println("p1的對象age=" + p1.age);
}
}
class Person1{
String name;
int age;
/*構(gòu)造器
1.構(gòu)造器沒有返回值,也不能寫void
2.構(gòu)造器的名稱和類Person1一樣
3.(String pName,int pAge)是形參列表,規(guī)則和成員方法一樣
*/
public Person1(String pName,int pAge){ //構(gòu)造方法名與類名一致、沒有返回值
System.out.println("構(gòu)造器被調(diào)用~~ 完成對象的屬性初始化");
name = pName;
age = pAge;
}
}
注意事項(xiàng)和細(xì)節(jié)1
- 一個(gè)類可以定義多個(gè)不同的構(gòu)造器,即構(gòu)造器的重載
- 構(gòu)造器和類名要相同
- 構(gòu)造器沒有返回值
- 構(gòu)造器是完成對象的初始化,不是創(chuàng)建對象
- 在創(chuàng)建對象時(shí),系統(tǒng)自動(dòng)調(diào)用該類的構(gòu)造方法
package com.demo.day;
public class day03 {
public static void main(String[] args) {
Test t1 = new Test("king",21);
Test t2 = new Test("jack");
}
}
class Test{
String name;
int age; //默認(rèn) 0
//第一個(gè)構(gòu)造器
public Test(String pname ,int page){
name = pname;
age = page;
}
//第二個(gè)構(gòu)造器
public Test(String pname){
name = pname;
}
}
注意事項(xiàng)和細(xì)節(jié)2
- 如果程序員沒有定義構(gòu)造器,系統(tǒng)會(huì)自動(dòng)給類生成一個(gè)默認(rèn)無參構(gòu)造器
- 一旦定義了自己的構(gòu)造器,默認(rèn)的構(gòu)造器就覆蓋了,就不能再使用默認(rèn)的無參構(gòu)造器,除非顯式的定義一下,即:Dog(){}
class Dog{
String name;
int age;
}
此時(shí)的 Dog 類只有一個(gè)默認(rèn)的無參構(gòu)造器,我們用javap反編譯來查看:

下面我們來定義一個(gè)有參構(gòu)造器:
class Dog{
String name;
int age;
//默認(rèn)構(gòu)造器
public Dog(String pname){
name = pname;
}
}

可以看到我們自定義的有參構(gòu)造器,但與此同時(shí)我們默認(rèn)隱士的無參構(gòu)造器也被覆蓋了,這意味著往后創(chuàng)建該類的對象時(shí)都不能再以無參的方式去創(chuàng)建,除非顯式的定義一下:
class Dog{
String name;
int age;
//默認(rèn)構(gòu)造器
public Dog(){
}
//自定義構(gòu)造器
public Dog(String pname){
name = pname;
}
}
構(gòu)造器流程分析
class Person{
int age = 90; //缺省0
String name; //缺省null
Person(String n,int a){
name = n;//給屬性賦值
age = a;
}
}
Person p = new Person("小倩",20);
- 加載Person類信息(Person.class),只會(huì)加載一次
- 在堆中分配空間(地址)
- 完成對象的初始化
- 【3.1 默認(rèn)初始化 age=0,name=null】
- 【3.2 顯式初始化age=90,name=null】
- 【3.3 構(gòu)造器初始化 age = 20】
- 把對象在堆中的地址返回給 p (p既是對象名,也是實(shí)際對象的引用)

浙公網(wǎng)安備 33010602011771號(hào)