kotlin学习---Field

经典密码体制(上) 头歌 阅读详情

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做特殊处理,不然不需要写出来。

13、网络通信中的字节序与内存测试 本文主要探讨了网络通信中的字节序问题以及嵌入式系统中内存测试的相关内容。在网络通信部分,重点分析了大端序和小端序的差异,以及TCP/IP协议中字节序的转换机制,并介绍了相关的宏定义和实现方法。在内存测试部分,详细阐述了内存测试的目的、常见问题以及具体的测试策略,包括数据总线测试、地址总线测试和设备测试。通过这些内容,嵌入式程序员可以更好地理解并解决实际开发中可能遇到的字节序和内存问题,从而提高系统的稳定性和可靠性。 阅读详情

相关推荐

ArcGIS+PLUS+InVEST三件套实战:从零搞定土地利用变化与碳储量预测(附完整数据包)

本文详细介绍了如何整合ArcGIS、PLUS模型和InVEST模型,构建土地利用变化与碳储量预测的完整研究流水线。通过多情景模拟和生态系统服务评估,提供从数据准备到结果验证的实战指南,助力研究者高效完成生态评估项目。

weixin_30399821的博客 543

kotlin之field属性

在创建实体类时,自动生成,用以替代属性名称。

fynzhy的博客 1513

Qt5+OSG实战:如何用osgQOpenGLWidget在窗口中加载3D模型(附完整代码)

本文详细解析了如何在Qt5中使用osgQOpenGLWidget加载和渲染3D模型,涵盖环境配置、核心架构、性能优化及高级技巧。通过实战案例和完整代码,帮助开发者实现工业级3D模型渲染,提升Qt与OSG的整合效率。

weixin_42741930的博客 263

在Kotlin中,`field`关键字是一个特殊的标识符,用于在属性的自定义getter和setter中访问backing field(存储属性值的实际字段)

以下是一个示例,展示如何使用fieldget() = field.uppercase() // 自定义 getterfield = value.trim() // 自定义 setterprintln(user.name) // 输出 "JOHN DOE"在这个示例中,name属性有一个自定义的getter和setter。getter将field的值转换为大写,而setter将传入的值去掉首尾空格,然后赋值给field。

micro9981的专栏 923

汽车工程师必看:从CAN到Ethernet,6种车载通信协议全解析(附应用场景对比)

本文全面解析了从CAN到Ethernet的6种车载通信协议,包括CAN、LIN、MOST、FlexRay等,并对比了它们的应用场景和技术特点。文章详细介绍了各协议的演进历程、技术优势及在现代汽车中的混合网络架构设计,为汽车工程师提供了实用的协议选型指南和未来通信技术发展趋势。

weixin_28683689的博客 492

基于单片机的室内空气质量监控系统设计

摘 要 I Abstract II 引 言 1 1 控制系统设计 3 1.1 方案选择 3 1.2 系统控制原理 4 2系统硬件设计 5 2.1 单片机的选择与设计 5 2.2 温湿度模块设计 6 2.3 甲醛采集模块设计 8 2.4 显示器模块设计 9 2.5 按键模块设计 10 2.6 报警模块设计 11 2.7 加湿及风扇模块设计 11 3系统软件设计 13 3.1 总流程方案设计 13 3.2 温湿度获取的软件设计 14 3.3 液晶屏LCD1602的软件设计 15 4系统调试 13 4

Q_1928499906的博客 2701

Kotlin 中定义类、field关键字,主构造函数和次构造函数详解

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下。1、定义类与field关键字,以及计算属性,和防范竞态条件。,感觉非常有意思,忍不住分享一下给大家。4、多个次构造函数来配置不同的参数组合。

路宇的博客 527

EXCEL VBA从入门到精通 第一章:VBA入门

在VBA中,需要使用关键字Dim来定义一个变量,后面跟上变量名和变量的数据类型。例如,下面的代码定义了一个整型变量x和一个字符串变量name在VBA中,使用关键字Const来定义常量,后面跟上常量名和常量的值。例如,下面的代码定义了一个整型常量MAX_NUM和一个字符串常量MESSAGE需要注意的是,常量一旦被定义,其值就不能被改变。

1万+

kotlin基础教程:<7>类和field

和Java一样,kotlin也是具有类这个概念的,想到类,就会想到构造方法,毕竟一个类要想获取数据,构造方式是一个很重要的知识点,kotlin的构造方法有两类,一个是主构造,一个是次构造,而field只是一个字段,等价于成员变量的值;上一期我们介绍了一下map集合,用来存放键值对,通过运算符重载的方式可以实现数据增删操作,通过foreach,增强for可以遍历集合;那么这一期就到了类的学习,内容较多,分期讲:1、kotlin和Java的类创建不太一样,kotlin的成员是自带有Java中的getset的,而

aiwanchengxu的博客 900

基于 Qt C++ 的 船舶导航系统 UI

你想实现一个基于 **Qt C++** 的 **船舶导航系统 UI**,核心功能包括 **Qt Quick** 电子海图显示和 **NMEA 0183** 协议解析。"断开" : "连接"创建一个 Qt Quick 项目,选择 **Qt 6** 版本,确保勾选 **Qt Quick**、**Qt Network** 和 **Qt SQL** 模块。Label { text: "纬度:" }3. **连接设备**:点击 "连接" 按钮连接到 GPS 设备或模拟数据源。title: "连接设置"

寒寒豆豆软件公司的博客 127

代谢组数据分析(三):代谢组降维分析

