MST
星途 面试题库

面试题:Kotlin中对象表达式与伴生对象的区别

请详细阐述Kotlin中对象表达式与伴生对象在定义方式、作用域、使用场景上的区别,并各举一个简单示例说明。
17.7万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

定义方式

  • 对象表达式:在需要一个对象实例的地方直接定义并创建对象。格式为 object : [超类型列表] { /* 代码块 */ },如果没有超类型,直接 object { /* 代码块 */ }
    val myObject = object {
        val message = "This is an object expression"
        fun printMessage() {
            println(message)
        }
    }
    
  • 伴生对象:在类内部使用 companion object 关键字定义,一个类只能有一个伴生对象。
    class MyClass {
        companion object {
            val companionMessage = "This is a companion object"
            fun printCompanionMessage() {
                println(companionMessage)
            }
        }
    }
    

作用域

  • 对象表达式:定义后在其所在作用域内可用,通常用于局部变量或作为函数参数传递等,其作用域局限于定义它的代码块。
  • 伴生对象:作用域在类内部,通过类名访问,它与类紧密关联,像类的静态成员一样,其生命周期与类相关。

使用场景

  • 对象表达式
    • 用于创建一次性使用的对象,例如创建匿名监听器。
    import android.view.View
    import android.widget.Button
    import android.widget.TextView
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    
    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            val textView = findViewById<TextView>(R.id.textView)
            val button = findViewById<Button>(R.id.button)
            button.setOnClickListener(object : View.OnClickListener {
                override fun onClick(v: View) {
                    textView.text = "Button Clicked"
                }
            })
        }
    }
    
  • 伴生对象
    • 用于定义与类相关的全局属性和方法,类似Java中的静态成员。例如定义工厂方法,方便创建类的实例。
    class User(val name: String, val age: Int) {
        companion object {
            fun createUser(name: String, age: Int): User {
                return User(name, age)
            }
        }
    }
    
    val user = User.createUser("John", 30)