前言,最近在学习room数据库时出现了,::的引用,所以就学习了一下为什么要用::,如果正常的使用操作符 . 来访问不行吗,有什么区别?

首先说一下::能引用啥

1.引用函数

fun greet(name: String) {
    println("Hello, $name!")
}

fun main() {
    val greeter = ::greet // 引用 greet 函数
    greeter("Alice") // 调用 greet 函数
}

2.引用类的构造函数

class Person(val name: String)

fun main() {
    val createPerson = ::Person // 引用构造函数
    val person = createPerson("John") // 创建一个 Person 对象
    println(person.name)
}

3. 引用属性

class Person(val name: String, val age: Int)

fun main() {
    val person = Person("Alice", 30)
    val nameReference = Person::name // 引用 name 属性
    println(nameReference.get(person)) // 输出 "Alice"
}

4. 引用伴生对象

class MyClass {
    companion object {
        fun hello() {
            println("Hello from companion object!")
        }
    }
}

fun main() {
    val helloRef = MyClass.Companion::hello // 引用伴生对象的函数
    helloRef() // 调用 hello 函数
}

5. 引用接口的实现方法

interface Printer {
    fun printMessage(message: String)
}

class ConsolePrinter : Printer {
    override fun printMessage(message: String) {
        println(message)
    }
}

fun main() {
    val printer = ConsolePrinter()
    val printRef = printer::printMessage // 引用方法
    printRef("Hello Kotlin!") // 调用 printMessage 方法
}

总结

:: 并不是为了代替直接访问属性或方法,而是提供了一种更强大、灵活的方式来引用、传递和操作函数、类、构造函数和属性,尤其在以下情况下特别有用:

  • 高阶函数:传递函数作为参数。

  • 反射:动态地操作函数和属性。

  • 属性引用:引用类的属性,尤其在数据绑定等场景中非常有用。

  • 构造函数引用:允许动态创建对象。

直接访问是简洁的,但 :: 提供了更多的灵活性,特别是在复杂和动态的编程场景中。

ok以上其实是AI给我的解释,看的时候还是能够大概理解::这个操作符,还有一些简单用法,其实也就是为了代码更简洁更高级和安全一点,把对象或者函数之间"赋值"给另一个变量,然后可以随意去操作这个变量,也是挺方便的

然后其实这就让我联想到c++的引用,诶?这不是和c++的引用差不多嘛,其实就是给一个对象起别名,然后后面可以用别名来访问这个对象,其实为了简单理解我个人觉得也可以这么来理解,但是具体的话还是有点区别的

1、比如c++的引用是可以改变值的,加入&b=a ,b=10,这样的操作可行的,但是kotlin的::不行,他不能够赋值

2、C++ 的引用让你通过新的别名直接操作变量的值,相当于对原始对象的“引用”。Kotlin 的 :: 并不是创建变量的别名,而是用来创建对方法、属性、构造函数等的引用,从而可以将它们传递给高阶函数或用于反射等动态操作。

此文到此结束,这只是我一个小小的知识点记录,希望可以帮到你

更多推荐