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 } } 

构造函数的目的是逃避我,但是到目前为止,我们所做的一切都是非常简单的。

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

从官方的Java教程 :

一个类包含被调用来从类蓝图创build对象的构造函数 。 构造函数声明看起来像方法声明 – 除了它们使用类的名称并且没有返回types。 例如,Bicycle有一个构造函数:

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

为了创build一个名为myBike的新的自行车对象,一个构造函数被新的运算符调用:

自行车myBike =新自​​行车(30,0,8);

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

虽然Bicycle只有一个构造函数,但它也可以有其他构造函数,包括一个无参数的构造函数:

公共自行车(){齿轮= 1; 节奏= 10; 速度= 0; }

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

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

假设你想让你的类有一个单一的整数字段,它应该总是大于零。 你如何以一种可靠的方式做到这一点?

 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; } } 

在上面的代码中,它可能看起来像是在做一些多余的事情,但实际上你确保这个数字总是有效的,不pipe是什么。

“初始化类的实例”是一个构造函数,但不是我们有构造函数的原因。 问题是关于构造函数的目的。 你也可以在上面的例子中使用c.setNumber(10)来初始化外部类的实例。 所以构造函数不是初始化实例的唯一方法。

构造函数是这样做的,但是安全 。 换句话说,仅仅一个类就解决了确保对象始终处于有效状态的整个问题。 不使用构造函数会将这种validation留给外界,这是不好的devise。

这是另一个例子:

 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类表示一个时间间隔。 时间长存储。 有一个时间间隔结束之前没有任何意义。 通过使用像上面那样的构造函数,在系统中任何时候任何时候都不可能有一个Interval的实例,存储一个没有意义的区间。

正如LotusUNSW中所提到的答案构造函数用于初始化类的实例。

例:

假设你有一个类似的Animal

 class Animal{ private String name; private String type; } 

让我们看看当你尝试创build一个Animal类的实例时会发生什么,比如一个名为PuppyDog 。 现在你必须初始化name = Puppytype = Dog 。 那么,你怎么能做到这一点。 这样做的一个方法是像一个构造函数

  Animal(String nameProvided, String typeProvided){ this.name = nameProvided; this.type = typeProvided; } 

现在当你创build一个类Animal的对象时,像Animal dog = new Animal("Puppy", "Dog"); 你的构造函数被调用,并初始化名称和types为您提供的值,分别为小狗和狗。

现在你可能会问,如果我没有提供一个参数给我的构造函数的话

 Animal xyz = new Animal(); 

这是一个default Constructor ,初始化对象的默认值,即在我们的Animal类的nametype值对应的xyz对象将是name = nulltype = null

  • 通过一个构造函数(带参数),你可以“请求”该类的用户所需的依赖关系。
  • 它用于初始化实例variables
  • 并将parameter passing给一个超级类( super(...) )的构造函数,它基本上是一样的
  • 它可以用代码初始化(最终)实例variables,这可能会抛出exception,而不是实例初始化器的作用域
  • 一个人应该盲目地从构造函数中调用方法,因为初始化可能不会在本地或派生类中完成/足够。

构造函数在创build时初始化一个对象。 它和它的类具有相同的名称,在语法上类似于一个方法,但构造函数没有返回types。 通常情况下,我们使用构造函数为类定义的实例variables赋予初始值,或者执行任何其他需要创build完全形成的对象的启动过程。

这是一个构造函数的例子:

 class queen(){ int beauty; queen(){ beauty = 98; } } class constructor demo{ public static void main(String[] args){ queen arth = new queen(); queen y = new queen(); System.out.println(arth.beauty+" "+y.beauty); } } 

输出是:

 98 98 

这里的build设是:

 queen(){ beauty =98; } 

现在轮到参数化的构造函数。

  class queen(){ int beauty; queen(int x){ beauty = x; } } class constructor demo{ public static void main(String[] args){ queen arth = new queen(100); queen y = new queen(98); System.out.println(arth.beauty+" "+y.beauty); } } 

输出是:

 100 98 

它被用来设置你的课程的内容和状态。 虽然这是真的,你可以使用主要方法更简单的例子,每个应用程序只有一个主要的方法,所以它不是一个明智的做法。

考虑简单地启动你的程序的主要方法,应该只知道如何做到这一点。 还要注意,main()是静态的,所以不能调用需要类实例和相关状态的函数。 主要的方法应该调用新的Program()。函数()和程序构造函数不应该调用函数(),除非它是需要的类的设置。

类定义为您的类定义了API。 换句话说,这是一个蓝图,它定义了类和客户之间存在的契约 – 使用这个类的所有其他代码。 合约指出哪些方法可用,如何调用它们,以及期望得到什么回报。

但是类定义是一个规范。 直到你有这个阶级的实际对象,合同只是“一张纸”。 这是构造函数进来的地方。

构造函数是通过在内存中创build对象并返回对其的引用来创build类的实例的方法。 应该在构造函数中发生的事情是对象处于适当的初始状态,以便对对象的后续操作有意义。

从构造函数返回的这个对象现在将遵守类定义中指定的契约,并且可以使用这个对象来做真正的工作。

想想这样。 如果你看过保时捷网站,你会看到它能做什么 – 马力,扭矩等等。但是,直到你有一辆保时捷才能驾驶,这并不好玩。

希望有所帮助。

构造函数基本上用于在创build对象时初始化variables

Java构造函数与它所属的类的名称相同。

构造函数的语法不包含返回types,因为构造函数从不返回值。

构造函数总是在创build对象时调用。 例如: – 默认构造函数

 class Student3{ int id; String name; void display(){System.out.println(id+" "+name);} public static void main(String args[]){ Student3 s1=new Student3(); Student3 s2=new Student3(); s1.display(); s2.display(); } } 

输出:

 0 null 0 null 

说明:在上面的类中,没有创build任何构造函数,因此编译器为您提供了一个默认的构造函数。这里默认的构造函数提供了0和空值。

参数化构造函数的示例

在这个例子中,我们创build了具有两个参数的Student类的构造函数。 我们可以在构造函数中有任意数量的参数。

 class Student4{ int id; String name; Student4(int i,String n){ id = i; name = n; } void display(){System.out.println(id+" "+name);} public static void main(String args[]){ Student4 s1 = new Student4(111,"Karan"); Student4 s2 = new Student4(222,"Aryan"); s1.display(); s2.display(); } } 

输出:

 111 Karan 222 Aryan 

我认为一个构造函数可能像一个数据库,只有它定义variables和方法来控制它们

然后我看到使用未在其构造函数中定义的variables和方法的对象。 因此,对我来说最有意义的讨论就是对variables值进行有效性testing的讨论,但是类可以创build未在构造函数中定义的variables和方法 – 不像数据库那样,更像是蒸汽上的超压阀机车。 它不控制车轮等。

比我想象的要less得多的定义。

构造函数将有助于防止实例获取不真实的值。 举个例子,身高,体重的人不能有0m和0kg的人