首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Kotlin变量简介 ( 可空类型 | lateinit | 初始化判定 | 非空类型 | !! 与 ? 修饰符 | ?= ?. ?: 运算符 | 抽象属性变量)

Kotlin 变量总结 II . Kotlin 非空变量 III . 非空变量不能赋空 IV . lateinit 关键字 V . lateinit 初始化判定 VI ....Kotlin 变量分类 : Kotlin 变量分为两种 , 非空变量 和 可空变量 , 其中非空变量是困扰广大 Java 开发者的一大难题 , 因为 Java 没有非空变量这个概念 , Kotlin...等操作 , Java 的所有变量都是可空的 ; 2 . Kotlin 变量的默认状态 : Kotlin 变量默认是非空变量 , 默认状态下 , Kotlin 必须进行初始化 ; 3 ....Kotlin 可空变量 ---- Kotlin 的可空变量 , 与 Java 变量性质相同 , 所有的 Java 变量都是可空变量 ; 1 ....Kotlin 变量初始化 : Kotlin 变量是必须进行初始化的 , 可空变量 与 非空变量要求不一样 , 但是原则上都必须初始化 ; ① 非空变量 : 非空变量可以使用 lateinit 修饰

2.4K20

Kotlin】类的初始化 ④ ( lateinit 延迟初始化 | ::属性名称.isInitialized 检查属性是否初始化 | lazy 惰性初始化 )

文章目录 一、lateinit 延迟初始化 ( ::属性名称.isInitialized 检查属性是否初始化 ) 二、lazy 惰性初始化 一、lateinit 延迟初始化 ( ::属性名称.isInitialized...检查属性是否初始化 ) ---- 在定义属性时 , 可以使用 lateinit 关键字 设置该属性的 延迟初始化 , 在 实例对象 创建时不进行初始化 , 在使用该属性之前对其进行初始化即可 ; 对于...lateinit 延迟初始化 的属性 , 在使用前可以执行 ::属性名称.isInitialized 检查 , 查看该属性是否进行了初始化操作 ; 代码示例 : class Hello{ lateinit...name 属性值为 Tom 二、lazy 惰性初始化 ---- lazy 惰性初始化 的 属性初始化操作 是 提前定义好的 , 在 调用之前 自动进行初始化操作 , 如果不调用 , 则不进行初始化...; lateinit 延迟初始化 的 属性初始化操作 , 需要 手动进行初始化 , 如果忘了初始化直接调用就会报错 ; 代码示例 : class Hello{ val name by lazy

1.3K10

Kotlin:关键字之lateinit

Kotlin定义变量或者属性都是需要初始化值的,并且其都是private的,但是有些时候对于变量或者属性只需要声明,但是不需要初始化,则kotlin提供了lateinit关键字来实现: class...,char,short ,int,long,float,double) 也许有人会问到为什么为什么不可以修饰原始数据类型 对于对象类型,Kotlin使用 null 值,以标记 lateinit 属性尚未初始化...因此,仅对象类型的属性支持 lateinit 但是 lateinit 是一个坑,对于新手来说还是一个不小的坑 在 Kotlin 代码慎用 lateinit 属性 这位作者解释的很清楚了 对于 Kotlin...最后再提一下Kotlin lateinit 和 by lazy 的区别: 1.lazy{} 只能用在val类型, lateinit 只能用在var类型 : val name: String by...lazy { “sherlbon” } lateinit var adapter: MyAdapter12 2.lateinit不能用在可空的属性上和java的基本类型上 lateinit

89920

Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 )

属性初始化器 IV . get / set 属性访问器 V . 属性幕后字段 field VI . 变量和常量的区别 VII . 延迟初始化属性 lateinit I ....属性与字段 : ① 类属性本质 : 类定义的属性是一系列方法和代码块的集合 , 属性初始化器 , 属性访问器 , 属性声明等 , 这不是一个字段 ; ② 没有字段概念 : 在 Kotlin 语言中不能声明字段...初始化方式不同 : 变量即可以使用 set 初始化 , 也可以使用初始化器进行初始化 ; 常量不允许定义 set 方法 , 只能在初始化器中进行初始化 ; VII ....属性定义位置 : 尽量定义在类 , 1.2 之后的 Kotlin 版本可以定义在主构造函数 和 局部变量 , 不过为了代码兼容 , 还是在类定义延迟初始化属性 ; 5 ....//在类定义 //不要定义 属性初始化器 //不要定义 getter setter 属性访问器 lateinit var name : String }

