如果我没有';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。