java构造函数有什么意义?

所以我正在学习java。 我已经进入了一个月,我刚刚学习了构造函数。 但我没有看到创造一个目的的全部目的。 我为什么以及何时想要使用它? 我完全了解它没有main方法,你可以从主类中调用构造函数。 任何人都可以在这个话题上给我启发,这对我有很大帮助。

构造函数是用于初始化/设置类实例的内容。

如果您的对象在可用之前需要进行一些处理(例如初始化成员),则应该在构造函数中执行此操作。

理想情况下,您永远不应该拥有“部分构建”的对象(即“实时”对象,您持有引用但尚未使用的对象)。 如果没有构造函数,您将永久地创建部分构建的对象,这非常容易出错。 (理论和实践并不总是匹配,但要记住这个想法。)

您使用构造函数来创建新对象。 是的,你可以只使用静态方法编写Java – 但是你真的不是在编写面向对象的代码,而且你也很难使用大部分标准库。

大多数时候你应该在对象方面进行思考和思考 – 它们需要在它们被使用之前构建……这就是构造函数进入的地方。它们创建了一个对象,通常带有指定初始状态的参数或者关于该对象的其他重要信息。

说实话,如果你还没有看到这一点,那么它们可能还不值得担心它们。 很可能当你学到更多东西时,你会自然地开始更多地使用对象(例如,可能从集合开始),你就可以了解它。 请放心,在Java中使用构造函数非常重要,但我相信您会在一段时间内理解为什么。 (当然,如果这个答案已经帮助你了解它们的价值,我很高兴 – 但如果没有,请不要担心:)

看起来您似乎无法理解对象和面向对象编程的基本概念。 以举例说明; 这个类代表一种东西,即汽车:

public class Car{ // Licence plate number. This is private, so it can // not be accessed directly from outside the class. private String hiddenRegNr = ""; private static String description = "This is a car". // The constructor, which sets the value of hiddenRegNr public Car(String regNr){ hiddenRegNr = regNr; } // Method for reading hiddenRegNr, the only // way to access it after instantiation. public String getRegNr(){ return hiddenRegNr; } // A static method. Can be used withouth instantiation. public static String getDesc(){ return description; } } 

从其他一些类中,你可以调用这个类,然后创建它的实例; 不同车型的实际表示。 它们代表不同的汽车,但基于相同的“模型”,即汽车类。

 Car myFirstCar = new Car("SR12345"); Car myOtherCar = new Car("XZ54321"); 

现在你有两辆不同的车,有两个不同的注册号码。 这些是汽车类型的独立实例 。 它们存在于内存中,可能包含不同的值(在本例中为不同的注册号)。

 myFirstCar.getRegNr(); // Will return SR12345 mySecondCar.getRegNr(); // will return xz54321 

首先要注意的是,每辆车只能指定一次注册号,即创建时。 这是构造函数的要点:它设置值,并在创建对象(实例)时执行其他需要完成的操作。

现在,请注意getRegNr()和getDesc()之间的区别:关键字“Static”表示第二个方法直接与类相关,而不是与每个实例相关。 这意味着:

  • 调用getDesc()是在类上进行的,而不是实例:

    Car.getDesc();

  • getDesc()的调用将为类汽车的所有实例返回相同的值

  • 对于Car的所有实例,变量描述 (也是静态的)将是相同的

  • 静态方法getDesc()无法访问变量hiddenRegNr ,因为该变量与特定实例相关。 尝试从静态上下文(例如getDesc() )引用实例中的变量将导致抛出exception。 您可能会说调用时不会设置hiddenRegNr

    Car.getDesc();

因为构造函数从未被调用过,所以从未给出任何值。

构造函数用于初始化类并为类提供参数。 重要的是它们允许您在创建时设置类状态。 这允许您使用具有不同数据字段值的类的特定实例,而不是依赖于纯静态信息。 采用以下示例:

 class Obj { private int state = 0; public Obj(int state) { this.state = state; } public Obj() { state = 1; } } 

现在在main (或任何地方)你可以:

 Obj obj1 = new Obj(); Obj obj2 = new Obj(2); 

这两个对象具有不同的状态(一个处于状态1,另一个处于状态2)。 如果您依赖静态方法和成员,则对象将共享一个状态,并且不会彼此独立。

同样重要的是要注意构造函数(特别是new关键字)在内部为给定对象分配内存,因此您不必担心使用malloc和其他内存管理。 所以它们在这个意义上也很重要。

它用于创建对象。 对象是OOP中的主要概念,因此创建它们是重要的一步。 主类方法只是程序的入口点。 如果不创建对象,程序将是程序性的而不是面向对象的。 这就是使用构造函数的原因。

为什么要创建构造函数 – 有时你需要构造一个带有一些必需参数的对象。 还有一个默认的无参数构造函数,但是如果你想用其他参数初始化你的对象 – 你创建一个带有这些参数的构造函数。

实际上,如果需要将唯一的初始状态分配给类的实例,则需要构造函数。 在Java中我只是意识到(由朋友)我们可以这样做:

 public class MyClass1 { private class MyClass2 {} private MyClass2 myobj2 = new MyClass2(); } 

所以不需要隐式构造函数。 但是,如果像下面这样的东西,你需要构造函数。

 public class MyClass1 { private class MyClass2 { private int id_ = 0; public MyClass2(int id) { id_ = id; } // how to reach this? } private MyClass2 myobj2 = new MyClass2(1); // (this doesn't work. Not unique) public MyClass1(int id) { myobj2 = new MyClass2(id); } // by this! } MyClass1 obj1 = new MyClass1(100); MyClass1 obj2 = new MyClass1(200); 

我会给你一个例子,假设你有一个汽车类..当你打电话给汽车类的构造函数时,你有一个汽车对象。 在这个汽车对象上可以使用不同的方法。 你可以根据需要创建尽可能多的汽车对象。