Java中构造函数的目的?

2022-09-01 21:29:47

构造函数的用途是什么?我一直在学校学习Java,在我看来,构造函数在我们迄今为止所做的事情中基本上是多余的。目的是否出现还有待观察,但到目前为止,它对我来说似乎毫无意义。例如,以下两个代码段之间有什么区别?

public class Program {    
    public constructor () {
        function();
    }        
    private void function () {
        //do stuff
    }    
    public static void main(String[] args) { 
        constructor a = new constructor(); 
    }
}

这就是我们被教导为作业做事的方式,但下面的不是做同样的事情吗?

public class Program {    
    public static void main(String[] args) {
        function();
    }        
    private void function() {
        //do stuff
    }
}

构造函数的目的逃脱了我,但话说回来,到目前为止,我们所做的一切都非常简陋。


答案 1

构造函数用于初始化类的实例。您可以使用构造函数创建新对象,这些对象通常具有指定初始状态或有关对象的其他重要信息的参数

来自官方 Java 教程

类包含用于从类蓝图创建对象的构造函数。构造函数声明类似于方法声明,只是它们使用类的名称并且没有返回类型。例如,Bicycle 有一个构造函数:

public Bicycle(int startCadence, int startSpeed, int startGear) {
    gear = startGear;
    cadence = startCadence;
    speed = startSpeed;
}

要创建一个名为 的 New Bike 对象,new 运算符将调用一个构造函数:myBike

自行车 myBike = new Bike(30, 0, 8);

new Bicycle(30, 0, 8)在内存中为对象创建空间并初始化其字段。

虽然 Bike 只有一个构造函数,但它可能还有其他构造函数,包括一个无参数构造函数:

公共自行车() { 档位 = 1; 踏频 = 10; 速度 = 0; }

Bicycle yourBike = new Bicycle();调用无参数构造函数来创建一个名为 yourBike 的新 Bicycle 对象。


答案 2

构造函数基本上是一种方法,可用于确保类的对象在生成有效。这是构造函数的主要动机。

假设您希望您的类具有一个应始终大于零的整数字段。您如何以可靠的方式做到这一点?

public class C {
     private int number;

     public C(int number) {
        setNumber(number);
     }

     public void setNumber(int number) {
        if (number < 1) {
            throws IllegalArgumentException("C cannot store anything smaller than 1");
        }
        this.number = number;
     }
}

在上面的代码中,它可能看起来像是在做一些多余的事情,但实际上你正在确保无论如何都要确保该数字始终有效。

“初始化类的实例”是构造函数的作用,但不是我们有构造函数的原因。问题是关于构造函数的用途。您还可以在上面的示例中使用,在外部初始化类的实例。因此,构造函数不是初始化实例的唯一方法。c.setNumber(10)

构造函数这样做,但以安全的方式。换句话说,一个类本身就解决了确保其对象始终处于有效状态的整个问题。不使用构造函数会将这种验证留给外部世界,这是糟糕的设计。

下面是另一个示例:

public class Interval {
    private long start;
    private long end;

    public Interval(long start, long end) {
        changeInterval(start, end);
    }

    public void changeInterval(long start, long end) {
        if (start >= end) {
            throw new IllegalArgumentException("Invalid interval.");
        }
        this.start = start;
        this.end = end;
    }
    public long duration() {
        return end - start;
    }
}

类表示时间间隔。时间是使用长存储的。在开始之前结束间隔没有任何意义。通过使用像上面这样的构造函数,不可能在系统中的任何给定时刻都有一个 Interval 实例来存储一个没有意义的间隔。