构造方法的简单介绍

本文详细介绍了Java中的构造方法,包括其作用、创建对象的步骤、构造器的特点、重载示例以及如何使用`this`关键字进行对象初始化和避免重复代码。还通过课后作业展示了如何定义和使用Point类以及构造方法的应用。

构造方法(构造器 constructor)

构造器勇于对象的初始化,而不是创建对象

创建对象的四步

  1. 分配对象空间,并将对象成员变量初始化为0或空
  2. 执行属性值的显示初始化
  3. 执行构造方法
  4. 返回对象的地址给相关的变量

声明格式:

[修饰符] 类名 (形参){

​ //语句;

}

构造器的4个特点

  1. 构造器通过new关键字调用!!
  2. 构造器是没有返回值的,同时也不能定义返回值类型(返回值的类型是本类的类型),不能在构造器里使用return返回某个值
  3. 构造器的方法名必须和类名一致
  4. 如果没有定义构造器,那么编译器就会自动定义一个无参的构造方法。

课后作业

/**
 * 定义一个“点”(Point)类用来表示二维空间中的点(有两个坐标)。要求如下:
 * 可以生成具有特定坐标的点对象。
 * 提供可以计算该“点”距另外一点距离的方法。
 */


package com.zxp;

public class Point {
    double x,y;

    public Point(double _x, double _y) {
        this.x = _x;
        this.y = _y;
    }

    public double getDistence(Point p){
        double d = Math.sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));
        return d;
    }

    public static void main(String[] args) {
        Point p1 = new Point(3.0,4.0);
        Point o = new Point(0.0,0.0);
        System.out.println(p1.getDistence(o));
    }
}

构造方法的重载

构造方法也是方法。与普通方法一样,也可以重载

例如:利用构造方法创建不同的用户对象

/**
 * 测试构造方法的重载
 */


package com.zxp;

public class TestUser {
    int id;
    String name;
    int age;
    char sex;

    public TestUser(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public TestUser(int id, String name, char sex){
        this.id = id;
        this.name = name;
    }

    public TestUser(int id, String name, int age, char sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }


    public static void main(String[] args) {
        TestUser s1 = new TestUser(1001,"zxp");
        TestUser s2 = new TestUser(1003,"zxp",'男');
        TestUser s3 = new TestUser(1002,"zxp",18,'男');
    }

}

注意事项:

  • 如果方法构造中形参与属性名相同,需要使用this关键字区分属性与形参。this.id表示属性id,id表示形参id。

this关键字

在这里插入图片描述

this的用法

  • 在普通方法中,this总是指向调用该方法的对象

  • 在构造方法中,this总是指向正要初始化的对象

    this的其他要点

  • this()调用重载的构造方法,避免相同的初始化代码,但只能在构造方法中用,并且必须位于构造方法的第一句
  • this不能用于static方法中
  • this是作为普通方法的"隐式参数",有系统传入到方法中
/**
 * 测试this的使用
 */
package com.zxp;

public class TestThis {
    int a;
    int b;
    int c;

    public TestThis() {
        System.out.println("你妈妈喊你回家吃饭");
    }

    public TestThis(int a,int b){
        //TestThis();//不能这样调用构造方法,
        this();//这样可以调用无参构造,并且this()必须放在第一位
        //a = a,不可以这样使用前面的a是构造方法里面的成员变量,而不是局部变量
        this.a = a;
        this.b = b;
    }

    public TestThis(int a, int b, int c) {
        this(a,b);
        this.c = c;
    }

    public void kickball(){
        System.out.println("我在踢球,为我加油!");
    }

