当前位置: 首页 > 知识库问答 >
问题:

Kotlin静态函数:companion对象,@jvmstatic@jvmfield

毛景曜
2023-03-14

我刚刚开始使用Kotlin编程语言,它比Java要酷得多。我有一些与静态方法和字段相关的疑惑:

Q1:官方文件称

但是,如果您看到下面的内容,我可以将bar()方法作为静态方法访问,它不需要使用@jvmstatic注释。但在官方文档上,它的抛出错误->Kotlin静态方法。

Class C{
    companion object{
        @JvmStatic
        fun foo() { }
        fun bar();
    }
}
fun main(args: Array<String>) {
    C.foo();
    C.bar(); //this line works fine
}

Q2:我真的需要@jvmstatic@jvmfield来使事情静态化吗?正如您在companion对象中看到的那样,事情正在按照预期的方式工作。

共有1个答案

宣滨海
2023-03-14

您可以在Kotlin中以c.bar()的形式访问同伴对象的成员,但在Java中不能访问。如果没有@jvmstatic,就需要在Java中使用c.companion.bar(),正如文档中所说的那样。

注意,在没有@jvmstatic的情况下,该函数被编译为一个实例(非静态)方法,该方法在Java中的c.canpanion上调用(Kotlin只是将其缩短为对c的调用,但实际上是一样的),所以是的,您需要@jvmstatic@jvmfield来在编译为静态成员的伙伴对象中进行声明

基本上,@jvmstatic@jvmfield是用于Java互操作的工具,它们有助于创建Java友好的API,如果您不需要从Java调用Kotlin成员(例如,它们是Kotlin项目的内部成员,或者您正在开发一个不太可能与Java一起使用的库),您可以让它们保持原样。

 类似资料:
  • 问题内容: 这些对象调用之间有什么区别? 非静态: 静态的: 而且在内部为什么还要对函数使用static属性? 例: 问题答案: 静态函数,根据定义,不能也不依赖于该类的任何实例属性。也就是说,它们不需要类的实例来执行(因此,可以如您所显示的那样执行,而无需先创建实例)。从某种意义上讲,这意味着该函数不必(也永远不需要)依赖于类的成员或方法(公共或私有)。

  • 我有静态函数,它仅限于一些上下文(例如仅用于文档)。有两种替代方法可以将其定义为顶层函数或对象中的函数。 1. 2. 顶级函数的优点是它没有被包装在一个对象中,缺点是它可以从任何地方访问,没有类名前缀。这种情况有优点还是缺点或最佳实践?

  • 问题内容: 我对php中的静态功能有疑问。 假设我有一堂课 如果我这样做的话,没有问题。 也可以。 头等舱和二等舱有什么区别? 静态函数有什么特别之处? 问题答案: 在第一个类中,实际上是一个实例方法,您将其作为静态方法进行调用,但由于从未引用,所以您将其取消。 静态函数与该类相关联,而不是该类的实例。因此,在静态上下文中不可用(未指向任何对象)。

  • 本文向大家介绍使用C ++中的静态成员函数计算对象数,包括了使用C ++中的静态成员函数计算对象数的使用技巧和注意事项,需要的朋友参考一下 在这里,我们将看到如何计算使用某些静态成员函数从特定类创建的对象的数量。静态成员是类属性,而不是对象属性。对于单个类,静态成员只有一个实例。没有为每个对象创建新成员。 在这个问题中,我们使用一个静态计数器变量来跟踪对象的数量,然后静态成员将在那里显示计数值。

  • 我希望函数位于类中(不污染全局名称空间),但可以静态访问(从不创建它们所在的对象)。提议的解决办法: 这是一个好的解决方案,还是不可避免地会创建一个对象?我应该使用哪种图案?

  • 问题内容: 我是一名初级android开发人员,几乎完成了第一个大型项目的alpha版本。我认为我对Java有很好的了解,但是我不确定我是否正确组织了我的应用程序。 简短说明: 我在我的应用程序中使用凌空库来发送和接收来自服务器的数据。因此,我创建了一个类来管理服务器方法。在该类中,我为需要的每个服务器连接创建了很多静态方法(如本例所示): 所以在我的活动中,我这样称呼 我的问题是: 这样调用服务