首页
学习
活动
专区
圈层
工具
发布

Kotlin Primer·类与对象(上)

前面三章的内容是写给希望快速了解 Kotlin 语言的大忙人的。 而从本章开始,才会真正讲述 Kotlin 语言的神奇之处。 与 Java 相同,Kotlin 声明类的关键字是class。...另外,在 JVM 上,如果主构造函数的所有的参数都有默认值,编译器会生成一个额外的无参构造函数,它将使用默认值。...为每个类加了final也就是说,在 Kotlin 中默认每个类都是不可被继承的。如果你确定这个类是会被继承的,那么你需要给这个类添加 open 修饰符。...在某种意义上,他们是枚举类的扩展:枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例,而密封类的一个子类可以有可包含状态的多个实例。...4.4.3 data 数据类 data 修饰的类称之为数据类。它通常用在我们写的一些 POJO 类上。

75020

【Kotlin】常用的 Kotlin 类 ② ( 枚举类 | 枚举类定义函数 | 密封类 )

文章目录 一、枚举类 二、枚举类定义函数 1、枚举类定义普通函数 2、枚举类定义构造函数 三、密封类 一、枚举类 ---- Kotlin 中使用 枚举类 定义常量 , 枚举类定义格式如下 : 枚举常量...枚举的 常量名称 ; MALE true 枚举的常量 Gender.MALE 是 Gender 类的一个 实例对象 ; 二、枚举类定义函数 ---- 在枚举类中 , 可以 定义函数 , 包括 普通函数...和 构造函数 ; 1、枚举类定义普通函数 通过 枚举类 的 类型常量 ( 实例对象 ) 可以 调用 枚举类中定义的方法 ; 为枚举类定义普通函数 : 在枚举类 Gender 中定义了 log 函数 ,...---- 枚举类型 是一组 子类型 闭集 ; 密封类 可以 定义 枚举类型的 子类型闭集 , 一个密封类可以有多个子类 , 继承密封类的子类 必须 与 密封类在相同的 Kotlin 代码文件中 ; 密封类适用于这种情况..., 要使用枚举的特性 , 但是需要在枚举基础上保存多个特性 ; 枚举只能实现简单的常量列举 , 如果需要更复杂的 子类型闭集 , 则需要使用密封类 ; 代码示例 : sealed class Gender

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

    Kotlin中级(9)- - - Kotlin类之数据类、密封类、内部类.md

    Int) 2.数据类声明条件 主构造函数最少要有一个参数 数据类的主构造器的所有参数必须标记为val或var 数据类不能是抽象类、open类、封闭类、内部类 数据类不能继承自任何其他类(但可以实现接口)...什么是受限的类继承结构 所谓受限的类继承结构,即当类中的一个值只能是有限的几种类型,而不能是其他的任何类型。 这种受限的类继承结构从某种意义上讲,它相当于是枚举类的扩展。...但是,我们知道Kotlin的枚举类中的枚举常量是受限的,因为每一个枚举常量只能存在一个实例 但是其和枚举类不同的地方在于,密封类的一个子类可以有可包含状态的多个实例。...也可以说成,密封类是包含了一组受限的类集合,因为里面的类都是继承自这个密封类的。但是其和其他继承类(open)的区别在,密封类可以不被此文件外被继承,有效保护代码。...从声明类上看,继承的两个类单独声明,子类通过(子类:父类)继承父类,而内部类必须声明在外部类里面,并且用关键字inner标记 从访问上看,继承的父类不能直接访问子类,外部类可以通过“外部类().内部类

    1.3K20

    【Kotlin】Kotlin Sealed 密封类 ( 密封类声明 | 密封类子类定义 | 密封类特点 | 代码示例 )

    密封类作用 : 定义一个密封类 , 该类只能有有限个指定的子类 , 不能在其它文件定义其它类型子类 ; 2 ....密封类与枚举类 : ① 相同点 ( 类型限制 ) : 从类型种类角度对比 , 类与枚举类类似 , 枚举类的值的集合是受限制的 , 不能随意扩展 ; ② 不同点 ( 对象个数限制 ) : 从每个类型对象个数对比..., 枚举类的每个类型只能存在一个实例 , 而密封类的每个类型可以创建无数个实例 ; II ....子类声明 : 密封类的子类 , 必须定义在密封类的内部 ; ( 1.1 之后的版本可以定义在同一个文件中 ) sealed class Student { class GoodStudent...密封类子类 : ① 定义在密封类内部 ( 推荐 ) : 密封类的子类建议定义在密封类内部 , 可以兼容所有版本 ; ② 定义在密封类所在文件 : Kotlin 1.1 以后的版本 , 可以将密封类子类定义在密封类声明的同一个文件中

    1.6K10

    转向Kotlin——数据类和封闭类

    数据类和封闭类是Kotlin中的两种特殊的类,今天一起了解一下。 数据类是Kotlin的一个语法糖。Kotlin编译器会自动为数据类生成一些成员函数,以提高开发效率。...尽管前面写的User类实现了我们的需求,但会不会也太麻烦了,每个类都需要重写toString和equals等方法。为了提高开发效率,Kotlin加入了我们马上要介绍的数据类。...我们再写一个数据类,如下: data class Person(var name: String, val age: Int) 可以看出,原本十几行几十行的代码,现在一行就搞定了,其余的Kotlin编译器会自动生成...在开发中,我们经常需要复制一个对象,然后修改它的一部分属性,这就需要一个复制机制,Kotlin除了为数据类自动生成toString方法和equals方法,还默认生成了一个copy方法,它的作用就是复制数据类的实例...Kotlin编译器会自动为数据类生成组件函数(以后会说到),隐藏,可以直接将数据类成员解构: var js = Person("Js", 20) // 将js.name和js.age分别赋给name和age

    1K20

    Kotlin Vocabulary | 数据类

    接下来本文将会带您了解数据类的其他好处、限制以及其实现的内部原理。 用法概览 声明一个数据类,需要使用 data 修饰符并在其构造函数中以 val 或 var 参数的形式指定其属性。...但相比于普通类,您可以获得以下几个好处: Kotlin 编译器已为您默认实现了 toString()、equals() 与 hashCode() 函数 ,从而避免了一系列人工操作可能造成的小错误,例如:...为了做到这点,我们需要查看反编译后的 Java 代码: Tools -> Kotlin -> Show Kotlin Bytecode,然后点击 Decompile 按钮。...您可以通过阅读我们之前的 Kotlin Vocabulary 文章 来了解更多有关解构的内容。 拷贝 数据类会生成一个用于创建新对象实例的 copy() 方法,它可以保持任意数量的原对象属性值。...总结 数据类是 Kotlin 中最常用的功能之一,原因也很简单 —— 它减少了您需要编写的模板代码、提供了诸如解构和拷贝对象这样的功能,从而让您可以专注于重要的事: 您的应用。

    64620

    浅谈Kotlin(三):类

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型、基本语法、代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言:   已经学习了前两篇文章...本篇介绍Kotlin中类的使用。...Kotlin的表现形式:   跟着下面的操作做一个处理,让我们这个类对应的 .java 文件转化为对应的 .kt 文件 ?   ...  首先看Java类的构造   Java中定义构造方法特点: 1、方法名需要和类名一致       2、参数可以任意属性值的组合,也可以不写       3、可以有多个构造方法 //无参数的构造方法...二、类的继承 关于Kotlin的类有几个知识点需要先知道:     1、默认情况下,任何类都是根继承自Any(类似于Java中的Object)     2、默认情况下,任何类都是不可继承的(final

    40640

    Kotlin之旅——类特性

    Kotlin 的类特性 写了两篇 PWA 了,今天继续讲回 Kotlin。 Kotlin 中有很多非常好的特性,扩展方法、伴生对象、原生支持动态代理、伪多继承。今天来详细讲讲。...如果每个类在想要用这些工具类的时候,他们自己就已经具备了这些工具方法多好,Kotlin的类扩展方法就是这个作用。...强转与智能转换 在 Kotlin 中,用 is 来判断一个对象是否是某个类的实例,用 as 来做强转。...Kotlin 有一个很好的特性,叫 智能转换(smart cast),在我之前的文章中也提到过。就是当已经确定一个对象的类型后,可以自动识别为这个类的对象,而不用再手动强转。...我们称companion修饰的对象为伴生对象。 将上面的代码编译后查看,实际上是编译器生成了一个public的内部对象。

    97020

    【Kotlin】常用的 Kotlin 类 ① ( 嵌套类 | 数据类 | 数据类 copy 函数 | 数据类解构声明 operator fun component1 | 数据类运算符重载 )

    , 方法内部类 , 匿名内部类 几种类型 ; Kotlin 嵌套类 , 相当于 Java 中的 静态嵌套类 ; 代码示例 : 在下面的代码中 , 在 Person 类内部中定义 Student 嵌套类...---- 数据类型定义 : Kotlin 中的 数据类型 是 专门用于存储 数据的 类 , 一般该类中不定义 成员方法 ; 数据类信息 : 数据类 中 自动提供了 toString 实现 , 可以将数据转为...字符串 ; 数据类型对比 : == 运算符 对比两个数数据类对比的是引用地址 , equals 和 hashCode 函数 可以对比具体的数据值 ; 在 Kotlin 中 , 一般情况下 == 比较的是内容...copy 函数 ---- Kotlin 编译器不仅为 数据类 重写了 toString , equals , hashCode 函数 , 还 提供了 copy 函数 , 借助该函数可以 快速创建一个相同内容的数据类..., 使用集合一次性给多个变量赋值 ; Kotlin 普通类 和 数据类 都可以 支持 解构语法 , 为多个变量进行赋值 ; 数据类 自带 支持解构语法的特性 , 不需要使用 operator fun

    1.2K20

    Kotlin中级(6)- - - Kotlin类之的继承.md

    Kotlin继承类 1.超类(Any) 在Kotlin中,所有的类都是继承自Any类,这是一个没有父类型的类。...package kotlin /** * The root of the Kotlin class hierarchy....* 看这个源码注释:意思是任何一个Kotlin的类都继承与这个[Any]类 */ public open class Any { // 比较: 在平时的使用中经常用到的equals...Java还是Kotlin,重写基类型里面的方法,则称为重写,或者是覆盖基类型方法 1.当基类中的函数,没有用到open修饰符修饰的时候,实现类中出现的函数的函数名不能与基类中没有用open修饰符修饰的函数名相同...// 注意,则的`final`修饰符在编辑器中是灰色的,因为Kotlin中默认的类默认是final的 那么当一个基类去继承另外一个基类时,第二个基类不想去覆盖掉第一个基类的方法时,第二个基类的该方法使用

    72060

    Kotlin中级(7)- - - Kotlin类之抽象类、重载和重写.md

    1.抽象类 抽象类是不可直接被实例化的,因为它有一部分属性和方法没有被完整的赋值和体现。...而一个抽象类和普通类的区别在于抽象类除了可以有其自己的属性、构造函数、方法等组成部分,还包含了抽象函数以及抽象属性。...抽象类的规则 在Kotlin中的抽象类在顶层定义的时候只能使用public可见性修饰符修饰 抽象类中可以定义内部抽象类 只能继承一个抽象类 若要实现抽象类的实例化,需要依靠子类采用向上转型的方式处理...不过,抽象类建议不用open修饰符修饰,因为可以复写抽象类的夫类的函数。 重写和重载 重写和重载有什么区别?...重写是写在两个类里的,它们是继承的关系 重载是在一个类中的,相同的方法名、不同的参数 重载和重写都是针对方法的,且方法名相同

    92120

    Kotlin 类扩展实现原理

    在 Kotlin 中当项目集成第三方 SDK 的时候,如果需要为其中某个类新增方法来可以通过 className.methodName(){}, 即 类名.方法名 的形式来扩展函数,那么同样和 Java...public final static main()V L0 LINENUMBER 21 L0 // 实例化 Son NEW test/Son DUP // 调用 Son 类的...// compiled from: test16.kt } ���� �test�Test16Kt"* 上述代码示例的 kt 文件名为 Test16,在问题 1 ,我们类中的代码 obj.eat(...) 在字节码中实际上是调用了 Test16Kt.eat(Ltest/Father;)V ,那么根据这个规律可以得知,类扩展实际上生成了一个当前文件名+Kt 的 class,然后把已扩展的实例作为参数传递进去...那么最后一个疑问,为什么 obj 是 Son 的实例却调用了父类的扩展函数,子类调用父类扩展函数的原因,根据类扩展的字节码实现可以得知这不是因为继承,实际原因是在申明时把类型设置为 Father,如果将代码改为

    55630

    转向Kotlin——类和接口

    类的声明 和Java没有什么两样,Kotlin中,类的声明也使用class关键字,如果只是声明一个空类,Kotlin和Java没有任何区别,不过定义类的其他成员,区别就很大了。...Kotlin会有一些不一样的地方,在Kotlin中,类允许定义一个主构造器,和若干个第二构造器。主构造器是类头的一部分,紧跟在类名的后面,参数是可选的。如下代码定义了一个类,并指定了一个主构造器。...如果是前者,是全局函数,如果是后者,是类成员函数。但无论定义在哪里,语法都是一样的。 说到构造器时,构造器支持默认参数值,实际上,函数也支持默认参数值。...Kotlin和Java一样,都是单继承的,也就是说,一个Kotlin类只能有一个父类。...小结 Kotlin中的类e和接口与Java中的本质上没有什么两样,只不过Kotlin为了体现差异,加入了一些语法糖,如接口允许函数带函数体,支持属性,不支持静态方法等。我们需要慢慢去熟悉它。

    1.1K30

    About Kotlin-Kotlin中的类1About Kotlin(1)

    About Kotlin(1) 因为是从Java的角度来学习Kotlin,在Java中,类作为第一等公民。故学习Kotlin,也先从其的类开始。...Kotlin中的类 普通的类 class Kotlin中没有添加修饰符直接以class开头的都是final类。final类的意义在于JVM可能存在的优化(常量和方法内联)和防止继承的滥用。...构造方法 Kotlin中一个类有一个primary的构造方法和可以多个的secondary的构造方法。...构建这样的对象需要写很多代码。 对应的Open类 对应上面的类,kotlin中的open类就是能够被继承的了。必须在类声明的时候使用open关键字。...//Kotlin中所有类的父类是Any,类似于Object,不过Any不输于java.lang.Object,其有三个方法 //这里的operator是操作符重载,在Kotlin中的符号中会说明 public

    1.5K30

    Kotlin中的常用类及其使用

    一、构造函数和初始化块 1.初始化块 2.主构造函数 3.次构造函数 4.他们之间的联系 二、属性 1.属性的声明 2.避免递归调用的幕后字段 三、常用的类 一、构造函数和初始化块 1.初始化块 代码的初始化工作由它负责...,在调用主构造函数之前执行,这部分理论上可以进行任何工作,但建议类的初始化赋值可以放在这,其余的最好由其他专门的地方处理,采用init关键字 init{ println("ww cool") }..." //set等下请看幕后字段 } 2.避免递归调用的幕后字段 下面这个代码看上去好像没有问题,但事实上它递归调用了属性的get和set方法 class MyClass(){ var...name:String get() = field set(value){ field = value } } 这一点和java语言差异比较大,需要注意一下,不过平时基本上不会用到自定义的...setter和getter,所以不用这么担心 三、常用的类 抽象类 含有抽象方法的类称为抽象类,这一点和java里面很像 内部类 使用inner关键字,可以访问内部类外的属性 class outer{

    1.4K20

    Kotlin中级(8)- - - Kotlin类之接口、枚举.md

    一、接口 在Kotlin中,一个类只能继承一个普通类或者抽象类。通过接口我们可以进行多实现 interface interface Demo{ } 关键字:冒号(?...Java中使用接口使用的是implements关键字 在Kotlin中冒号(:)使用的地方很多: 1.用于变量的定义 2.用于继承 3.用于接口 4.方法的返回类型声明 接口冲突 例如: interface...类,在实现give方法时使用super类的名称>.方法 二、枚举类 枚举类中的每一个枚举常量都是一个对象,并且他们之间用逗号分隔。...要实现枚举常量的匿名类,则必须提供一个抽象方法,且该方法定义在枚举类内部,而且必须是在枚举类变量的后面 枚举变量之间使用逗号(,)分割开。...每个枚举常量都包含两个属性:name(枚举常量名)和ordinal(枚举常量位置) 提供了values()和valueOf()方法来检测指定的名称与枚举类中定义的任何枚举常量是否匹配 自 Kotlin

    53520
    领券