如果我没有';I don’我不想要一个Devered类调用基类';Kotlin的构造函数是什么?

如果我没有';I don’我不想要一个Devered类调用基类';Kotlin的构造函数是什么?,kotlin,constructor,Kotlin,Constructor,有没有办法创建派生的实例,但不调用基的构造函数 open class Base(p: Int) class Derived(p: Int) : Base(p) 这是不可能的。派生类的构造函数必须调用基类的(任何)构造函数才能初始化基类的内容(字段) Java中的情况也是如此。只是默认情况下调用默认构造函数(如果构造函数中没有提供参数),但是如果必须在带参数的构造函数之间进行选择,则始终必须显式调用它们,因为必须选择要传递给构造函数的值。这是不可能的。派生类的构造函数必须调用基类的(任何)构造

有没有办法创建
派生的
实例,但不调用
的构造函数

open class Base(p: Int)

class Derived(p: Int) : Base(p)

这是不可能的。派生类的构造函数必须调用基类的(任何)构造函数才能初始化基类的内容(字段)


Java中的情况也是如此。只是默认情况下调用默认构造函数(如果构造函数中没有提供参数),但是如果必须在带参数的构造函数之间进行选择,则始终必须显式调用它们,因为必须选择要传递给构造函数的值。

这是不可能的。派生类的构造函数必须调用基类的(任何)构造函数才能初始化基类的内容(字段)

Java中的情况也是如此。只是默认情况下调用默认构造函数(如果构造函数中没有提供参数),但是如果必须在带参数的构造函数之间进行选择,则始终必须显式调用它们,因为必须选择要传递到构造函数中的值。

您实际上可以这样做

import sun.misc.Unsafe

open class Base(p: Int){
    init {
        println("Base")
    }
}

class Derived(p: Int) : Base(p){
    init {
        println("Derived")
    }
}

fun main() {
    val unsafe = Unsafe::class.java.getDeclaredField("theUnsafe").apply {
        isAccessible = true
    }.get(null) as Unsafe

    val x = unsafe.allocateInstance(Derived::class.java)

    println("X = $x")
}
但是不要这样做,这个解决方案是一个低级机制,它被设计为只供核心Java库使用,而不是供标准用户使用。如果你使用OOP,你会破坏它的逻辑。

你实际上可以做到

import sun.misc.Unsafe

open class Base(p: Int){
    init {
        println("Base")
    }
}

class Derived(p: Int) : Base(p){
    init {
        println("Derived")
    }
}

fun main() {
    val unsafe = Unsafe::class.java.getDeclaredField("theUnsafe").apply {
        isAccessible = true
    }.get(null) as Unsafe

    val x = unsafe.allocateInstance(Derived::class.java)

    println("X = $x")
}

但是不要这样做,这个解决方案是一个低级机制,它被设计为只供核心Java库使用,而不是供标准用户使用。如果使用了OOP,则会破坏OOP的逻辑。

,必须始终调用超级类的构造函数,以确保类的基础被初始化。但是您可以通过在基类中提供无参数构造函数来解决您的问题。大概是这样的:

open class Base(p: Int?){
    val p: Int? = p
    constructor(): this(null)
}

class Derived(p: Int) : Base()

您处理基类的构造函数是默认的,哪些参数是可空的等等,这将取决于具体的情况。

您必须总是调用一个超级类的构造函数来确保类的基础被初始化。但是您可以通过在基类中提供无参数构造函数来解决您的问题。大概是这样的:

open class Base(p: Int?){
    val p: Int? = p
    constructor(): this(null)
}

class Derived(p: Int) : Base()

处理基类的哪个构造函数是默认构造函数,哪些参数是可为空的,等等的方式将在很大程度上取决于具体情况。

确实如此。构造函数的全部要点是设置每个实例,使其进入一致状态。Java和Kotlin都确保构造函数总是被调用(在每个级别),因此整个对象都以一致的状态启动。构造函数的全部要点是设置每个实例,使其进入一致状态。Java和Kotlin都确保构造函数总是被调用(在每个级别),因此整个对象都以一致的状态启动ả顺便说一下,mơnả顺便说一下,mơn。