【问题标题】:How does function that isn't part of a class can be called from a class's function?如何从类的函数中调用不属于类的函数?
【发布时间】:2020-10-12 11:52:28
【问题描述】:

我是 Kotlin 的新手(对 Java 有一些经验)。在java中,每个函数(方法)都属于类(静态函数或实例函数)。在 Java 中 不可能 在类之外编写函数。在 kotlin 我看到这是可能的。我不明白从类函数调用函数(不属于类范围的一部分)是如何工作的。 谁能给我解释一下。 代码示例: 狼级:

  class Wolf()
{
    var image = "wolf.jpg"
    var food = "meat"
    val habitat = "forests"

    fun makeNoise() {
        println("Hooooow!")
        addNumbers(5, 6)

    }
}

不属于类的方法:

   fun addNumbers (a:Int, b:Int): Int
 {
     return a+b
 }

【问题讨论】:

  • 这就是 kotlin 的工作原理?你能解释一下你不明白的地方吗? -> 知道 kotlin 编译为 java 字节码,其中文件中的每个函数都嵌套在自动生成的类中
  • @Lino,我不能理解很多事情: 1. 它的作用类似于类的静态函数吗? 2. 编译时,函数存放在哪里?它不是任何课程的一部分吗? 3、这个功能的作用范围是什么?它可以从任何地方调用还是只能从包中调用?我来自 OOP 知识,所以我真的很困惑
  • 对于 1 和 2:当您在文件 file.kt 中创建函数 fun f() {} 时,我假设它会创建类似 thisclass FileKt { public static void f() {} } 的东西。对于 3:当您没有修饰符时,它是隐式 public。还要注意static在kotlin中并不直接存在,你要么在类中有函数,要么只有函数,前者类似于实例方法,后者类似于静态方法
  • @Lino,你在上一句中提到的“后者”,这意味着虽然它不直接称为静态,但它的行为和“感觉”与 java 静态方法完全相同,但它没有t 属于任何类别?
  • 它不属于 Kotlin 中的类,但在 Java确实。编辑:刚刚确认确实是这样。对于前面提到的示例,生成以下字节码:public final class FileKt { public static final f() {} }

标签: java function class kotlin


【解决方案1】:

来自kotlin docs

在 Kotlin 中,函数可以在文件的顶层声明,这意味着您不需要创建一个类来保存函数,而在 Java、C# 或 Scala 等语言中需要这样做。除了顶级函数,Kotlin 函数还可以声明为本地函数,如成员函数和扩展函数。

如果您想知道这是如何在 JVM 字节码中实现的,您可以使用“工具 -> Kotlin -> 显示 Kotlin 字节码”,然后使用 IntelliJ 中的“反编译”功能。

您会看到,如果您将 addNumbers 放入 Wolf.kt 文件中,那么 kotlin 编译器会生成相当于以下内容的字节码:

public final class WolfKt {
   public static final int addNumbers(int a, int b) {
      return a + b;
   }
}

You can control the name of the class with @file:JvmName("WolfFunctions")

【讨论】:

  • 所以如果 addNumbers 函数被另一个类调用,调用时我们需要这样调用它:WolfKt.addNumbers(5,6)?因为我看到我可以从包中的每个类中调用它而无需类名前缀
  • 是的。 kotlin 编译器正在生成必要的字节码以使其工作。
  • 所以在从其他文件调用此方法时不需要类名作为前缀?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多