Java中构造函数的用途?

新手上路,请多包涵

构造函数的目的是什么?我一直在学校学习 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
    }
}

我不明白构造函数的用途,但话又说回来,到目前为止我们所做的一切都非常简陋。

原文由 gator 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 475
2 个回答

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

来自 官方 Java 教程

一个 _类包含构造函数_,这些构造函数被调用以从类蓝图创建对象。构造函数声明看起来像方法声明——只是它们使用类的名称并且没有返回类型。例如,Bicycle 有一个构造函数:

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

要创建一个名为 myBike 的新 Bicycle 对象,new 运算符会调用一个构造函数:

 Bicycle myBike = new Bicycle(30, 0, 8);

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

尽管 Bicycle 只有一个构造函数,但它可以有其他构造函数,包括无参数构造函数:

 public Bicycle() {
   gear = 1;
   cadence = 10;
   speed = 0;
}

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

原文由 LotusUNSW 发布,翻译遵循 CC BY-SA 4.0 许可协议

构造函数基本上是一种方法,您可以使用它来 确保您的类的对象天生有效。这是构造函数的主要动机。

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

 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 类代表一个时间间隔。时间使用 long 存储。在开始之前结束的间隔没有任何意义。通过使用像上面这样的构造函数,不可能在任何给定时刻在系统中的任何地方都有一个 Interval 的实例来存储一个没有意义的间隔。

原文由 Akira 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题