构造器是一种不带返回值的特殊方法
▲构造器规则
(1)构造器用于初始化对象;
(2)构造器如何调用?必须使用new来调用构造器,这样可以返回一个初始化完成的对象;
(3)如果不为一个类指定构造器,系统会自动为该类提供无参数的构造器;
一、使用构造器执行初始化:
构造器最大的作用是创建对象时,执行初始化。如果想改变默认的初始化的值,想让系统创建对象时就为该对象的实例变量显示地指定初始值,就可以通过构造器来实现。
1 class ConstructorTest 2 { 3 //定义成员变量 4 public String name; 5 public static int age; 6 7 //提供自定义构造器,对成员变量进行赋值 8 public ConstructorTest(String name,int age) 9 { 10 this.name=name; 11 this.age=age; 12 } 13 14 public static void main(String[] args) 15 { 16 System.out.println(ConstructorTest.age); 17 18 var tc=new ConstructorTest("java",20); 19 System.out.println(tc.name); 20 System.out.println(tc.age); 21 } 22 } 23 ---------- 运行Java捕获输出窗 ---------- 24 0 25 java 26 20 27 28 输出完成 (耗时 0 秒) - 正常终止
二、构造器重载
同一个类里具有多个构造器,多个构造器的形参列表不同,即被称为构造器重载。构造器重载允许Java类里包含多个初始化逻辑,从而允许使用不同构造器来初始化Java对象。
★构造器重载
一个类中可以定义额多个构造器(构造器的名字都相同,与类名相同),通过形参变量来区分构造器
▲this引用,this后紧跟一个.
this.name
this.foo()
▲this调用:this后紧跟括号
this(参数);
this调用同一个类中重载的构造器——this调用只能出现在构造器
1 class ConstructorOverload 2 { 3 public String name; 4 public int age; 5 //提供无参数的构造器 6 public ConstructorOverload(){} 7 8 //带有两个形参的初始化 9 public ConstructorOverload(String name,int age) 10 { 11 this.name=name; 12 this.age=age; 13 } 14 public static void main(String[] args) 15 { 16 var oc1=new ConstructorOverload(); 17 var oc2=new ConstructorOverload("Java SE",5); 18 System.out.println("oc1.name:"+oc1.name+";oc1.age:"+oc1.age); 19 System.out.println("oc2.name:"+oc2.name+";oc2.age:"+oc2.age); 20 } 21 } 22 ---------- 运行Java捕获输出窗 ---------- 23 oc1.name:null;oc1.age:0 24 oc2.name:Java SE;oc2.age:5 25 26 输出完成 (耗时 0 秒) - 正常终止
如果系统中包含多个构造器,其中一个构造器执行体里完全包含另一个构造器的执行。如图所示
如果出现这种包含关系,可以在构造器B中调用构造器A。但构造器不能直接调用,必须使用new关键字调用,但一旦使用new关键字调用构造器就创建一个新的对象。为了在构造器B中调用构造器A中的初始化代码,又不会重新创建一个新的对象,可以使用this关键字来调用相应的构造器。
1 class Apple 2 { 3 private String name; 4 private String color; 5 private double weight; 6 7 //不带参数的构造器 8 public Apple(){} 9 10 //带两个参数的构造器 11 public Apple(String name,String color) 12 { 13 this.name=name; 14 this.color=color; 15 } 16 17 //带三个参数的构造器 18 public Apple(String name,String color,double weight) 19 { 20 //通过this调用另一个重载的构造器 21 this(name,color); 22 this.weight=weight; 23 } 24 public static void main(String[] args) 25 { 26 var p1=new Apple(); 27 var p2=new Apple("apple","red"); 28 var p3=new Apple("apple2","blue",0.5); 29 30 System.out.println(p1.name+" "+p1.color+" "+p1.weight); 31 System.out.println(p2.name+" "+p2.color+" "+p2.weight); 32 System.out.println(p3.name+" "+p3.color+" "+p3.weight); 33 } 34 } 35 ---------- 运行Java捕获输出窗 ---------- 36 null null 0.0 37 apple red 0.0 38 apple2 blue 0.5 39 40 输出完成 (耗时 0 秒) - 正常终止
使用this调用另外一个重载的构造器只能在构造器中使用,而且必须作为构造器执行体的第一条语句。
用this调用构造器时,系统会根据this后的括号里实参来调用形参列表与之对应的构造器。