美文网首页
Kotlin 基础知识(上)

Kotlin 基础知识(上)

作者: 莫库施勒 | 来源:发表于2019-05-22 15:27 被阅读0次

1,变长参数定义 vararg

fun vars(vararg v:Int){
    for(vt in v){
        print(vt)
    }
}

2, NULL检查机制

//类型后面加?表示可为空
var age: String? = "23" 
//抛出空指针异常
val ages = age!!.toInt()
//不做处理返回 null
val ages1 = age?.toInt()
//age为空返回-1
val ages2 = age?.toInt() ?: -1

3,区间定义, in 关键字后可接 .. 、downTo、until,后接 step

for (i in 1..4) print(i) // 输出“1234”

for (i in 4..1) print(i) // 什么都不输出

if (i in 1..10) { // 等同于 1 <= i && i <= 10
    println(i)
}

// 使用 step 指定步长
for (i in 1..4 step 2) print(i) // 输出“13”

for (i in 4 downTo 1 step 2) print(i) // 输出“42”


// 使用 until 函数排除结束元素
for (i in 1 until 10) {   // i in [1, 10) 排除了 10
     println(i)
}

区间源码实现
4,比较 三个等号 === 表示比较对象地址,两个 == 表示比较两个值大小

fun main(args: Array<String>) {
    val a: Int = 10000
    println(a === a) // true,值相等,对象地址相等

    //经过了装箱,创建了两个不同的对象
    val boxedA: Int? = a
    val anotherBoxedA: Int? = a

    //虽然经过了装箱,但是值是相等的,都是10000
    println(boxedA === anotherBoxedA) //  false,值相等,对象地址不一样
    println(boxedA == anotherBoxedA) // true,值相等
}

5,多行字符串用""" 三个引号
6,if 默认返回最后一行数据, when 关键字类似于switch
7,标签出返回
定义 tag@{...} 返回 return@tag value

8,类的定义

class Foo constructor(arg: String) {  // 类名为 Foo 默认构造函数
   var <propertyName>[: <PropertyType>] [= <property_initializer>]
        [<getter>]
        [<setter>]

    init { // 初始化代码段使用 init 关键字作为前缀
        println("FirstName is $firstName")
    }

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

    // 如果类有主构造函数,每个次构造函数都要,或直接或间接通过另一个次构造函数代理主构造函 
    // 数。在同一个类中代理另一个构造函数使用 this 关键字
    constructor (name: String, age:Int) : this(name) {
        // 初始化...
    }

    class Nested {             // 嵌套类, 相当于java 的静态内部类
        fun foo() = 2
    }

    inner class Inner {  // 内部类
        fun foo() = bar  // 访问外部类成员
        fun innerTest() {
            var o = this@Outer //获取外部类的成员变量
            println("内部类可以引用外部类的成员,例如:" + o.v)
        }
    }

    interface TestInterFace {
        fun test()
    }

    fun main(args: Array<String>) {
    var test = Test()

    /**
     * 采用对象表达式来创建接口对象,即匿名内部类的实例。
     */
    test.setInterFace(object : TestInterFace {
        override fun test() {
            println("对象表达式创建匿名内部类的实例")
        }
    })
}
}

9,类的修饰符

abstract    // 抽象类  
final       // 类不可继承,默认属性
enum        // 枚举类
open        // 类可继承,类默认是final的
annotation  // 注解类

private    // 仅在同一个文件中可见
protected  // 同一个文件中或子类可见
public     // 所有调用的地方都可见
internal   // 同一个模块中可见

10,Kotlin 中所有类都继承该 Any 类,它是所有类的超类,Any 默认提供了三个函数

equals()

hashCode()

toString()

// 如果一个类要被继承,可以使用 open 关键字进行修饰。
// 属性重写使用 override 关键字,属性必须具有兼容类型,每一个声明的属性都可以通过初始化程序 
// 或者getter方法被重写, 也用一个var属性重写一个val属性,但是反过来不行。
open class Foo {
    open val x: Int get { …… }
}

class Bar1 : Foo() {
    override val x: Int = ……
}

相关文章

网友评论

      本文标题:Kotlin 基础知识(上)

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