资讯专栏INFORMATION COLUMN

从零开始的Kotlin之类和对象(一)

Forest10 / 1992人阅读

摘要:从零开始系列从零开始的之类和对象一从零开始的之类和对象二构造器主构造器中的类可以有一个主构造器,以及一个或多个次构造器,主构造器是类头部的一部分,位于类名称之后如果主构造器没有任何注解,也没有任何可见度修饰符,那么关键字可以省略。

从零开始系列:

从零开始的Kotlin之类和对象(一)

从零开始的Kotlin之类和对象(二)

构造器 主构造器

Koltin 中的类可以有一个 主构造器,以及一个或多个 次构造器,主构造器是类头部的一部分,位于类名称之后

class Person constructor(firstName: String) {}

如果主构造器没有任何注解,也没有任何可见度修饰符,那么constructor关键字可以省略。
主构造器中不能包含任何代码,初始化代码可以放在 初始化代码段中,初始化代码段使用 init关键字作为前缀。

class Person constructor(firstName: String) {
    init {
        System.out.print("FirstName is $firstName")
    }
}

注意:主构造器的参数可以在初始化代码段中使用,也可以在类主体n定义的属性初始化代码中使用。
一种简洁语法,可以通过主构造器来定义属性并初始化属性值(可以是var或val):

class People(val firstName: String, val lastName: String) {
    //...
}

如果构造器有注解,或者有可见度修饰符,这时constructor关键字是必须的,注解和修饰符要放在它之前。

次构造器

使用constructor关键字作为前缀:

class Person {
    constructor(parent: Person) {
        parent.children.add(this )
    }
}

如果类有主构造器,那么每个次级构造器都必须委托给主构造器,要么直接委托,要么通过其他次级构造器间接委托。委托到同一个类的另一个构造器时,使用this关键字实现。

class Person constructor(firstName: String) {
    constructor() : this("Hello") {
    }
}

如果一个非抽象类没有声明任何主构造器和次构造器,那么它将带有一个自动生成的,无参数的主构造器,可见度为 public。

对象 创建对象

调用类的构造器,调用方式和使用普通函数一样:

val person = Person("Juhezi")

注意:Kotlin 没有 new 关键字。

继承

Kotlin 中所有类都有一个共同的超类Any,如果类声明时没有g指定超类,则默认为Any

注意Any不是java.lang.Object,只有equals()hashCode()toString()三个方法。

Kotlin中使用:来实现继承,而不是extends

open class Base(p: Int)
class Derived(p: Int): Base(p)

如果类有主构造器,那么必须在主构造器中使用主构造器的参数来初始化父类。如果类没有主构造器,那么所有的次级构造器都必须使用superi关键字来初始化父类,或者委托到另一个构造器,由被委托的构造器来初始化父类。

open关键字表示允许从这个类继承出其他子类,作用和final关键字作用相反。默认情况下,Kotlin中所有的类都是 final 的。

抽象类

类本身,或类中的部分成员,都可以声明为abstract的。抽象成员在类中不存在具体的实现。

注意:无需对抽象类或抽象成员标注open注解。

open class Base {
    open fun f() {}
}
abstract class Derived : Base() {
        override abstract fun f()
}
同伴对象(Companion Object)

Koltin没有静态方法(static method),可以使用同伴对象代替。
如果在类中声明一个同伴对象,那么只需要使用类名就可以调用调用同伴对象的成员了。

class Util {
    companion object {
        val element: String = "HelloWorld"
        fun sayHello() {
            System.out.println(element)
        }
    }
}

class Main {
    init {
        System.out.println(Util.element)
        Util.sayHello()
    }
}
封闭类

封闭类用来表示对类阶层的限制,可以限定一个值只允许是某些指定的类型之一,而不允许是其他类型。

要声明一个封闭类,需要将sealed修饰符放在类名之前,封闭类可以有子类,但所有的子类声明明都必须嵌套在封闭类的声明部分之内。

sealed class Expr {
    class Const(val number: Double) : Expr()
    class Sum(val e1: Expr, val e2: Expr) : Expr()
    object NotANumber : Expr()
}

注意:从封闭类的子类再继承的子类(间接继承者)可以放在任何地方,不必在封闭类的声明部分之内。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/13175.html

相关文章

  • 从零开始Kotlin之类对象(二)

    摘要:从零开始系列从零开始的之类和对象一从零开始的之类和对象二属性和域中声明一个属性可以使用或关键字。表示为可变属性,表示为只读属性。 从零开始系列: 从零开始的Kotlin之类和对象(一) 从零开始的Kotlin之类和对象(二) 属性(Property)和域(Field) Kotlin中声明一个属性可以使用val或var关键字。var表示为可变属性,val表示为只读属性。 class ...

    littleGrow 评论0 收藏0
  • 从零开始Kotlin 之「2」数据类型

    摘要:前言大家好,这里是从零开始学之数据类型,本文首发于公众号,欢迎前往大家关注。输出布尔类型中的布尔类型用表示,它的值有和。若需要可空引用时,布尔类型的值会被装箱。此时程序会抛出异常最后从零开始学之数据类型到这里就结束了。 前言 大家好,这里是「从零开始学 Kotlin 之『2 』数据类型」,本文首发于公众号「Binguner」,欢迎前往大家关注。我会每周分享一些关于 Android 和...

    LuDongWei 评论0 收藏0
  • 从零开始Kotlin 之「2」数据类型

    摘要:前言大家好,这里是从零开始学之数据类型,本文首发于公众号,欢迎前往大家关注。输出布尔类型中的布尔类型用表示,它的值有和。若需要可空引用时,布尔类型的值会被装箱。此时程序会抛出异常最后从零开始学之数据类型到这里就结束了。 前言 大家好,这里是「从零开始学 Kotlin 之『2 』数据类型」,本文首发于公众号「Binguner」,欢迎前往大家关注。我会每周分享一些关于 Android 和...

    Awbeci 评论0 收藏0
  • 从零开始Kotlin 之「1」基础篇

    摘要:前言大家好,这里是从零开始学之基础篇,本文首发于公众号,欢迎前往大家关注。也可以用在表达式中集合的使用创建一个集合,并用循环遍历输出也可以在用去检查集合中的元素最后从零开始学之基础篇到这里就结束了。 前言 大家好,这里是「从零开始学 Kotlin 之『1 』基础篇」,本文首发于公众号「Binguner」,欢迎前往大家关注。我会每周分享一些关于 Android 和其他方向的技术干货或一...

    hatlonely 评论0 收藏0
  • 宅社V0.2.0发布并开源,从零开始打造个面向产品级应用

    摘要:宅社,一款纯粹的聚合类项目地址出于爱好与学习的目的做出了这款风格的应用,旨意通过涵盖端的一些热门技术框架来打造一个面向市场级别的产品通过本项目,你可以了解到以下技术组件化配置混淆多渠道包预览应用下载体验项目相关项目环境项目结构宿主基础库 showImg(https://segmentfault.com/img/remote/1460000014524898?w=1280&h=800);...

    Cristic 评论0 收藏0

发表评论

0条评论

Forest10

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<