• Kotlin 中 val const JvmField JvmStatic 的区别


    本文地址


    目录

    val const JvmField JvmStatic

    四个关键字的本质含义

    • val 的含义是 不可变,等价于 final
      • 所以其有 getter 无 setter,因为有 setter 的话就违背了其 不可变 的特性
    • const 的含义是 常量,等价于 static final
      • 所以其只能修饰 val 属性,不能修饰 var 属性,因为修饰 var 的话就违背了其 常量 的特性
      • Modifier const is not applicable to vars
    • @JvmField 的含义是 字段,也就是说 可被直接访问
      • 用其修饰的属性会被直接访问,而不是通过 getter/setter 方法间接访问(也没有这两个方法)
      • 所以其不能修饰 private 属性,因为修饰 private 的话就违背了其 可被直接访问 的特性
      • @JvmField has no effect on a private property
    • @JvmStatic 的含义是 静态,其是专门为应对 Java 中的 static 静态 而生的
      • 作用于属性时,会把其 get/set 方法变成静态的。PS:属性本身会被转换成private static
      • 作用于方法时,会把该方法变成静态
      • 其意义仅仅在于,让在 Java 中调用 Kotlin 的时候,和在 Kotlin 中调用 Kotlin 的时候,一样友好
      • Only members in named_objects and companion_objects can be annotated with @JvmStatic

    const 和 JvmField 的区别

    • @JvmField 可以修饰 var/valconst 只可以修饰常量 val
    • @JvmField 不能和 private 一起使用,const 可以和 private 一起使用
    • @JvmField 可以用在普通的 class 中,const 只是用在 object 或顶层中
      • const_val are only allowed on top level or in objects
      • const_val might be used instead of @JvmField_val in objects

    从 Java 的角度来看

    • Kotlin 中的普通属性不能直接访问,需要通过其 getter/setter 间接访问
      • class/object 中的 var 有 getter 有 setter,等价于 private
      • class/object 中的 val 有 getter 无 setter,等价于 private final
      • 注意,从 Java 的角度来看,object 中的 var/val 依旧是普通属性,而非静态属性
      • 因为属性需要通过对象 INSTANCE 间接访问,例如:Man.INSTANCE.getName()
    • Kotlin 中的 @JvmField 属性:可以直接访问,并且没有 getter/setter 方法
      • class 中的 @JvmField var 等价于 public,需要借助对象访问
      • class 中的 @JvmField val 等价于 public final
      • object 中的 @JvmField var 等价于 public static,可以脱离对象直接访问
      • object 中的 @JvmField val 等价于 public static final,且会被 IDE 提示改为 const val
    • Kotlin 中的 const 属性:静态变量/静态常量,并且没有 getter/setter 方法
      • object 中的 const val 等价于 @JvmField val,等价于 public static final
      • object 中的 private const val 等价于 private static final,只能在 object 内部才能访问
    • Kotlin 中的 @JvmStatic 成员:静态成员
      • 其是专门为应对 Java 中的 static 而生的,对 Kotlin 来说,这个关键字并没有什么意义
      • 由于其仅可以应用在 object 中,所以其天生就是为了,让 Java 中可以以静态方式访问而生的

    2022-5-4

  • 相关阅读:
    2010年度最有技术含量攻击:Padding Oracle Attack 狼人:
    微软宣布最新企业安全产品FEP 免费试用 狼人:
    金山卫士开放第三批源代码 ARP防火墙可下载 狼人:
    Gawker攻击事件暴露密码保护缺陷 狼人:
    Win7和Mac及HTML5将成黑客2011年攻击重点 狼人:
    开发人员发现Chrome浏览器漏洞获谷歌重奖 狼人:
    FBI被指在OpenBSD的IPSEC协议栈中放置后门 狼人:
    微软发布重大安全忧患警告或影响全球9亿用户 狼人:
    MHTML中曝出0day漏洞 影响各版Windows 狼人:
    nullnullCSharp Tools Compiler
  • 原文地址:https://www.cnblogs.com/baiqiantao/p/16220140.html
Copyright © 2020-2023  润新知