首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin 机制你都了解吗?

伴生对象的总结 ---- 类似于 Java 中使用类访问静态成员的语法。因为 Kotlin 取消了 static 关键字,所以 Kotlin 引入伴生对象来弥补没有静态成员的不足。...可见,伴生对象的主要作用就是为其所在的外部类模拟静态成员。 注意: 每个类可以最多有一个半生对象; 使用 const 关键字修饰常量,类似于 Java 中的 static final修饰。...可以使用 @JvmField 和 @JvmStatic 类似于 Java 中调用静态属性和静态方法; 伴生对象可以扩展属性和扩展方法。...伴生对象转为了静态代码块,init 代码块插入到了构造方法的开头处。静态代码块在编译期运行,然后依次运行构造方法的代码。打印的结构为: ? 结论:伴生对象先于init方法,再先于构造方法。...首先伴生对象中的代码是在类加载时就会执行。init代码块中的方法会按顺序放在主构造函数中,主构造函数中原来的代码会在后面执行。 9. const 和 val 有什么区别?

80430
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Kotlin与Java互操作

    注解的使用 @JvmField是Kotlin和Java互相操作属性经常遇到的注解;@JvmStatic是将对象方法编译成Java静态方法;@JvmOverloads主要是Kotlin定义默认参数生成重载方法...NoArg和AllOpen 数据类本身属性没有默认的无参数的构造方法,因此Kotlin提供一个NoArg插件,支持JPA注解,如@Entity。...静态字段 在命名对象或伴生对象时,声明的 Kotlin 属性会在该命名对象或包含伴生对象的类中包含静态幕后字段。通常这些字段是私有的,但可以通过以下方式之一暴露出来。...如果对这些函数使用@JvmStatic进行标注,那么Kotlin还可以为在命名对象或伴生对象中定义的函数生成静态方法。... 注解也可以应用于对象或伴生对象的属性, 使其 getter 和 setter 方法在该对象或包含该伴生对象的类中是静态成员。

    3.5K30

    Better Kotlin

    3 应该好好注意一下伴生对象 伴生对象通过在类中使用 companion object 来创建,用来替代静态成员,类似于 Java 中的静态内部类。...直接读取一个常量不同,Kotlin 访问一个伴生对象的私有常量字段需要经过以下方法: 调用伴生对象的静态方法 调用伴生对象的实例方法 调用主类的静态方法 读取主类中的静态字段 为了访问一个常量,而多花费调用...对于其他类型的常量,最好在它们自己的主类对象而不是伴生对象中来存储公共的全局常量。...讲到这,自然也就知道了 Kotlin 对 object 的三个作用: 简化生成静态内部类 生成匿名内部类对象 生成单例对象 咳咳,说了那么多,到底和 @JvmStatic 和 @JvmField 有啥关系呢...7 注意 Kotlin 的可空和不可空 最近闹了一个笑话,在项目中需要写一个上传跳绳数据的功能。于是有了下面的代码。

    1.3K20

    Kotlin入门(13)类成员的众生相

    } } 调用成员方法的过程,一样是先在外部声明该类的实例,然后通过“实例名称.方法名称(输入参数)”的形式进行调用,这跟Java没什么区别。...然而Kotlin取消了关键字static,也就无法运用静态成员的相关手段。为了弥补这方面的功能缺陷,Kotlin引入了伴生对象的概念,可以把它理解为“影子”,伴生对象之于它所在的类,仿佛是如影随形。...利用伴生对象的技术,即可间接实现静态成员的功能,前面有个代码从性别类型获得性别名称,反过来也可以从性别名称获得性别类型,这个功能便可以在伴生对象中定义一个judgeSex方法判断性别类型。...”,后一种方式看起来就等同于Java的静态方法。...静态成员包括静态常量与静态方法,它们都在类的伴生对象中定义,外部可以通过类名直接使用静态成员。 点此查看Kotlin入门教程的完整目录

    58220

    Kotlin的扩展函数知识点

    为什么需要扩展 一个新特性的出现必然是为了解决之前遗留的开发问题和提升目前开发效率。扩展函数也是如此。 首先来介绍下OOP:开放封闭原则。 软件应该是可扩展,而不可修改的。...Java中的this叫做调用者,对于普通函数来说就是该函数所属类的实例也就是调用者对象。由于这个函数是属于MutableList的,所以在这个方法体中this也就是指代的MutableList。...静态扩展函数 首先来回顾下普通的静态函数/变量如何定义,在Kotlin中使用伴生对象类将函数/变量定义在其中,那么该函数/变量就是静态函数/变量了。...,其是定义了一个Companion的静态内部类然后再该类中定义了这些静态变量和方法 和普通函数/变量一样,扩展函数也是一样的定义方式,在伴生对象中定义扩展函数: fun Son.Companion.foo...这样似乎看起来没有什么问题,但是当我们需要扩展三方类的静态函数时,如果其没有用Kotlin的伴生对象指定静态方法/变量,那么该方案将无法使用,只能用实例去调用。

    31630

    从 Java 到 Kotlin,再从 Kotlin 回归 Java

    这有几个原因: 名称遮蔽 类型推断 编译时空值安全 类字面量 相反的类型声明 伴生对象 集合文字面量 Maybe? 不 数据类 开放类 陡峭的学习曲线 ? 名称遮掩 ?...伴生对象 ? 一个 Java 程序员来到 Kotlin 阵营。 “嗨,Kotlin。我是新来的,有静态成员可用吗?”他问。 “没有。...我是面向对象的,而静态成员不是面向对象的,” Kotlin回答。 “好吧,但我需要用于 MyClass 日志记录器,该怎么办?” “没问题,可以使用伴生对象。” “伴生对象是什么鬼?”...“它是与类绑定的一个单例对象。你可以把日志记录器放在伴生对象中,” Kotlin 如此解释。 “明白了。是这样吗?” ? “对!...Data classes(数据类)是Kotlin在实现Value Objects(又名DTO)时为减少Java中不可避免的boilerplate的方法。

    1.8K40

    Kotlin|这些隐藏的内存陷阱,你应该熟记于心

    错误示例 sealed 初始化 如题,我们有一个公用的属性 sum ,为了便于复用,我们将其抽离到 Fruit 类构造函数中,让子类便于初始化时传入,而不用重复显式声明。...栈帧: 指的是虚拟机在进行方法调用和方法执行时的数据结构,每一个栈帧里都包含了相应的数据,比如 局部参数,操作数栈等等。...错误示例 如下截图中所示,我们随便创建了一个方法,并增加了 inline 关键字: 观察截图会发现,此时IDE已经给出了提示,它建议你移除 inline , Why? 为什么呢?...伴生对象,也许真的不需要 在 Kotlin 中,我们不能像 Java 一样,随便定义一个静态方法或者静态属性。此时 companion object(伴生对象)就会派上用场。...对于和业务强关联的 key 或者 TAG ,可以选择使用伴生对象,并为其增加 const val,此时语义上的清晰比内存上的损耗更加重要,特别在复杂的业务背景下。

    82330

    Kotlin的互操作——Kotlin与Java互相调用

    ④ 注解的使用 @JvmField是Kotlin和Java互相操作属性经常遇到的注解;@JvmStatic是将对象方法编译成Java静态方法;@JvmOverloads主要是Kotlin定义默认参数生成重载方法...⑤ NoArg和AllOpen 数据类本身属性没有默认的无参数的构造方法,因此Kotlin提供一个NoArg插件,支持JPA注解,如@Entity。...④ 静态方法 Kotlin将包级函数表示为静态方法。如果对这些函数使用@JvmStatic进行标注,那么Kotlin还可以为在命名对象或伴生对象中定义的函数生成静态方法。...C.foo();//没问题 C.bar();//错误:不是一个静态方法 C.Companion.foo();//保留实例方法 C.Companion.bar();//唯一的工作方式 对于命名对象也同样:...();//没问题,通过单例实例调用 Obj.INSTANCE.foo();// 也没问题 @JvmStatic注解也可以被应用于对象或伴生对象的属性上,使其getter和setter方法在该对象或包含该伴生对象的类中是静态成员

    3.8K10

    从 Java 到 Kotlin,再从 Kotlin 回归 Java

    为什么要把名称和类型分隔开?我不知道。不过我知道这会加大使用Kotlin的难度。 第二个问题。在阅读一个方法声明的时候,你最先想知道的应该是方法的名称和返回类型,然后才会去了解参数。...repository : MongoExperimentsRepository 伴生对象 一个 Java 程序员来到 Kotlin 阵营。 “嗨,Kotlin。我是新来的,有静态成员可用吗?”...我是面向对象的,而静态成员不是面向对象的,” Kotlin回答。 “好吧,但我需要用于 MyClass 日志记录器,该怎么办?” “没问题,可以使用伴生对象。” “伴生对象是什么鬼?”...“它是与类绑定的一个单例对象。你可以把日志记录器放在伴生对象中,” Kotlin 如此解释。 “明白了。是这样吗?”...数据类 Data classes(数据类)是Kotlin在实现Value Objects(又名DTO)时为减少Java中不可避免的boilerplate的方法。

    1.5K10

    重学 Kotlin —— object,史上最 “快” 单例 ?

    目录 object 有哪些用法? 对象声明 —— 一个关键字实现单例 ? 伴生对象 —— static 的代替者 ? 对象表达式 —— Kotlin 的匿名内部类 ? 这到底是哪种用法 ?...正文 object 的三种用法 Kotlin 的 object 关键字有三种用法: 对象声明 ,一般用来实现单例 伴生对象 ,类似 Java 的 static 关键字,也可以用于工厂方法模式 对象表达式...通常我们可以在顶层文件中直接定义常量和顶层函数,但有的时候我们的确需要在类中定义静态常量或函数,这样显得更加直观。这就是 伴生对象 的应用场景。...伴生对象仍旧符合这一语义。 在 Java 中如何调用伴生对象呢?User.Companion.isMale(1) 即可。...你可以试着用 Java 代码实现上面的逻辑,对比一下。 伴生对象扩展方法 伴生对象也是支持扩展方法的。还是以上面的 Car 为例,定义一个根据汽车品牌获取汽车类型的扩展方法。

    3.3K20

    【Jetpack】DataBinding 架构组件 ② ( 字符串拼接函数 | 绑定点击事件函数 | DataBinding 布局中使用 import 标签导入 Java、Kotlin 类 )

    、Kotlin 类 ---- 除了将 字符串拼接 函数定义在 传入的 Student 对象中之外 , 还可以 定义在任意类的 静态方法 中 ; 注意 : 只能在 DataBinding 布局中调用静态方法...类 首先 , 定义一个 Kotlin 类 , 在其中的 companion object 伴生对象 定义 Java 静态方法 , 接收一个值 , 拼接字符串 ; 在 Kotlin 中定义 Java 静态方法...: 需要在 companion object 伴生对象 中使用 @JvmStatic 注解修饰函数 ; 在 Kotlin 中定义 Java 静态成员 : 需要在 companion object 伴生对象...类 在 Kotlin 类中 , 需要在 companion object 伴生对象 中使用 @JvmStatic 注解修饰函数 , 才能定义 Java 静态函数 ; package kim.hsl.databinding_demo..., 导入 Student 对象 , 和 定义了静态函数的类 ; 绑定点击事件 : android:onClick="@{student.onClick}" 拼接字符串 : android:text="@

    63050

    Kotlin初探

    声明类型 函数 操作符 数组遍历及控制语句 类与枚举 扩展 代理 伴生对象 单例模式 扩展学习 1 优势 简洁 它大大减少你需要写的样板代码的数量。 安全 避免空指针异常等整个类的错误。...在Kotlin语法中,语句结尾都不在有分号“;”。 在Kotlin中变量声明有两种类型,val修饰变量是只读变量即只能赋值一次,再次赋值时就会编译错误 ,如果我们需要多次修改值就需要使用var。...如果我们的方法体仅仅是打印字符串,并不返回值则: Unit就类似我们java中的void,即没有返回值,此时我们可以省略 对于函数体,方法或者类等和java一样也有一些修饰符,如下 abstract /...() copy() 通过数据类你会看到Kotlin的简洁性,我们创建一个Staff类,有String类型的name,position和泛型T(使用泛型仅仅是为了在Kotlin中接触以下泛型) java...10 扩展 使用 11 代理 12 伴生对象 伴生对象(companion object )类似于java中的静态关键字static。

    1.6K20

    Kotlin 扩展函数 与 JS 的 prototypeKotlin 扩展函数 与 JS 的 prototype

    扩展函数是静态解析的,并未对原类添加函数或属性,对类本身没有任何影响。 扩展属性允许定义在类或者kotlin文件中,不允许定义在函数中。...为什么要使用扩展(动机): 在Java中,有很多工具类如java.util.Collections,使用很繁琐: // Java Collections.swap(list, Collections.binarySearch...显式提供 val Foo.bar = 1 // 错误:扩展属性不能有初始化器 get() = 1 由于扩展没有在类中插入新成员,因此扩展属性无法使用幕后字段, 这就是为什么扩展属性不能有初始化器...3.伴生对象-扩展函数和属性 可为伴生对象定义扩展函数和属性: class MyClass { companion object { } //伴生对象 } fun...prototype 属性使您有能力向对象添加属性和方法。

    1.6K20

    是时候使用Kotlin编程了

    并吸收了其他语言的优点:模板字符串,运算符重载,方法扩展,命名参数等。 2,安全性 Kotlin提供了安全符“?”,当变量可以为null时,必须使用可空安全符?进行声明,否则会出现编译错误。...调用上面集合的方式如下: 6,伴生对象 Kotlin中没有静态属性和方法,如果我们要创建单列,可以使用Object关键字声明类。...伴生对象的调用跟Java一样,通过类名.属性名称或函数名称调用。 新特性 1,空安全 在Kotlin中,对象声明分为可空引用和非空引用两种。...但是这里要注意一点,如果从Java返回的集合,不会强制做可空检查,这个是时候如果给不可空引用赋值Java集合中的null会出现转换错误异常。...Kotlin中的反射如下。 要调用具体的对象时,可以不通过KClass对象,直接调用方法和访问属性。

    3.3K10

    【Kotlin】Kotlin 单例 ( 懒汉式 与 恶汉式 | Java 单例 | Kotlin 单例 | 对象声明 | 伴生对象 | get 方法 | ? 与 !! 判空 )

    Java 中的懒汉式与恶汉式 III . Kotlin 中对应 Java 的懒汉式与恶汉式 IV . Kotlin 对象 ( object ) 声明 V ....单例类特点 : ① 私有静态化单例成员变量 ; ② 私有化构造函数 ; ③ 公共静态获取单例方法 ; 详细的 Java 与 Kotlin 单例示例详细看下面的四个示例 II ....Kotlin 中对应 Java 的懒汉式与恶汉式 ---- 1 ..../** * 饿汉式单例模式实现 * 被 object 关键字修饰的类时静态类 , 该类的成员方法和变量都是静态的 * 调用时直接使用 Student.study() 即可调用该方法...Kotlin 懒汉单例模式 : 该示例中涉及到了伴生对象 , 字段 getter 方法定义 , ? 和 !!

    85220

    Kotlin安卓开发学习-标准函数和静态方法

    其最主要使用的是with、run和apply这三个函数。 with函数会在Lambda表达式中提供第一个参数对象的上下文,并使用Lambda表达式中的最后一行代码作为返回值返回。...熟练使用这些函数,能够更快地完成数据的解析方法。 静态方法 在编程中,静态方法是很重要的一环。但Kotlin弱化了静态方法这个概念,因为kotlin提供了比静态方法更好的语法特性–单例类。...只是Kotlin会保证Util类始终只会存在一个伴生类对象,因此调用Util.doAction2()方法实际上就是调用了Util类中伴生对象的doAction2()方法。...但上诉方法本质上并不是静态方法,当我们在java中以静态方法的形式调用这些类时,会发现这些方法并不存在。...除了添加注解来实现静态方法,Kotlin也能使用顶层方法来实现效果。 顶层方法指的是那些没有定义在任何类中的方法。比如我们创建一个新的Kotlin文件,并在内部直接写入方法,那么这个方法就是顶层方法。

    50320

    Kotlin学习笔记(四)-面向对象

    前言 本章将讲解一些管对对象和基础编程的知识。如:类,接口,抽象类,数据类,扩展方法等 接口 其实这部分的设计思路和Java基本一致。...,同时不实现会执行by后面对象里的方法 interface中的抽象方法可以有默认实现。...} 伴生对象与静态成员 kotlin 中时没有static 这种方法修饰的静态方法 所以要实现 类似于java中的静态属性就要用到伴生对象 例子: fun main(args: Array伴生对象的成员全局独一份 伴生对象的成员类似Java的静态成员 静态成员考虑用包级函数、变量替代 JvmField 和JvmStatic使用后,可以用相同的语法在Java中调用 方法重载 与Java相同...枚举类中定义方法,那么要在枚举对象最后加上; 这基本是Kotlin中唯一一个需要强制写;的地方 密封类 密封类与枚举的区别:前者是子类可数,后者是实例可数 密封类(Sealed Class)的子类必须和父类定义在同一个文件中

    85510

    Kotlin代码检查在美团的探索与实践

    Kotlin的隐藏开销 伴生对象 伴生对象通过在类中使用companion object来创建,用来替代静态成员,类似于Java中的静态内部类。...所以在伴生对象中声明常量是很常见的做法,但如果写法不对,可能就会产生额外开销。...直接读取一个常量不同,Kotlin访问一个伴生对象的私有常量字段需要经过以下方法: 调用伴生对象的静态方法 调用伴生对象的实例方法 调用主类的静态方法 读取主类中的静态字段 为了访问一个常量,而多花费调用...对于其他类型的常量,最好在它们自己的主类对象而不是伴生对象中来存储公共的全局常量。...类需要定义一套新的接口方法来适配遍历Kotlin节点回调时的调用 Kotlin代码解析 和Java一样,Kotlin也有自己的抽象语法树。

    1.5K40
    领券