kotlin学习--Field

Field(幕后属性)

field:幕后字段是自动生成的,它仅仅可以被用在拥有至少一个默认访问器 (getter、setter) 、或者在自定义访问器中通过 field 标识符修饰的属性中。幕后字段可以避免访问器的自递归而导致程序崩溃的 StackOverflowError异常。
为什么会照成这种异常呢?
原因在于在kotlin中,任何时候写了一个变量后面加上等号的代码时,这个等号都会被编译器翻译成调用setter方法,比如:var biao:Int = 1。任何时候当你引用变量时,就会被编译器翻译成调用getter方法。让我们看看代码和反编译成java之后的代码是如何的

class TestKotlinClass {
    var biao:Int = 1
    get() = biao
    set(value) {
        if (value >1){
            biao = value
        }else{
            biao = 1
        }
    }
}   

var testKotlinClass = TestKotlinClass()
testKotlinClass.biao = 2
println("了解class-->${testKotlinClass.biao}")

当我们运行这一段代码就会出现StackOverflowError异常。看看反编译之后的Java代码(点击as的菜单栏 Tools/Kotlin/Show Kotlin Betycode/Decompile可以获取)

public final class TestKotlinClass {
   public final int getBiao() {
      return this.getBiao();
   }

   public final void setBiao(int value) {
      if (value > 1) {
         this.setBiao(value);
      } else {
         this.setBiao(1);
      }
   }
}

看到这里就很清晰了,在getter和setter里面我们都用到了biao属性,这时候在getter、setter方法形成了递归调用,最终程序会因为内存溢出而中止程序(StackOverflowError异常)
让我们看看使用了field的代码

var biao:Int = 1
    get() = field
    set(value) {
        if (value >1){
            field = value
        }else{
            field = 1
        }
    }

反编译成Java

private int biao = 1;
   public final int getBiao() {
      return this.biao;
   }
   public final void setBiao(int value) {
      if (value > 1) {
         this.biao = value;
      } else {
         this.biao = 1;
      }
   }

可以看出field让getter和setter方法调用了属性而不是递归调用自身方法,从而就不会出现内存溢出的异常

其实在kotlin中getter和setter是自动生成的,而field也是自动生成,所以当我们在定义属性的时候,除非是要对getter和setter做特殊处理,不然不需要写出来。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 备用字段?幕后字段?支持字段?后端域变量?翻译这么多种,其实都是一个意思 Backing Field。 找到一些关...
    JCYDSHANKS阅读 1,890评论 0 0
  • 系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正。如果你觉得我的文章对你有用,欢迎关注我,我们一起...
    我爱吃栗子啊阅读 14,419评论 3 8
  • 本文收录于 kotlin入门潜修专题系列,欢迎学习交流。 创作不易,如有转载,还请备注。 属性的定义 我们都知道在...
    寒潇2018阅读 796评论 0 2
  • Kotlin的类和接口与Java的类和接口是有一定的区别的。Kotlin的接口是可以包含属性声明。Kotlin默认...
    程自舟阅读 10,448评论 0 11
  • 新年寄语 时光 文/雪枫 匆匆是脚步的划痕 记忆在心口上 风干成梅树的枯枝 背影越去越远 迎面而来的 是一...
    雪枫70阅读 310评论 2 1