当前位置: 首页 > 知识库问答 >
问题:

这种类型有一个构造函数,必须在这里初始化-静态编程语言

翟承志
2023-03-14

我刚刚开始用Kotlin来试验Android应用程序。我只想像这样继承应用程序类:

class SomeApp : Application {

}

但编译器提出了警告:

建议将其改为:

class SomeApp : Application() {
    override fun onCreate() {
        super.onCreate()
    }
}

我在文档中读到了主构造函数和辅助构造函数。所以如果超级类有一个主构造函数,那么有必要在这里写吗?就像应用程序类有自己的构造函数一样

public Application() {
    super(null);
}

那么就有必要为派生的?或者我不能像Java那样做:

class SomeApp : Application {
   constructor SomeApp(){
      super();
    }
}

或者这个错误暗示了别的什么?有人能详细解释一下吗?我对这门语言非常陌生,这对我来说看起来很奇怪。

编辑:在java中,我可以做以下事情:类某些应用程序扩展应用程序{}

它有隐式构造函数,所以我不必编写:class SomeApp扩展应用程序{public Application(){super();}} 但是在kotlin中,我必须像下面这样定义空构造函数:类SomeApp:Application(){}


共有2个答案

欧阳永宁
2023-03-14

你不需要

class SomeApp : Application() {
   constructor SomeApp(){
      super();
    }
}

因为这是等价的。如果类有一个主构造函数,则可以(而且必须)使用主构造函数的参数在那里初始化基类型。

class SomeApp : Application() {
}

这在java中也相当于

class SomeApp extends Application {
     public SomeApp(){
       super();
     }
}
佘修为
2023-03-14

这与主要/次要构造函数无关。

在JVM(以及几乎任何其他地方)上,当您创建SomeApp

在Java中,语法如您所说:

class SomeApp : Application {
    constructor SomeApp(){
      super();
    }
}

这里必须声明一个构造函数,然后必须调用超类的构造函数。

在Kotlin中,概念完全相同,但语法更好:

class SomeApp() : Application() {
    ...
}

在这里,您声明了一个不带参数的构造函数SomeApp(),并说它调用Application(),在这种情况下不带参数。这里的Application()与java代码片段中的super()具有完全相同的效果。

在某些情况下,可以省略一些括号:

class SomeApp : Application()

错误文本显示:此类型有一个构造函数,因此必须在此处初始化。这意味着typeApplication是一个类,而不是一个接口。接口没有构造函数,因此它们的语法不包括构造函数调用(括号):class a:CharSequence{…} 。但是Application是一个类,所以可以调用构造函数(如果有多个构造函数,可以调用任何构造函数),或者“在这里初始化它”。

 类似资料:
  • 问题内容: 表示变量只能在构造函数中分配一次。 表示它是一个类实例。 我不明白为什么禁止这样做。这些关键字在哪里互相干扰? 问题答案: 每次创建该类的实例时,都会调用一个构造函数。因此,上述代码意味着x的值将在每次创建实例时重新初始化。但是由于变量被声明为final(和static),因此您只能这样做 但是,如果删除静态,则可以执行以下操作: 或这个:

  • 问题内容: Python中是否有诸如静态构造函数之类的东西? 如何在Python中实现静态构造函数? 这是我的代码…当我这样调用App时不会触发。该不是静态构造函数或静态初始化。 我必须这样称呼它,它每次都会实例化App类: 这是我的课: 每次调用的问题是重新创建了App对象。我的“真实” App类很长。 问题答案: 提示:任何引用都将需要实例化该类。您可以这样做: 但是,来吧,这似乎有很多不足。

  • 问题内容: 因此,问题或多或少是我写的。我知道可能还不清楚,所以我举一个例子。 我有Tree类,其中有Node类,并且Tree的空构造函数被编写为: Eclipse给我一个错误:空构造函数中的“ new RBTree()”没有“由于某些中间构造函数调用而导致RBTree类型的封闭实例不可用”。但是,如果将RBNode更改为静态类,则没有问题。 那么,为什么在类为静态的时候它可以工作。 顺便说一句,

  • 问题内容: import React, { Component } from ‘react’; 通常我看到的是,如果他使用es6类,人们会在构造函数中执行this.state。如果不是,他可能会使用getinitialstatestate函数放置状态。但是上面的代码(是的,这是一个有效的代码),两者都没有使用。我有2个问题,这里的状态是什么?那是局部变量吗?如果是,为什么没有?prevState来

  • 问题内容: 我有2节课: Class A: Class B: I create a Main class which just creates new A: The output I get is: 如您所见,A的构造函数在其静态初始值设定项之前被调用。 我了解它与我创建的循环依赖关系有关,但我印象中静态初始化程序应始终在构造函数之前运行。 发生这种情况的原因是什么(技术上在Java实现中)? 是

  • 我正在使用Kotlin开发应用程序。在我的应用程序中包含带有的,因此我实现了这两个tabs.when我移动到另一个活动并编译到制表符查看活动,应用程序获得fsource停止,显示在错误下方。 java.lang.RuntimeException:无法启动活动ComponentInfo{com.crypto.wallet/com.crypto.wallet.activities.MainActivi