关于java对象的构造

这篇博客介绍了Java中对象构造的相关知识,包括构造器的重载、默认字段初始化、无参数构造器的使用以及如何调用同一类的其他构造器。文章通过示例代码展示了如何创建和初始化对象,并解释了如果类中没有无参数构造器时可能出现的错误。同时,还提供了一个名为`ConstructorTest`的程序实例,用于演示不同构造器的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于java对象的构造

java提供多种编写构造器的机制

重载

对于某一个类,可能有多个构造器,这些构造器的名字都一样,java可以通过不同的参数来辨别不同的构造器,这个功能叫做java的重载

如果多个方法出现了相同的名字,不同的参数,便出现了重载,这个时候编译器必须严格挑选出具体调用哪个方法,并进行匹配。如果找不到匹配的参数,便会出现编译错误,这个过程称为重载解析。

默认字段初始化

如果构造器中没有显式的为字段设置初值,那么就会被自动地赋为默认值

数值为0

布尔值为false

对象引用为null

无参数的构造器

无参数的构造器在重载中用到挺多。由无参数构造器创建的对象,对象的状态会设置为适当的默认值。

如果写一个类时没有编写构造器,那么java会自动给你提供一个无参数构造器,这个构造器将会给所有参数设置为初始值。

注意!!!

如果类中至少提供了一个构造器,但是没有提供无参数构造器,那么构造对象时如果没有提供参数那就是不合法的。这个时候程序将产生错误。

如果希望所有字段都设置为默认值,那么有下面的便捷方法:

new ClassName();
public ClassName(){};

调用另一个构造器

如果在一个构造器中调用另外的同类的构造器,这涉及到this的另一种用法。如果在一个构造器的第一行有this(…)表示调用同一个类的另一个构造器,通过this里面的参数进行匹配。

总结

下面是对上面代码的总的应用:

import java.util.*;

/**
 * This program demonstrates object construction.
 *
 * @author Cay Horstmann
 * @version 1.02 2018-04-10
 */
public class ConstructorTest {
    public static void main(String[] args) {
        // fill the staff array with three Employee objects
        var staff = new EmployeeFour[3];

        staff[0] = new EmployeeFour("Harry", 40000);
        staff[1] = new EmployeeFour(60000);
        staff[2] = new EmployeeFour();

        // print out information about all Employee objects
        for (EmployeeFour e : staff)
            System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary="
                    + e.getSalary());
    }
}

class EmployeeFour {
    private static int nextId;

    private int id;
    private String name = ""; // instance field initialization
    private double salary;

    // static initialization block
    static {
        var generator = new Random();
        // set nextId to a random number between 0 and 9999
        nextId = generator.nextInt(10000);
    }

    // object initialization block
    {
        id = nextId;
        nextId++;
    }

    // three overloaded constructors
    public EmployeeFour(String n, double s) {
        name = n;
        salary = s;
    }

    public EmployeeFour(double s) {
        // calls the Employee(String, double) constructor
        this("EmployeeFour #" + nextId, s);
    }

    // the default constructor
    public EmployeeFour() {
        // name initialized to ""--see above
        // salary not explicitly set--initialized to 0
        // id initialized in initialization block
    }

    public String getName() {
        return name;
    }

    public double getSalary() {
        return salary;
    }

    public int getId() {
        return id;
    }
}

下面是上面程序的输出:

name=Harry,id=9502,salary=40000.0
name=EmployeeFour #9503,id=9503,salary=60000.0
name=,id=9504,salary=0.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值