所以我正在学习java。我进入了一个月,我刚刚学习了构造函数。但我没有看到创造一个目的的全部目的。我为什么以及何时想要使用它?我完全认为它没有main方法,你可以从主类中调用构造函数。任何人都可以在这个主题上给我启发,这对我有很大的帮助。
答案 0 :(得分:9)
构造函数是您用来初始化/设置类实例的方法。
如果某个对象在可用之前需要进行一些处理(例如初始化成员),则应该在构造函数中执行此操作。
理想情况下,您永远不应该拥有“部分构建”的对象(即“实时”对象,您持有引用但尚未使用的对象)。如果没有构造函数,您将永久地创建部分构建的对象,这非常容易出错。 (理论和实践并不总是匹配,但要记住这个想法。)
答案 1 :(得分:6)
使用构造函数创建新对象。是的,你可以只使用静态方法编写Java - 但是你真的不是在编写面向对象的代码,而且你也很难使用大部分标准库。
你大部分时间都应该使用对象进行思考 - 并且需要在它们被使用之前进行构建......这就是构造函数的用武之地。对象,通常使用参数指定初始状态或有关对象的其他重要信息。
说实话,如果你还没有看到这一点,那么它们可能不值得担心它们。很可能当你学到更多东西时,你自然会开始更多地使用对象(例如,可能会开始使用集合),你就可以了解它。请放心, 对于在Java中使用构造函数非常重要,但我相信你会在一段时间内理解为什么。 (当然,如果这个答案已经帮助你了解它们的价值,我很高兴 - 但如果没有,请不要担心:)
答案 2 :(得分:2)
看起来您可能无法理解对象和面向对象编程的基本概念。以举例说明;这个类代表一种东西,即汽车:
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");
现在你有两辆不同的车,有两个不同的注册号码。这些是 car 类型的独立实例。它们存在于内存中,可能包含不同的值(在本例中为不同的注册号)。
myFirstCar.getRegNr(); // Will return SR12345
mySecondCar.getRegNr(); // will return xz54321
首先要注意的是,每辆车只能指定一次注册号,即创建时。这是构造函数的要点:它设置值,并在创建对象(实例)时执行其他需要完成的操作。
现在,请注意getRegNr()和getDesc()之间的区别:关键字“Static”表示第二个方法直接与类相关,而不是与每个实例相关。这意味着:
调用 getDesc()是在类上进行的,而不是实例:
Car.getDesc();
对 getDesc()的调用将为类 car
变量 description (也是静态的)对于Car的所有实例都是相同的
静态方法 getDesc()无法访问变量 hiddenRegNr ,因为该变量与特定实例相关。尝试从静态上下文(例如 getDesc())引用实例中的变量将导致抛出异常。您可能会说在调用
时不会设置 hiddenRegNrCar.getDesc();
因为构造函数从未被调用过,所以从未给出任何值。
答案 3 :(得分:1)
它用于创建对象。对象是OOP中的主要概念,因此创建它们是重要的一步。主类方法只是程序的入口点。如果你不创建对象,你的程序将是程序性的而不是面向对象的。这就是使用构造函数的原因。
为什么创建构造函数 - 有时你需要构造一个带有一些必需参数的对象。还有一个默认的无参数构造函数,但是如果你想用其他参数初始化你的对象 - 你创建一个带有这些参数的构造函数。
答案 4 :(得分:1)
构造函数用于初始化类并为类提供参数。重要的是,它们允许您在创建时设置类状态。这允许您使用具有不同数据字段值的类的特定实例,而不是依赖于纯静态信息。请看以下示例:
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
和其他内存管理。所以它们在这个意义上也很重要。
答案 5 :(得分:0)
如果需要将唯一的初始状态分配给类的实例,实际上需要构造函数。在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);
答案 6 :(得分:-1)
我会给你一个例子,假设你有一个汽车类..当你调用汽车类的构造函数时,你有一个汽车对象。在这个汽车对象上可以使用不同的方法。你可以根据需要创建尽可能多的汽车对象。