【问题标题】:Query related with kotlin class与 kotlin 类相关的查询
【发布时间】:2021-01-11 10:18:46
【问题描述】:
class student1(firstName : String, lastName : String){
    var id : Int = -1
    val firstName = firstName
    val lastName = lastName

    init {
       println("initialized")
    }

    constructor(firstName : String, lastName : String, extraParam : Int) : this(firstName, lastName){    
        this.id = extraParam
    }
    
    fun callme(){
        print(firstName + lastName)
    }
}


class student2(firstName : String, lastName : String){
    val firstName = firstName
    val lastName = lastName
    
    fun callme() {
        print(firstName + lastName)
    }
}

fun main() {

  val p1 = student1("shubham", "sharma")   
  println(p1.firstName)
  println(p1.lastName)
  println(p1.callme())
  val p2 = student1("shubham", "sharma")   
  println(p2.firstName)
  println(p2.lastName)
  println(p2.callme())

}

在这两个类中,输出相同,参数相同,那么为什么我们需要使用辅助构造函数呢?这两个类之间的主要区别是什么,请举一个例子。将不胜感激!

【问题讨论】:

    标签: kotlin generics gradle-kotlin-dsl


    【解决方案1】:

    第一个有两个构造函数,它们获取一个附加变量但不使用它,这就是你看不到区别的原因。 student1 类有一个可选的 id,默认为 -1。如果您不在其他地方使用它,则必须将其删除。实际上,我们不会在 kotlin 中创建这样的类,您可以在构造函数中移动 var, val 关键字:

    class Student1(val firstName : String, val lastName : String) {
    
        var id = -1
        
        init {
            println("initialized")
        }
    
        constructor(firstName : String, lastName : String, id: Int = -1) : this(firstName, lastName) {
            this.id = id
        }
    
        fun callme() {
            print(firstName + lastName)
        }
    }
    

    您甚至可以使用默认参数缩短它并删除辅助构造函数并将 id 设置为 val(如果您不想更改它):

    class Student1(val firstName : String, val lastName : String, val id: Int = -1) {
        
        init { println("initialized") }
    
        fun callme() { print(firstName + lastName) }
    }
    

    【讨论】:

    • 是的!我刚刚帮它看看实际上有什么不同。你在最后说的更短的代码是我想要使用的,但我想为什么即使我们可以明确地做这些事情,为什么次要缺点也会被使用。感谢您的礼貌回复!
    • 不客气。如果答案对您有帮助,您可以将其标记为已接受的答案:D
    • 您能否举个例子,我们可以看到最佳使用辅助构造函数的用法?
    • 是的,我经历过这个,但没有得到这个收缩器的主要摩托车!对不起。
    【解决方案2】:

    没有区别,因为您只使用 student1 !

    val p2 = student1("shubham", "sharma")
    

    而不是

    val p2 = student2("shubham", "sharma")  
    

    要看到差异,您必须使其可见:

    class student1 ...
        
        fun callme(){
            print(firstName + lastName + id)
        }
    

    然后将 student1 与辅助构造函数一起使用:

      val p3 = student1("shubham", "sharma", 2021)   
      println(p3.firstName)
      println(p3.lastName)
      println(p3.callme())
    

    会输出

    shubhamsharma2021kotlin.Unit
    

    【讨论】:

    • 是的,明白了。非常感谢您的时间。但是你能举一个例子,我们可以看到二级收缩器的主要作用吗?
    • 使用 p1 和主构造函数,你接受 id 的默认值,使用 p3 和辅助构造函数,你给extraParam -> id 一个显式值。摘自“Programming Kotlin (The Big Nerd Ranch Guide)”:当您指定主构造函数时,您会说,“此类的任何实例都需要这些参数。”当您指定辅助构造函数时,您提供了构造类的替代方法(同时仍满足主构造函数的要求)。
    • 是的,有道理!在这里,主构造函数总是存在于类的任何实例中,如果我们使用辅助构造函数,我们可以显式地赋予额外的属性以及主构造函数的委托,不是吗?
    • @shubhamKUMAR 准确!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 2019-06-06
    • 2016-05-13
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多