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

  • 相关阅读:
    LeetCode "Palindrome Partition II"
    LeetCode "Longest Substring Without Repeating Characters"
    LeetCode "Wildcard Matching"
    LeetCode "Best Time to Buy and Sell Stock II"
    LeetCodeEPI "Best Time to Buy and Sell Stock"
    LeetCode "Substring with Concatenation of All Words"
    LeetCode "Word Break II"
    LeetCode "Word Break"
    Some thoughts..
    LeetCode "Longest Valid Parentheses"
  • 原文地址:https://www.cnblogs.com/weststar/p/12362280.html
Copyright © 2020-2023  润新知