【问题标题】:Why super() is used in Constructor? [duplicate]为什么在构造函数中使用 super()? [复制]
【发布时间】:2020-07-28 02:47:56
【问题描述】:

我正在学习自定义 ArrayAdapter。在 Github 上找到了这个项目。我不明白为什么这里使用了 super。

public AndroidFlavorAdapter(Activity context, ArrayList<AndroidFlavor>Flavors) {

        super(context, 0, Flavors);
  }

当我删除 super 时,会弹出此错误。

X '()' 没有适用的构造函数

有什么帮助吗?

【问题讨论】:

  • 另一方面,@fetive,我建议您在发帖之前先进行研究,这样您会学得更好,每个人都会受益。
  • 我试图找出但不明白那里的解释。:(
  • @omt66 你能告诉我为什么super中的第二个参数是0吗?
  • 这能回答你的问题吗? super() in Java

标签: java android constructor super aide


【解决方案1】:

每个构造函数都需要另一个构造函数作为它做的第一件事1。有三种方法可以做到这一点:

  • 构造函数可以进行显式的super 调用,可以带参数也可以不带参数。参数类型需要与超类中声明的构造函数的签名相匹配。

  • 构造函数可以进行显式的this 调用。这会调用该类声明的另一个构造函数。

  • 如果没有显式的superthis 类,Java 编译器会将隐式的super() 调用添加到构造函数中。为此,超类中需要有一个不带参数的构造函数;即一个无参数的构造函数。

1 - 除了没有超类的java.lang.Object。请注意,字节码验证器会检查这一点。如果你使用(比如说)字节码汇编器来创建一个类,它的构造函数不调用超类构造函数,它将被类加载器拒绝。


所以...

为什么在构造函数中使用super(...)

显式调用超类构造函数。请注意,在这种情况下,您将参数传递给超类构造函数。

当我删除 super 这个错误弹出:“没有适用的构造函数到 '()'”

这是因为如果您没有显式的 super(...) 调用,编译器无法找到隐式调用的超类无参数构造函数。

你能告诉我为什么 super 中的第二个参数是 0。

超类的 javadocs 应该解释这意味着什么。在这种情况下,第二个参数是资源 ID。我不确定这是否有意义,但我看到它说 Resource ID 0 表示 null

【讨论】:

    【解决方案2】:

    因为基类可能正在为实例进行所需的初始化。

    【讨论】:

      猜你喜欢
      • 2016-10-19
      • 2013-04-25
      • 2012-05-17
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      相关资源
      最近更新 更多