【问题标题】:what's the point of java constructor?java构造函数的意义何在?
【发布时间】:2011-10-15 16:13:11
【问题描述】:

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

【问题讨论】:

标签: java constructor


【解决方案1】:

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

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

理想情况下,您永远不应该拥有“部分构建”的对象(即“活动”的对象,您持有对它们的引用,但尚不可用)。如果没有构造函数,您将永久创建部分构建的对象,这很容易出错。 (理论和实践并不总是一致的,但请记住这一点。)

【讨论】:

    【解决方案2】:

    您使用构造函数来创建新对象。是的,您可以仅使用静态方法编写 Java - 但是您实际上不是在编写面向对象的代码,而且您也很难使用许多标准库。 p>

    您的大部分时间都应该从对象的角度进行工作和思考——它们需要先被构造,然后才能被使用......这就是构造函数的用武之地。它们创建一个对象,通常带有指定初始状态或有关对象的其他重要信息的参数。

    老实说,如果您还没有看到重点,那么现在可能不值得担心它们。很可能随着您了解的更多,您自然会开始更多地使用对象(例如,可能从集合开始)并且您会掌握它的窍门。请放心,在 Java 中拥有构造函数很重要,但我相信您会在一段时间内理解其中的原因。 (当然,如果这个答案已经帮助您欣赏它们的价值,我很高兴 - 但如果没有,请不要担心 :)

    【讨论】:

      【解决方案3】:

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

      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 类。

      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

      • 的所有实例返回相同的值
      • 变量描述(也是静态的)对于所有 Car 实例都是相同的

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

        Car.getDesc();

      因为构造函数从未被调用,所以它从未被赋予任何值。

      【讨论】:

        【解决方案4】:

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

        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】:

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

          以及为什么要创建一个构造函数——有时你需要用一些必需的参数来构造一个对象。还有一个默认的无参数构造函数,但如果你想用额外的参数初始化你的对象 - 你创建一个带有这些参数的构造函数。

          【讨论】:

          • 不回答问题。您无需编写构造函数即可获取其中任何内容。
          • @EJP 你错了。你不需要写一个构造函数,但默认情况下总是有一个,你必须使用它
          • Nitpick:有人必须使用它。您可以直接调用getNewObject() 并取回一个对象,而无需亲自 调用任何构造函数。但是getNewObject 可能必须在某个时候新建一个对象,此时它会自动调用其中一个构造函数。
          • @Bozho 你刚刚同意我的观点,你不需要编写构造函数。所以我们都是正确的,包括我,否则我们都是错误的,包括你。这里的问题是你为什么要“创建”一个构造函数,而你还没有回答。
          • @EJP 我在问题中看到了“使用”和“吃”两个词。我会更新
          【解决方案6】:

          如果您需要将唯一的初始状态分配给类的实例,则实际上需要构造函数。在 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);
          

          【讨论】:

            【解决方案7】:

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

            【讨论】:

            • 不回答问题。您无需编写构造函数即可获取其中任何内容。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-07-28
            • 2021-11-19
            • 1970-01-01
            • 2015-02-12
            • 2011-04-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多