1.2K10

Kotlin 究竟该不该用 lateinit

因为被 lateinit 标记的变量,不再接受空安全检查,它的表现更像是一个普通的 Java 变量。...当调用 lateinit 变量时,它此时如果没有被初始化,就会抛出UninitializedPropertyAccessException;如果已经初始化了,则操作一定会执行。...而解决方案根据不同情况有两种: 是异常路径导致, Activity.onCreate() 时数据不正确,需要 finish Activity 不再执行后续初始化代码。...在 Java 我们通过增加一堆空判断来解决这个问题,Kotlin 可以使用 nullable 对象。 而 lateinit 通过舍弃空安全机制,把空安全交回到开发者手上(就像 Java 那样)。...目前依然有典型的 lateinit 适用场景,Activity.onCreate()初始化的属性。

1.9K20

变量声明和变量状态设计

Android 开发基本只要考虑 Activity 是否间接被单例这样生命周期过长的对象持有即可。...针对这种情况,可以使用 Kotlinlateinit 关键字。lateinit 人如其名,它表示这个对象会在稍后被初始化。...如果一个变量被声明为 lateinit,你可以不用在声明时初始化它,在任意地方把它当作非空类型直接使用。...所以使用 lateinit 关键字,就需要你自己保证调用顺序,保证调用时变量已经被初始化Kotlin 不再帮你把关了。...以后不再为空即是他和可空变量的区别,从状态复杂度来看,lateinit 变量是介于非空变量和可空变量之间的。 使用 lateinit 是一个有风险的事情,因为非空的条件变复杂了(初始化后才是非空)。

1.6K30

Kotlin 1.2 有哪些新特性

原文链接是《What's New in Kotlin 1.2》,下面的译文节选了“其它的语言特性”部分(“Other Language Features”) 通过注解声明数组变量Kotlin1.2...关键字lateinit支持全局变量和局部变量 现在lateinit修饰符能够用于全局变量和局部变量了,也就是说,二者都允许延迟初始化。...Kotlin编译器现在支持通过强制转换的信息,来推断出变量类型。...如果你在调用一个返回“T”的泛型方法时,试图将它的返回值“T”转换为特定类型“Foo”,编译器现在知道这个方法调用的“T”其实是“Foo”类型。...比如下面这样: val button = findViewById(R.id.button) as Button 智能转换的改进 当一个变量为某个安全表达式(校验非空)所赋值时,智能转换也同样运用于这个安全调用的接收者

87220

Kotlin Android】一个列表带你领略Kotlin简洁之风

= null 或 lateinit var 变量名: 变量类型 : var value: Int = 1 或 var value = 1 或 var value: Int?...= null lateinit var value: A //A为非基础类型的类 第一种方式,最完整的声明方式; 第二种方式,省略变量类型声明,直接赋值,因为Kotlin带有自动推断变量类型的功能;...第三种方式,如果你不想声明变量的同时初始化变量,那么可以使用“?”...来表明这个变量有可能为null,并赋值为null; 第四种方式,如果你只想声明变量,那么可以使用lateinit关键来表明该变量在后面才进行初始化(注:基础类变量不能指定为lateinit,并且lateinit...,可以在里面直接使用构造函数的参数来完成数据的初始化 3,子类必须在默认的构造方法初始化基类的参数 4,构造函数名字为constructor,而非像Java用的是类名 Kotlin 函数定义 Kotlin

1.8K10

浅谈Kotlin(六):lateinit、by lazy 使用

