【问题标题】:What is constructor in java, if it is not a member of class?java中的构造函数是什么,如果它不是类的成员?
【发布时间】:2013-01-08 17:14:05
【问题描述】:

如果它不是 Oracle 文档中所述的类的成员,我们将其称为什么构造函数:http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

【问题讨论】:

  • 只称它为“构造函数”有什么问题?
  • 任何构造一个不是该类成员的类的方法都是工厂,对吧?
  • @Saher ??? 构造函数不是成员,所以它们不会被子类继承
  • @Saher 不,从技术上讲,你不能称它为班级成员。原因是哲学上的,你不能在它的内部(成员)创造一些东西。因为从技术上讲,它在创建 ../ 鸡蛋问题之前并不存在?

标签: java constructor


【解决方案1】:

我认为“成员”一词的定义是为了方便起见排除构造函数。构造函数,即使是公共构造函数,也不会被继承;成员是继承的(除非它们是静态的和/或私有的)。在谈论继承规则时总是不得不说“除了构造函数之外的成员”会很尴尬。

来自Java Language Specification, §8.2

构造函数、静态初始化器和实例初始化器不是成员,因此不会被继承。

只需将构造函数称为“构造函数”。

【讨论】:

  • 另请注意,与常规方法不同,构造函数没有返回类型
【解决方案2】:

它是每个类都有的特殊方法,在创建对象后调用。在 JVM 中,它使用 invokespecial 调用,所以,让我们称之为 special 方法?

而且由于 Java 中只有 1 种特殊方法 - 他们都称其为“构造函数”

【讨论】:

  • 构造函数不是方法。来自JLS, §8“构造函数类似于方法,但不能通过方法调用直接调用;它们用于初始化新的类实例。”
  • @TedHopp 一个普通的方法调用转换为invokevirtualinvokestatic 操作码。 “请注意,使用 invokespecial 指令调用的 methods 始终将此作为其第一个参数传递给调用的 method。像往常一样,它在局部变量 0 中接收。” - 来自 JVM 规范。
  • 术语“方法”在 JLS 中具有非常具体的技术含义。没有理由将 Java 语言术语与 Java 虚拟机的术语混淆。 JLS 清楚地表明构造函数和方法是不同的东西。将 c'tor 称为“特殊方法”只会模糊 JLS 努力做出的区分。 c'tor 不是“特殊方法”(JLS 中没有出现该术语);这是一个批评者。换句话说:编译器将 c'tor 转换为 <init> 方法,但是 Java 语言的 c'tor 和 JVM 的 <init> 方法是不同的东西。
  • 我很惊讶在这里看到这么多答案说构造函数是方法或一种特殊的方法,而语言规范却千方百计地说它们不是。再清楚不过了。有趣的是人们根本不在乎。我猜人就是这样的。他们使用自己的定义是因为他们是正确的,而语言设计者是错误的。 :) 感谢@TedHopp 的许多引用来帮助澄清。
  • @RayToal 我几乎不相信“官方文档”——我一次又一次地证明文档是由与编写代码的人不同的人更新的。几乎总是发生。看看底层代码总是好的。
【解决方案3】:

所有文档都说构造函数默认不被继承。由于构造函数是在内存堆中构造对象时调用的方法,所以一旦创建了继承自超类的子类,默认情况下不会调用超类的构造函数。

例如,如果您有一个类Vehicle 和一个子类Car,假设Vehicle 构造函数如下:

public Vehicle(String vehName) {
    this.vehName = vehName;
}

那么,即使你的类 Car 继承自类 VehiclevehName 成员(字段)也不会像上面的构造函数那样设置。

所以你需要做这样的事情:

public Car(String vehName) {
    super(vehName);
}

希望有帮助

【讨论】:

    【解决方案4】:

    构造函数是类中的一种方法,用于创建该类的新实例。 成为一个班级的成员只是意味着该项目在班级中。

    【讨论】:

    • 这不是 OP 所要求的
    • 构造函数不是方法。参见Java Language Specification, §8“构造函数类似于方法,但不能通过方法调用直接调用;它们用于初始化新的类实例。”
    • 构造函数不创建类的新实例。构造函数是一种特殊方法,用于设置(初始化)使用new 运算符创建的对象。
    【解决方案5】:

    构造函数是一个与类同名的方法。它用于初始化类的对象。它隐含在行动中。参数构造函数用不同的值初始化对象。

    【讨论】:

    【解决方案6】:

    在 Java 中,类主体(大括号之间的区域)可以包含以下关键项:(1) 字段 (2) 方法 (3) 其他类(嵌套类)(4) 构造函数 (5) 初始化器

    从特定类创建的对象应采用类似于创建它的蓝图(类)的形状。现在,如果您查看可以包含在类主体中的项,只有第 (1) 到 (3) 项有助于确定可以从特定类定义中创建哪种对象。

    构造器和初始化器只在对象的实际创建中起作用(例如,已经定义的字段的初始化),但不能确定该对象应具有什么形状/状态,以及它将显示什么行为。

    因此,对我来说,将项目 (1) 称为 (3) 类成员是有意义的(即类成员是类主体中的那些项目,它们决定从类创建的对象的外观和行为方式) ;而构造函数和初始化器不是成员,因为它们在类定义中的缺失不会影响类的状态和行为。

    因此,只有类成员可以被继承,因为继承背后的全部意义在于启用子类重用其超类的状态和行为。

    【讨论】:

      猜你喜欢
      • 2014-08-04
      • 2013-02-10
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 2016-03-09
      • 1970-01-01
      相关资源
      最近更新 更多