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

  • 相关阅读:
    BZOJ2286 [Sdoi2011]消耗战 【虚树 + 树形Dp】
    BZOJ1305 [CQOI2009]dance跳舞 【网络流】
    BZOJ1452 [JSOI2009]Count 【树套树 (树状数组)】
    BZOJ1103 [POI2007]大都市meg 【树剖】
    BZOJ1927 [Sdoi2010]星际竞速 【费用流】
    POJ3450 Corporate Identity 【后缀数组】
    POJ3623 Best Cow Line, Gold 【后缀数组】
    POJ3415 Common Substrings 【后缀数组 + 单调栈】
    关于线上bug
    关于线上bug
  • 原文地址:https://www.cnblogs.com/weststar/p/12362280.html
Copyright © 2011-2022 走看看