Kotlin中有两种延迟初始化的方式。一种是lateinit var,一种是by lazy。...一、lateinit的使用 按Java的写法,此时即代表datas默认为null,但是因为Kotlin的非空机制,这里给出了两种选择,要不给一个初始值,要不增加lateInit修饰 则可以这么写:...*/ 也可以这么写: 表示我先不给一个初始值,编译期的时候也无需进行非空判断,后面我会找时机给他赋值 即late的作用为编译期在检查时不要因为属性变量未被初始化而报错 lateinit var datas...:ArrayList 当然若在使用该变量的时候仍未给赋值,则会报错 Caused by: kotlin.UninitializedPropertyAccessException: lateinit...时再进行初始化 打印结果: lazyParm初始化 lazyParm->aaa by lazy使用限制: 要求属性声明为val,即不可变变量,在java相当于被final修饰。

2.7K32

Kotlin学习笔记(二)-程序结构(上 )

[TOC] 前言 上节我们主要讲了Kotlin的数据类型,这节我们主要从程序结构,包括方法,类成员,运算符的角度去认识Kotlin 常量与变量 上一节我们已经用到了用val,var来修饰属性。...是面向函数的,函数是一等公民,是在Java你可以将调用一个对象,也可以将一个对象传来传去,在Kotlin函数也是可以的做到像Java对象一样,下面结合代码来体验一下 fun main(args: Array...接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void在Kotlin时Unit) (String s) -> System.out.print(s) Lambda表达式要是细说的话可能一篇文章也不够...var x1: X // lateinit val x2: //错误 不可以 val 类似final 定义后别虚初始化 val x2: X by lazy {...建议val/var修饰的属性最好直接初始化或是在构造方法初始化,如果不可以就降级为局部变量** lateinit延时初始化,不可以修饰val,不可以修饰基本数据类型(因为基本数据类型有默认值),理智使用

60320

Kotlin 1.2 新特性

关键字lateinit lateinit 和lazy一样,是 Kotlin的两种不同的延迟初始化技术。...在Kotlin1.2版本,使用lateinit修饰符能够用于全局变量和局部变量了,也就是说,二者都允许延迟初始化。...比如说,如果你在调用一个返回“T”的泛型方法时,并将它的返回值“T”转换为特定类型“Foo”,编译器就会推断出这个方法调用的“T”其实是“Foo”类型。...val button = findViewById(R.id.button) as Button 智能转换 当一个变量为某个安全表达式(校验非空)所赋值时,智能转换也同样运用于这个安全调用的接收者。...弃用:枚举条目中的嵌套类型 在枚举条目中,inner class由于初始化逻辑的问题,定义一个非嵌套的类型已经被弃用了。这会在Kotlin 1.2引起警告,并将在Kotlin 1.3出错。

1.7K100

Java变量初始化顺序

Java变量初始化顺序 在写一个通用的报警模块时,遇到一个有意思的问题,在调用静态方法时,发现静态方法内部对静态变量引用时,居然抛出了npe,仿佛是因为这个静态变量初始化在静态方法被调用时,还没有触发...那么第二个问题来了,前面说到哪个问题是什么情况 最开始说到,在调用类的静态方法时,发现本该被初始化的静态成员,依然是null,从上面的分析来说,唯一的可能就是在成员变量初始化的过程,出现了异常 那么...成员变量初始化 测试case也比较简单,把前面的代码的static去掉即可, 输出 a init! 1 b init! 2 gen A: 2 a init! 2 b init!...实例代码块,构造方法)-》子类实例变量(属性,实例代码块,构造方法) 相同等级的初始化的先后顺序,是直接依赖代码初始化的先后顺序 2....注意 因此,请格外注意,在初始化代码,请确保不会有抛出异常,如果无法把控,不妨新建一个init()方法来实现初始化各种状态,然后在代码主动调用好了 V.

1.1K10

Kotlin知识点面试点2

