美文网首页kotlin频道Kotlin入门Android知识
Kotlin最简单的入门教程——可见性修饰符,扩展,数据类,密封

Kotlin最简单的入门教程——可见性修饰符,扩展,数据类,密封

作者: next_discover | 来源:发表于2017-06-07 15:48 被阅读285次

    Kotlin最简单的入门教程——环境
    Kotlin最简单的入门教程——基础类型(一)
    Kotlin最简单的入门教程——基础类型(二)
    Kotlin最简单的入门教程——类和继承
    Kotlin最简单的入门教程——可见性修饰符,扩展,数据类,密封类
    Kotlin最简单的入门教程——委托
    Kotlin最简单的入门教程——神秘的Lambda
    Kotlin最简单的入门教程——集合
    Kotlin最简单的入门教程——关键字,操作符,异常,空指针
    Kotlin最简单的入门教程——与Java互相调用

    1 可见性修饰符

    在 Kotlin 中有这四个可见性修饰符:private、 protected、 internal 和 public。 如果没有显式指定修饰符的话,默认可见性是 public

    文件名和类名可以不同
    // 文件名:example.kt
    package foo
    
    fun baz() {}
    class Bar {}
    

    对于类内部声明的成员:

    private 意味着只在这个类内部(包含其所有成员)可见;
    protected—— 和 private一样 + 在子类中可见。
    internal —— 能见到类声明的 本模块内 的任何客户端都可见其 internal 成员;
    public —— 能见到类声明的任何客户端都可见其 public 成员。

    对于Java用户:Kotlin 中外部类不能访问内部类的 private 成员。

    如果你覆盖一个 protected 成员并且没有显式指定其可见性,该成员还会是 protected 可见性。

    open class Outer {
        private val a = 1
        protected open val b = 2
        internal val c = 3
        val d = 4  // 默认 public
    
        protected class Nested {
            public val e: Int = 5
        }
    }
    
    class Subclass : Outer() {
        // a 不可见
        // b、c、d 可见
        // Nested 和 e 可见
    
        override val b = 5   // “b”为 protected
    }
    
    class Unrelated(o: Outer) {
        // o.a、o.b 不可见
        // o.c 和 o.d 可见(相同模块)
        // Outer.Nested 不可见,Nested::e 也不可见
    }
    

    2 扩展

    Kotlin 支持 扩展函数 和 扩展属性。
    我们需要用一个 接收者类型 也就是被扩展的类型来作为他的前缀。 下面代码为 MutableList<Int> 添加一个swap 函数:

    fun MutableList<Int>.swap(index1: Int, index2: Int) {
        val tmp = this[index1] // “this”对应该列表
        this[index1] = this[index2]
        this[index2] = tmp
    }
    

    这个 this 关键字在扩展函数内部对应到接收者对象(传过来的在点符号前的对象) 现在,我们对任意 MutableList<Int> 调用该函数了:

    val l = mutableListOf(1, 2, 3)
    l.swap(0, 2) // “swap()”内部的“this”得到“l”的值
    

    扩展函数只能使用类名调用,因为他是静态的

    class C {
        fun foo() { println("member") }
    }
    
    fun C.foo() { println("extension") }
    

    3 数据类

    数据类必须满足以下要求:

    主构造函数需要至少有一个参数;
    主构造函数的所有参数需要标记为 val 或 var;
    数据类不能是抽象、开放、密封或者内部的;
    (在1.1之前)数据类只能实现接口。

    data class User(val name: String = "", val age: Int = 0)
    

    在很多情况下,我们需要复制一个对象改变它的一些属性,但其余部分保持不变。 copy() 函数就是为此而生成。对于上文的 User 类,其实现会类似下面这样:

    fun copy(name: String = this.name, age: Int = this.age) = User(name, age)     
    这让我们可以写
    
    val jack = User(name = "Jack", age = 1)
    val olderJack = jack.copy(age = 2)
    

    4 密封类

    类名前面添加 sealed 修饰符。虽然密封类也可以 有子类,但是所有子类都必须在与密封类自身相同的文件中声明

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

    5 枚举类

    枚举类的最基本的用法是实现类型安全的枚举

    enum class Direction {
        NORTH, SOUTH, WEST, EAST
    }
    
    

    <br /><br />

    最后欢迎加入Kotlin QQ群,一起讨论学习:

    Paste_Image.png

    欢迎关注 微信公号

    android频道

    相关文章

      网友评论

        本文标题:Kotlin最简单的入门教程——可见性修饰符,扩展,数据类,密封

        本文链接:https://www.haomeiwen.com/subject/zozofxtx.html