【问题标题】:Can we say Constructors are Methods in Java?我们可以说构造函数是 Java 中的方法吗?
【发布时间】:2015-05-22 15:11:18
【问题描述】:

众所周知,Java 是一种面向对象的语言。 Java 中的一切都是对象。我们也知道对象有一些东西(实例变量/字段)并做一些事情(方法)。我们使用方法更改实例变量的状态是安全的,即;设置者和获取者。所以在构造函数中我们初始化实例变量。所以换句话说,构造函数正在为一个对象做一些事情。那么假设构造函数是一种实用方法,就像设置值的设置器一样,这不是正确的吗?不同之处在于,在 setter 的情况下,即使我们有返回类型 void 而在构造函数中我们没有任何返回类型。并且 setter 可以在对象上调用任意次数,但构造函数可以在对象的生命周期中调用一次。

【问题讨论】:

  • 我会说构造函数更像是工厂方法,而不是 setter。

标签: java


【解决方案1】:

我们可以说构造函数是 Java 中的方法吗?

如果您是 Java 新手并第一次尝试掌握该概念,您可以将构造函数视为工厂方法。 (例如在 Python 中,构造函数只是一个名为 __init__ 的方法。)但是,您应该快速前进并了解存在许多差异。仅举几例:

  • 构造函数没有返回类型。
  • 在初始化 final 成员变量时它有特殊的义务(一个方法甚至不能分配给 final 成员)。
  • 它是静态的,你可以在没有被调用者的情况下调用它,但它是非静态的,因为你有一个 this 引用。
  • 它使用特殊关键字new 调用,并具有特殊字节码invokespecial,而实例方法由obj.method() 调用,通常编译为invokevirtual 字节码。
  • 必须调用超级构造函数,除非超级类中有无参数构造函数。
  • 它们永远不会被继承,也不能被覆盖。

【讨论】:

    【解决方案2】:

    直接来自JLS (Chapter 8)

    构造函数用于创建作为类实例的对象(第 12.5 节、第 15.9 节)。 ConstructorDeclarator 中的 SimpleTypeName 必须是包含构造函数声明的类的简单名称;否则会发生编译时错误。

    在所有其他方面,构造函数声明看起来就像没有结果的方法声明(第 8.4.5 节)。

    构造函数声明不是成员。它们永远不会被继承,因此不会被隐藏或覆盖。

    【讨论】:

      【解决方案3】:

      Java 中的构造函数

      Java 构造函数在对象创建时被调用。它构造值,即为对象提供数据,这就是它被称为构造函数的原因。 构造函数实际上返回当前类实例(您不能使用返回类型,但它返回一个值)。 构造函数基本上定义了两条规则。

      1)构造函数名必须与其类名相同 2)构造函数必须没有明确的返回类型

      构造函数的类型

      1)默认构造函数(无参数构造函数)

      class Bike1{  
      Bike1(){System.out.println("Bike is created");}  
      public static void main(String args[]){  
      Bike1 b=new Bike1();  
      }  
      }  
      

      2)参数化构造函数

      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();  
      

      }
      }

      【讨论】:

        【解决方案4】:

        constructor 用于初始化变量,它不是方法。但是,您可以选择创建构造函数,如果不这样做,JVM 将创建默认的constructor

        【讨论】:

          猜你喜欢
          • 2011-04-08
          • 1970-01-01
          • 2011-07-10
          • 2015-06-21
          • 1970-01-01
          • 2019-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多