kotlin中有没有用到;的时候 kotlin中一般会把;省略,但是有两种情况还是会用到: 枚举,如果有方法的情况,必须用;来分割枚举常量列表和方法 enum class Color { RED...和by lazy 上篇说过,Kotlin有空限制,所以有些变量如果不想设置为空的时候初始化该怎么做呢?...这就用到延迟初始化了,lateinit和by lazy都能实现。...lateinit lateinit用于修饰var变量,它会让编译器暂时忽略初始化这个事情,到后面用的时候我们在进行初始化,但是不能用到基本数据类型,比如int,double这种。...lateinit var test: String by lazy by lazy用于val类型的变量,它会暂时不进行初始化,并且在第一次使用的时候自动调用我们设置好的表达式进行初始化

91920

Kotlin入门(22)适配器的简单优化

问题出在Kotlin要求每个变量都要初始化上面,视图持有者ViewHolder作为一个内部类,目前虽然无法直接对控件对象赋值,但是从代码逻辑可以看出先从布局文件获取控件,然后才会调用各种设置方法。...毋庸置疑,该想法合情合理,Kotlin正好提供了这种后门,它便是关键字lateinit。...lateinit的意思是延迟初始化,它放在var或者val前面,表示被修饰的变量属于延迟初始化属性,即使没有初始化也仍然是非空的。...}     //ViewHolder的属性使用关键字lateinit延迟初始化     inner class ViewHolder {         lateinit var ll_item:...lateinit,表示该属性为延迟初始化属性; 网格视图 在前面的列表视图一小节,给出了Kotlin改写后的适配器类,通过关键字lateinit固然避免了麻烦的空校验,可是控件对象迟早要初始化的呀

1.3K10

Kotlin 1.2 的新增特性

Lateinit 顶级属性和局部变量 lateinit 修饰符现在可以用在顶级属性和局部变量上。...例如,当一个 lambda 作为构造函数参数传递给一个对象时,后者可以用于引用另一个必须稍后定义的对象: lateinit修饰符现在可以用在顶级属性和局部变量上。...目标平台:运行 Kotlin 1.2.0 版本的 JVM 检查一个 lateinit 变量是否被初始化 现在可以在属性引用上使用 isInitialized 来检查 lateinit 变量是否已经被初始化...弃用:枚举项的嵌套类型 在枚举项,由于初始化逻辑的问题,定义一个不是内部类的嵌套类型的功能已经被弃用。在 Kotlin 1.2 这将会引起警告,并将在 Kotlin 1.3 中报错。...这可能会影响应用程序的整体性能;仅在多个类之间共享一些复杂的状态并在类初始化时更新时才使用它。 “手工”的解决方法是将控制流的子表达式的值存储在变量,而不是直接在调用参数对它们进行求值。

2.8K70

Kotlin 机制你都了解吗?

什么是 kotlin? ---- kotlin 是静态类型的编程语言,运行于 jvm 之上。如果在编译时知道变量的类型,则语言是静态类型的,在运行时知道变量类型,则语言是动态类型。 2....在某个类,如果某些成员变量没办法在一开始就初始化,并且又不想使用可空类型(也就是带?的类型)。那么,可以使用 lateinit 或者 by lazy 来修饰它。...lateinit 只能用于修饰变量 var,不能用于可空的属性和 Java 的基本类型。 lateinit 可以在任何位置初始化并且可以初始化多次。...相当于 java 的 static final 修饰。该val关键字还用于只读属性。但是 const 和之间的主要区别在于 val,val 属性也可以在运行时进行初始化,即不可变变量。 10....如果这些函数的任何一个在类体显式定义或继承自其基类,则不会自动生成该函数。如果变量是 val 修饰,只会生成 get 方法。 11. 什么是 Range 操作符?

76030

Kotlin 1.2 的新增了哪些特性?

Lateinit 顶级属性和局部变量 lateinit 修饰符现在可以用在顶级属性和局部变量上。...例如,当一个 lambda 作为构造函数参数传递给一个对象时,后者可以用于引用另一个必须稍后定义的对象: lateinit修饰符现在可以用在顶级属性和局部变量上。...目标平台:运行 Kotlin 1.2.0 版本的 JVM 检查一个 lateinit 变量是否被初始化 现在可以在属性引用上使用 isInitialized 来检查 lateinit 变量是否已经被初始化...弃用:枚举项的嵌套类型 在枚举项,由于初始化逻辑的问题,定义一个不是内部类的嵌套类型的功能已经被弃用。在 Kotlin 1.2 这将会引起警告,并将在 Kotlin 1.3 中报错。...这可能会影响应用程序的整体性能;仅在多个类之间共享一些复杂的状态并在类初始化时更新时才使用它。 “手工”的解决方法是将控制流的子表达式的值存储在变量,而不是直接在调用参数对它们进行求值。

2.8K10

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券