4.5 构造器详解

 构造器是一种不带返回值的特殊方法

▲构造器规则
(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后的括号里实参来调用形参列表与之对应的构造器。

猜你喜欢

转载自www.cnblogs.com/weststar/p/12362280.html
4.5