    public static void main(String[] args) {
        TestThis t1 = new TestThis(2,3);
        t1.kickball();
    }
}
<think> 首先,用户的问题是:“我想查找在Java构造方法中设置默认值的方法 请问Java构造方法设置默认值的方法”。我需要基于提供的引用内容来回答。 回顾系统级指令: - 使用中文回答。 - 结构清晰,帮助用户逐步解决问题。 - 引用的段落末尾自然地添加引用标识。 - 生成相关问题。 - 所有行内数学表达式用$...$,但这里可能不涉及数学,所以忽略。 - 独立公式用$$...$$,但这里可能不适用。 - LaTeX语法正确,但同样可能不适用。 提供的引用: - 引用[1]:Java的默认构造方法。如果没有显式定义构造方法Java会提供一个默认的无参构造方法。 - 引用[2]:在Java中为DTO设置默认值的方法,包括使用构造函数、Builder模式等。 - 引用[3]:Java对象构造器设置字段默认值失效的问题,确保默认值不被覆盖。 - 引用[4]:Java构造方法/构造器,包括构造器重载、默认构造器被覆盖等。 用户的问题是关于在Java构造方法中设置默认值的方法。我需要综合引用内容来回答。 关键点: - 设置默认值可以通过构造方法来实现。 - 引用[2]提到使用构造函数设置默认值。 - 引用[4]展示了如何在构造方法中设置字段值。 - 引用[3]警告默认值可能被覆盖,需要小心。 步骤: 1. **解释构造方法的作用**:构造方法用于初始化对象的状态。可以设置字段的初始值。 2. **设置默认值的方法**: - **在构造方法中直接赋值**:在构造方法内部为字段设置值。 - **使用默认构造方法**:如果不提供构造方法Java提供默认无参构造方法,但它不设置具体值(除非字段有默认值)。 - **处理默认值失效问题**:如果定义了带参构造方法,默认构造方法会被覆盖;需要显式定义无参构造方法来设置默认值。 3. **示例**:提供一个简单Java代码示例来展示。 4. **最佳实践**:基于引用[2],提到其他方法如Builder模式,但焦点在构造方法上。 5. **添加引用标识**:在回答中自然地引用相关段落。 生成相关问题:指令要求生成相关问题,放在回答末尾。 回答结构: - 先介绍主题。 - 逐步解释方法。 - 提供代码示例。 - 添加引用。 - 最后生成相关问题。 代码示例:引用[4]有一个例子,我可以基于它修改。 最终回答: - 在构造方法中设置默认值。 - 确保默认值不被覆盖。 - 引用[2]提到DTO设置默认值,引用[3]提到避免失效。 生成相关问题: 1. 如何避免Java构造方法覆盖默认字段值? 2. Java中DTO的最佳实践是什么? 3. 构造方法重载时如何管理默认值? </think> ### Java构造方法中设置默认值的方法 在Java中,构造方法(Constructor)用于在创建对象时初始化对象的字段。设置默认值可以通过多种方式实现,核心思想是在构造方法中为字段赋予初始值。以下是基于引用内容的逐步解释和具体方法,确保代码可靠且易于理解。 #### 1. **理解构造方法设置默认值的基本原理** - Java在创建对象时自动调用构造方法。如果没有显式定义构造方法Java会提供一个默认的无参构造方法,但它通常不设置具体字段值(除非字段在声明时已有默认值)[^1]。 - 通过自定义构造方法,您可以直接在方法体内为字段赋值,从而设置默认值。例如,在构造方法中为字段赋予固定值或基于参数的逻辑值。 - 注意:一旦定义了自定义构造方法(如带参构造方法),默认的无参构造方法会被覆盖,导致无法直接使用无参方式创建对象。这可能引发默认值失效问题,需要显式处理[^3][^4]。 #### 2. **设置默认值的常用方法** 以下是几种常见方法,结合代码示例说明: - **方法一:在构造方法中直接赋值** 在构造方法内部,直接为字段设置默认值。如果参数为空或未提供,则使用默认值。 ```java public class Person { private String name; private int age; // 无参构造方法:设置默认值 public Person() { this.name = "Unknown"; // 默认值 this.age = 18; // 默认值 } // 带参构造方法:允许覆盖默认值 public Person(String name, int age) { this.name = name; // 使用传入参数 this.age = age; // 使用传入参数 } public static void main(String[] args) { Person p1 = new Person(); // 使用无参构造,默认值生效 System.out.println(p1.name); // 输出: Unknown System.out.println(p1.age); // 输出: 18 Person p2 = new Person("Alice", 25); // 带参构造,覆盖默认值 System.out.println(p2.name); // 输出: Alice System.out.println(p2.age); // 输出: 25 } } ``` - **优点**:简单直观,适合大多数场景。 - **注意**:如果只定义带参构造方法,无参构造方法会被覆盖,导致`new Person()`失败。此时必须显式定义无参构造方法以避免默认值失效[^3][^4]。 - **方法二:结合字段初始化和构造方法** 在字段声明时设置默认值,并在构造方法中覆盖(可选)。这确保了即使构造方法未赋值,字段也有安全默认值。 ```java public class Product { private String id = "P001"; // 声明时设置默认值 private double price = 0.0; // 默认值 // 无参构造方法:无需额外操作,默认值已设置 public Product() {} // 带参构造方法:选择性覆盖默认值 public Product(String id, double price) { this.id = id; // 覆盖id默认值 this.price = price; // 覆盖price默认值 } public static void main(String[] args) { Product p1 = new Product(); // 使用默认值 System.out.println(p1.id); // 输出: P001 Product p2 = new Product("P002", 99.9); // 覆盖默认值 System.out.println(p2.price); // 输出: 99.9 } } ``` - **优点**:避免构造方法中遗漏赋值,提高代码健壮性。 - **适用场景**:适合DTO(Data Transfer Object)或需要稳定默认值的对象,如在DTO设置默认值时推荐使用[^2]。 - **方法三:使用构造方法重载管理默认值** 通过多个重载的构造方法,提供灵活的默认值设置。例如,一个无参构造方法调用带默认参数的构造方法。 ```java public class User { private String username; private boolean isActive; // 无参构造方法:调用带默认参数的构造方法 public User() { this("guest", true); // 设置默认值 } // 带参构造方法 public User(String username, boolean isActive) { this.username = username; this.isActive = isActive; } public static void main(String[] args) { User u1 = new User(); // 使用默认值 System.out.println(u1.username); // 输出: guest } } ``` - **优点**:减少代码重复,支持多种初始化方式。 - **最佳实践**:在DTO或复杂对象中,结合Builder模式(如Lombok的`@Builder`)可以更优雅地设置默认值[^2]。 #### 3. **避免常见问题:默认值失效** - **问题原因**:如果只定义带参构造方法Java默认的无参构造方法会被覆盖。尝试使用`new ClassName()`会编译错误。 - **解决方案**: - 总是显式定义无参构造方法,并在其中设置默认值。 - 使用`this()`调用其他构造方法实现链式初始化(如方法三所示)。 - 参考引用[3],确保字段声明时的默认值不被构造方法中的赋值操作意外覆盖,例如通过条件检查[^3]。 #### 4. **总结与最佳实践** - **推荐方法**:在无参构造方法中设置默认值,并结合字段初始化,以确保对象始终有合理初始状态。 - **性能考虑**:构造方法设置默认值操作轻量,不影响性能。 - **适用场景**:适用于Java Bean、DTO、实体类等,提高代码可维护性和健壮性[^2][^4]。 通过以上方法,您可以灵活地在Java构造方法中设置默认值。如果有特定场景(如DTO),请参考相关最佳实践。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值