java构造函数有什么意义?

时间:2011-10-15 16:13:12

标签: java constructor

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

7 个答案:

答案 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())引用实例中的变量将导致抛出异常。您可能会说在调用

    时不会设置 hiddenRegNr

    Car.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)

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