本文详细介绍了代谢组学中常用的降维分析方法,包括PCA、PLS-DA和OPLS-DA。PCA通过线性变换降低数据维度,便于数据可视化和异常值检测;PLS-DA是一种有监督的模式识别方法,适用于分类和预测;OPLS-DA通过正交分解避免过拟合,更准确地筛选差异代谢物。降维分析在揭示样本间差异和发现生物标志物方面具有重要意义

专注生信领域 3790

Kotlin入门-必会,属性篇

前言 本文从以下几个方面进行阐述 定义 getter和setter var val getter和setter方法的权限 注意 幕后字段 什么时候没有field字段? 幕后属性 定义 对于 JVM 平台 幕后字段与幕后属性的区别 编译期常量 延迟初始化属性与变量 解决办法 适用范围 注意 检测一个 lateinit var 是否已初始化(自 1.2 起) 覆盖属性 委托...

王学明 1554

手把手教你学simulink实例--基于Simulink的航空航天器飞行轨迹规划与仿真详细介绍

航空航天器飞行轨迹规划是实现高效、安全和精确飞行的关键技术。通过Simulink进行航空航天器飞行轨迹规划与仿真,可以验证控制算法的有效性、优化飞行路径,并降低开发成本。以下是如何在MATLAB和Simulink中设计并仿真一个航空航天器飞行轨迹规划系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的航空航天器飞行轨迹规划与仿真系统。该系统能够根据实时环境变化动态调整飞行轨迹,从而提高飞行效率、降低燃料消耗并提升安全性。

MHD0815的博客 390

Kotlin Backing Field 学习笔记

Backing field是访问器中唯一保存属性内容的地方,如果直接调用getters/setters可能会有递归问题。本文分析其具体原因。

输出与提升 412

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Kotlin学习系列之:理解Backing Field

对于Backing Field这个概念,在Java中是没有的,是Kotlin中新引入的概念。我们先来看看它在什么情况下使用: class Person { var username: String = "hello" get() { println("getter invoked...") return field } set(...

xlh1191860939的博客 1332

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Kotlin 全面学习之路 (九) -- 对 Kotlin 中 Backing Field 的理解

很烫

Strange_Monkey的博客 1598

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Kotlin语言类,field关键字,计算属性,防范竟态条件学习

Kotlin语言类,field关键字,计算属性,防范竟态条件学习

XXX_17的博客 1062

【第四阶段】kotlin语言的定义类和field关键字学习

为什么在kotlin中是private 可以直接调用,隐式代码如下。1.普通成员变量背后隐士代码。2.field关键字。

ll_j_21的博客 391

kotlin backing field

kotlin的class里边的property概念跟java的class里边的feild或者property概念还不太一样。 kotlin的代码最终都要转化成Java代码,kotlin的类里边的属性不一定都要对应一个java类里边的属性,必须满足一以下条件之一: 1. 使用至少一个缺省accessor(getter or setter) 2. 如果使用了定制accessor, 在accessor方法内,有通过feild去访问类的成员变量 (Kotlin will generate a backing

Tom098的博客 1849

kotlin之get、set和field

kotlin之get、set和field

转载和创作优秀的博客 1190

Java和Kotlin的Field在继承中的不同表现

Kotlin是一个宣称与Java兼容性较好的语言,但在接触后发现一些技术还是有“概念上”的冲突,本文就记录下两者对象的Field(中文的说法有字段、域、属性、成员变量,下文若出现这些表达,指的都是这个东西)在继承中的不同表现。

乐征skyline 656

Kotlin back field

在Kotlin中,幕后字段是什么东西?又什么作用???? 在 官方文档 中看到的幕后字段,大大的问号,也看不懂文档,于是我们要去找例子来理解。 这里的例子来自 stackoverflow 需要先去看看官方文档再来看这下面才比较容易 class Sample { var counter = 0 // the initializer value is written directly to the backing field set(value) { if (value >

weixin_44374594的博客 1844

kotlin基础7:getter setter 幕后字段field

一、对比java的类声明和kotlin的类声明 public class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } 熟悉java的一定很清楚,这是最常见的写法 然而在kotlin里面,写法就非常简单了: cla

拒绝AI文,努力在AI时代写出感动人心的好文章 1893

kotlin when interface‘s field set/get

kotlin类成员变量字段field的get/set_zhangphil的博客-优快云博客。kotlin类成员变量字段field的get/set。

Zhang Phil 743

kotlin碰到的坑-kotlin No field Companion of type

kotlin碰到的坑 No field Companion of type tl;dr 这是在开发sdk碰到坑 本质是kotlin编译器问题,也就是kotlin编译前端的问题,如果sdk版本的类文件Companion+JvmStatic标识静态函数的做法改变了应该直接提示编译错误,终止编译 引起的原因: sdk A 版本1的类文件 YourClass里面有个Companion对象 sdk A 版本2中类文件 YourClass去掉了Companion对象 sdk B 版本1依赖了sdk A 版本1 ap

A991192001的专栏 2162

Kotlin基础语法-属性(Property)与域(Field)

属性(Property)与域(Field) 声明属性 Kotlin 中的类可以拥有属性. 可以使用 var 关键字声明为可变(mutable)属性, 也可以使用 val 关键字声明为只读属性. public class Address { public var name: String = ... public var street: String = ... publ

keepuping的博客 2634
上一篇: Kotlin 学习--语言基础
warmming
博客等级 码龄10年 2粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值