接下来的内容会告诉大家在 Java 和 Kotlin 中实现单例的区别,以及在 Kotlin 中如何在不使用 static 关键字的情况下实现单例,(其实就是通过 object 关键字实现的),然后为大家详解使用...Kotlin 中并没有静态方法或者静态字段,那么我们如何在 Kotlin 中创建单例呢? 实际上,可以通过 Android Studio/IntelliJ 来帮助我们理解这一问题。...在 Kotlin 中,object 是一种特殊的类,它只有一个实例。...当 Singleton 类进行初始化的时候,JVM 会从同步代码块中获得一个锁,如此一来,其它线程就无法访问它。...反编译 companion object 会得到一个带有私有构造函数的内联类。宿主类会通过一个合成构造方法来初始化一个内部类,这个内部类只有宿主类才能够访问。
在上一篇中我们见识到了 Kotlin 语言所特有的几种类——数据类、密闭类等,也熟悉了 Kotlin 中集合的常用运算符,以后再也不用担心 Kotlin 集合的相关问题了。...如何在类中对这两种变量进行初始化呢?...val 因为是不可变,所以只能重写变量的 getter 方法,var 则可以重写 getter 和 setter 方法,当然类会自动帮我们生成 getter 和 setter 方法。...它声明的地方只有三种1. object 类的内部,object 修饰的都是静态类;2. top-level 位置,也就是在一个类的外部进行声明;3. companion object 内部,也就是用于声明静态变量的位置...通常情况下,Kotlin 中函数内部 Lambda 闭包是不能中断外部函数的执行的,可以尝试下将 code 11 中 test1 修饰的 inline 去掉,此时编译器就会提示 return 只能写成
KClass 也是 Kotlin 反射 API 的主要入口。 在 Kotlin 中,字节码对应的类也是 kotlin.reflect.KClass。...Kotlin 和 Java 的方法引用使用::操作符,Kotlin 除了可以引用类中成员函数、扩展函数还可以引用顶层(top-level)函数。...成员变量(包括从基类继承的、从接口实现的) public Field getField(String name) // 获取类自身声明全部的 public 成员变量(包括从基类继承的、从接口实现的)...// 获取类中定义的其他类,包括内部类和嵌套类 public val nestedClasses: Collection> // 判断一个对象是否为此类的实例 @SinceKotlin...幕后字段 (backing field) 是 Kotlin 属性自动生成的字段,它只能在当前属性的访问器(getter、setter)内部使用。
Kotlin调用Java Kotlin在设计时就考虑了与Java的互操作性。可以从Kotlin中自然地调用现有的Java代码,在Java代码中也可以很顺利地调用Kotlin代码。...可以自动识别Java中的getter/setter;在Java中可以过getter/setter操作Kotlin属性。...AllOpen是为所标注的类去掉final,目的是为了使该类允许被继承,且支持Spring注解,如@Componet;支持自定义注解类型,如@Poko。...;协变和逆变由Java中的extends和super变成了out和in,如ArrayList;在Kotlin中没有Raw类型,如Java中的List对应于Kotlin就是List<...⑥ 空安全性 当从Java中调用Kotlin函数时,没有任何方法可以阻止Kotlin中的空值传入。
1.2 Kotlin的五大核心优势特性Java对比开发者收益空安全NullPointerException崩溃风险编译期检测空指针,减少崩溃扩展函数需写Utils类直接给现有类”添加”方法数据类手写Getter...val age: Int)// Java (20+行)public class User { private String name; private int age; // 构造方法/getter...开发的”瑞士军刀”就像瑞士军刀整合了刀、剪、锉等功能,Jetpack整合了视图、数据、导航等开发必备工具没有它,你需要自己造轮子(如手写数据库ORM)比喻2:Jetpack如建筑业的”预制件”传统开发像用砖头砌墙...:变量/函数/类扩展函数/高阶函数进阶特性(2周):协程与Flow反射与注解处理实战训练(1个月):用Kotlin重写Java项目参与开源项目(如Kotlin协程库)结语:适应技术演进是开发者必修课Google...正如卓伊凡在优雅草科技内部培训中强调的:“不会Kotlin的Android开发者,就像用煤油灯的人评价电灯太亮——不是电灯的问题,是你该升级了。”
一、告别 “冗余代码” 瓶颈:用极简语法提升 30% 开发效率传统编程语言(如 Java)中,大量冗余代码常常让开发者陷入 “重复劳动” 的困境:定义实体类时需手动编写 getter/setter 方法...而 Kotlin 从设计之初就以 “简洁” 为核心目标,通过语法创新将冗余代码 “化繁为简”:数据类自动生成核心方法:只需一句data class User(val name: String, val...;Lambda 表达式简化回调:在处理点击事件、集合遍历等场景时,用button.setOnClickListener { doSomething() }替代 Java 中冗长的匿名内部类,让代码逻辑更清晰...三、突破 “安全性不足” 瓶颈:从编译阶段杜绝常见错误在软件开发中,“运行时崩溃” 是影响用户体验的致命问题,而 NullPointerException(NPE)、类型转换错误、数组越界等问题,往往源于传统语言...Kotlin 通过 “编译时安全检查”,从源头杜绝了大量常见错误:空安全强制防护:Kotlin 将变量分为 “非空类型”(如String)和 “可空类型”(如String?)
为了实现这一目标,Kotlin 提供了一种将大部分工作委托给一个内部 ArrayList 实例并且可以自定义其行为的方式,并为此引入了一个新的关键字: by。 让我们看看类代理的工作原理。...在装饰者模式中,装饰者类与被装饰类使用同一接口。装饰者会持有一个目标类的内部引用,并且包装 (或者装饰) 接口提供的所有公共方法。 在您无法继承特定类型时,委托模式就显得十分有用。...通过使用属性代理,我们可以将 getter 和 setter 委托给属性,从而可以复用代码。 与类代理相同,您可以使用 by 来代理一个属性,Kotlin 会在您使用属性语法时生成代码来使用代理。...如果您只需要委托 getter,那么代理类需要实现 ReadProperty;而如果 getter 与 setter 都要委托,则代理类需要实现 ReadWriteProperty。...内部实现上,Kotlin 编译器会生成支持代理所需的所有代码,而不会暴露任何公共 API 的修改。
Kotlin 之于 Java 就像 ES6 之于旧式 JavaScript。很多人都被 JavaScript 引擎(如浏览器)或 JVM(如 Android)所困。...Kotlin 在 Android 开发人员中特别受欢迎,但你可以在任何可以使用 JVM 的地方使用它,而且现在真的很难找到使用“纯 Java”的正当理由。...每个简单的数据类都需要显式的构造函数、getter、setter、hashcode 和 equals。...函数式编程 我们如何在 Kotlin 中执行 map、filter 和 reduce ?它看起来像带有{ arguments -> ... }块的 Ruby。...还有其他 JVM 语言,如 JRuby、Clojure、Scala 等,但它们本质上是不同的语言,具有不同的语义和不同的互操作性故事。Kotlin 只是固定 Java,仅此而已。
在 Kotlin 的类中,val 和 var 是用于表示属性是否有 getter/setter: var:同时有 getter 和 setter。 val:只有 getter。...3 应该好好注意一下伴生对象 伴生对象通过在类中使用 companion object 来创建,用来替代静态成员,类似于 Java 中的静态内部类。...访问一个伴生对象的私有常量字段需要经过以下方法: 调用伴生对象的静态方法 调用伴生对象的实例方法 调用主类的静态方法 读取主类中的静态字段 为了访问一个常量,而多花费调用4个方法的开销,这样的 Kotlin...核心意思是:Kotlin 使用 object 代替 Java 匿名内部类实现。 很明显,即便如此,这里的访问应该也是合情合理的。从匿名内部类中访问成员变量在 Java 语言中是完全允许的。...但由于某些原因,当我把上面的 ISkipService 类修改为了 Kotlin 实现,却发生了崩溃,从代码上暂时没看出问题。
accessor 如果没有为属性定义 accessor,那么会有默认的 getter 和 setter 在类的内部,className.valueNale 的代码将由编译器决定是否对齐进行优化,如果访问非常简单...使用 private set 来将一个成员变量设置为仅允许从内部被修改,而不会被外部的访问所修改 interface User { val nickname: String } class FacebookUser...,而 Kotlin 中可以把多个类放在一个文件里 Kotlin 中的包名称不必遵循 org.company.store 的形式,但仍做如此推荐 构造器 Kotlin 中不需要使用 new,直接像访问函数一样就可以构造一个对象...,并且有一个平凡的 getter,叫做 getFoo(),这个 getter 返回了(子类的) foo,注意这个 getter 会 override 父类的 getter 当新建一个子类的时候,首先调用了父类的构造器...如果只写 class A,则作为一个内部类,会默认保存外部类的一个引用,而在 Kotlin 中, class A这种写法默认不会产生这样的引用,即相当于 Java 中的 static class A 如果需要这样一个对外部类的引用
通过一个个真实的场景,我们一边解决问题一边学习Kotlin的特性。 快速上手 如果不知道如何在Kotlin中写一个相当简单的Java表达式。...它可以扩展函数:这意味着,就算我们没有权限去访问这个类中的代码,我们也可以扩展这个类的更多的特性。 它是函数式的:Kotlin是基于面向对象的语言。...事件 在Java中,每次我们去声明一个点击事件,都不得不去实现一个内部类,而在Kotlin中,可以直接声明我们要做什么。...中,委托的实现依靠于关键字 by, by表示将抽象主题的实例(by后边的实例)保存在代理类实例的内部。...没有命名空间 Kotlin 允许你在文件中定义顶级的函数和属性,但是这会带来困扰——所有从 Kotlin 引用的顶级声明无法区分。这让我们有时候在读代码时很难快速确定用的是哪一个函数。
为了实现这一目标,Kotlin 提供了一种将大部分工作委托给一个内部 ArrayList 实例并且可以自定义其行为的方式,并为此引入了一个新的关键字: by。 让我们看看类代理的工作原理。...在装饰者模式中,装饰者类与被装饰类使用同一接口。装饰者会持有一个目标类的内部引用,并且包装 (或者装饰) 接口提供的所有公共方法。 在您无法继承特定类型时,委托模式就显得十分有用。...通过使用类代理,您的类可以不继承于任何类。相反,它会与其内部的源类型对象共享相同的接口,并对该对象进行装饰。这意味着您可以轻松切换实现而不会破坏公共 API。...通过使用属性代理,我们可以将 getter 和 setter 委托给属性,从而可以复用代码。 与类代理相同,您可以使用 by 来代理一个属性,Kotlin 会在您使用属性语法时生成代码来使用代理。...内部实现上,Kotlin 编译器会生成支持代理所需的所有代码,而不会暴露任何公共 API 的修改。
Kotlin 对单例模式做了更彻底的精简,简直易如反掌,可以通过 object 关键字声明一个单例类的同时创建一个实例,如: object singleton{//由于同时创建了实例,因此类名使用小写...Kotlin 新增了顶层声明的类别(顶层函数和顶层属性,无需放在类中的属性和方法)。...原因很简单:如果直接暴露成员属性,将来想改变其内部实现是不可能的,反之,如果是暴露方法,则可以在方法中轻易地修改实现。...EJ 第22条:优先考虑静态成员类 在 Java 中,我们经常要把一个类定义在另外一个类的内部,该类被称之为内部类。内部类有四种:静态成员类、非静态成员类、匿名类和局部类。...Kotlin 在语法层面直接对该条款进行支持,静态成员类在 Kotlin 中称为『嵌套类』,默认的内部类便是嵌套类,比如: class Outer { class Inner { // 默认便是静态成员类
/// Kotlin val instance: BaseClass = ChildClass() 没有检查性异常 不像 Java 那样,Kotlin 中的类方法不需要声明自己的异常类型。...String _name; public String getName() { … } public void setName(String name) { … } 这种前缀适合给变量做标记,代表着该变量只在类的内部可见...而且还容易区分是类的内部成员变量还是通过函数参数传递进来的变量。 在 Kotlin 中,成员变量与 getter/setters 方法被整合成同一个概念。.../// Kotlin class User { val id: String // 代表成员变量与 getter 方法 var name: String // 代表成员变量与 getter 和...setter 方法 } 当您使用自动转换功能时,Java 中的成员变量前缀有时候会被保留下来,带来的隐患是曾经隐藏在内部类中的实现细节有可能会被 public 接口暴露出来。
Java 中的懒汉式与恶汉式 III . Kotlin 中对应 Java 的懒汉式与恶汉式 IV . Kotlin 对象 ( object ) 声明 V ....Kotlin 中对应 Java 的懒汉式与恶汉式 ---- 1 ....Kotlin 懒汉单例模式 : 该示例中涉及到了伴生对象 , 字段 getter 方法定义 , ? 和 !!...继承特征 : object 修饰的单例类 , 可以继承其它类 ; 4 . object 声明的单例类对象调用 : 直接使用类名 Student 调用即可 , 该类名等同于单例对象 , 如调用上述单例类的...伴生对象 : 类内部的对象 , 使用 companion object 修饰 , 是伴生对象 ; 是类内部的单例类 ; 2 .
因为 JVM 虚拟机只能执行类中的代码,所以 Kotlin 会生成一个名叫 JoinKt 的类,并且顶级函数是静态的,所以可以在 Java 中这样调用顶级函数: JoinKt.joinToString(...函数 如果使用 val 来定义只会生成对应的静态getter函数 4)、Kotlin文件名被修改怎么办?...注意:虽然 Kotlin 允许在函数内部定义函数,但是不要嵌套太深,否则会导致可读性太差 1.11 访问修饰符 类访问修饰符如下: 类成员访问修饰符: 只有 ‘’protected‘’ 对应的 ‘’Kotlin...在 Kotlin 中,只需要在声明类的时候前面加 data 关键字就可以完成这些功能。 注意 : 哪些属性参与 equals、hashCode、toString 方法呢?...内部类 在 Kotlin 中内部类默认是静态的( Java 与此相反),不持有外部类的引用: class OuterClass { //在 Kotlin 中内部类默认是静态的,不持有外部类的引用
介绍:在Kotlin中类可以包含:构造函数和初始化代码块,函数,属性,内部类,对象声明....构造方法 介绍: Kotlin之中一个类可以有一个主构造器以及多个次构造器....和setter函数 介绍:通常情况下var定义的类都有默认的geter和setter.如果定义为val标签额属性那么它将没有set函数 我们也可以根据需求,进行重构属性的getter和setter函数...但是已经有嵌套类了.为什么还有一个内部类? 因为内部类会带有一个对外部类的对象的引用.所以内部类是可以直接访问外部类的属性和函数....public 公共,全部地方都可访问 internal 内部,在同一个模块下可访问 Kotlin的关键字其实和java之中有很多的相识之处.特别是权限访问修饰符.
不需要 findViewById Kotlin 默认给你写好 setter 和 getter 方法了 Kotlin 去掉了 static 关键字 Kotlin 进行 自动强制类型转换 Kotlin 省去了...枚举和 when 表达式 5.8.2.1 kotlin 枚举 Kotlin 中,枚举类型以类的形式存在,因此叫做枚举类,详细代码如下: enum class Color { RED, GREEN...Kotlin 中 !! 表示非空断言运算符,详细代码如下: if(foo!...6.2.3 kotlin 内部类 ? 6.3 kotlin 接口 ? 6.4 kotlin 伴生对象 ? ?...6.5.2 可见修饰符 嵌套类的用法: 如果要在 Kotlin 中嵌套一个类,需要在该内部类加 inner 修饰 //嵌套类属于静态类和外部类没任何关系 fun main(args : Array<String
在我们尝试使用Kotlin作为开发语言的时候,应该会想到在Kotlin中如何定义一个常量,就像Java中这样的代码一样 public static final double PI = 3.14159265358979323846...为什么呢 这是因为在Kotlin中,一个var会对应生成两个方法,即getter和setter方法,比如 var title: String?...const val subName = "" } } 所谓的top-level就是位于代码文件的最外部,比如常见的类(非内部类和嵌套类)就是在top-level。...意思是在结构上常量不属于任何的类,而是属于文件。 object中可以指的是最外部的object也可以指的是companion object....其内部作用是抑制编译器生成相应的getter方法 是用该注解修饰后则无法重写val的get方法 示例如下 @JvmField val NAME = "89757 关于Kotlin的常量研究,最有效的方法就是分析
万物皆对象 对象就是类的实例化 用Kotlin描述对象 class Friend{ var name: String = "" var hairColor: String...val name: String = name val age: Int = age init{ } } 次构造 次构造函数体写在Friend类定义的大括号中...,也就是代码块中。...这就是Kotlin函数式编程的魅力!...的标识,当我们从外部需要访问这个属性的值的时候,它会调用内部的getter把值传给我们。