Kotlin学习总结(一)写个类

337 阅读4分钟
2019.07.01开始上手写kotlin,每日一更,立个flag

写一个类

类成员

类可以包含:
  • 构造函数与初始化块(总结这部分内容)
  • 函数
  • 属性
  • 嵌套类与内部类
  • 对象声明
Kotlin 中使用关键字 class 声明类

class HelloWorld{...}  //最简单的一个类就OK了,和java差不多的
类声明由类名、类头(指定其类型参数、主构造函数等)以及由花括号包围的类体构成。类头与类体都是可选的; 如果一个类没有类体,可以省略花括号。这种就不展示出来了。

构造函数

在 Kotlin 中的一个类可以有一个主构造函数以及一个或多个次构造函数。主构造函数是类头的一部分:它跟在类名(与可选的类型参数)后。

class HelloPeiqiTest constructor(str: String){
    //........
}
如果主构造函数没有任何注解或者可见性修饰符,可以省略这个 constructor 关键字。

class HelloPeiqiTest(str: String){
    //........
}
主构造函数不能包含任何的代码。初始化的代码可以放到以 init 关键字作为前缀的初始化块(initializer blocks)中。在实例初始化期间,初始化块按照它们出现在类体中的顺序执行,与属性初始化器交织在一起:

class HelloPeiqiTest constructor(string: String){
    var str="nihao"
    init {
        println("HelloPeiqiTest-init1")
    }
    var num:Int=21
    init {
        println("HelloPeiqiTest-init2")
    }
    init {
        println("HelloPeiqiTest-init3")
    }
}
主构造的参数可以在初始化块中使用。它们也可以在类体内声明的属性初始化器中使用

class HelloPeiqiTest(name: String){
    var str="nihao"+name.toUpperCase()
}

与普通属性一样,主构造函数中声明的属性可以是可变的(var)或只读的(val)。
如果构造函数有注解或可见性修饰符,这个 constructor 关键字是必需的,并且这些修饰符在它前面:

class HelloPeiqiTest private constructor(val name: String,val num:Int){
    init {
        println("HelloPeiqiTest-init1")
    }
}

次构造函数

类也可以声明前缀有 constructor的次构造函数:

class HelloPeiqiTest{
    constructor(name:String){
        println(name)
    }
    init {
        println("HelloPeiqiTest-init1")
    }
}
如果类有一个主构造函数,每个次构造函数需要委托给主构造函数, 可以直接委托或者通过别的次构造函数间接委托。委托到同一个类的另一个构造函数用 this 关键字即可:

class HelloPeiqiTest(age:Int) {
    constructor(name:String,twoAge:Int):this(twoAge){
        println(name)
    }
    init {
        println("HelloPeiqiTest-init1")
    }
}
请注意,初始化块中的代码实际上会成为主构造函数的一部分。委托给主构造函数会作为次构造函数的第一条语句,因此所有初始化块中的代码都会在次构造函数体之前执行。即使该类没有主构造函数,这种委托仍会隐式发生,并且仍会执行初始化块:

class HelloPeiqiTest(age:Int) {
    constructor(name:String,twoAge:Int):this(twoAge){
        println(name)
    }
    init {
        //会先执行这个代码,再执行上面的println(name)
        println("HelloPeiqiTest-init1")
    }
}

如果一个非抽象类没有声明任何(主或次)构造函数,它会有一个生成的不带参数的主构造函数。构造函数的可见性是 public。如果你不希望你的类有一个公有构造函数,你需要声明一个带有非默认可见性的空的主构造函数:

class HelloPeiqiTest private constructor {
    // 有一个生成的不带参数的主构造函数,默认的可见性是public,就是什么都不写。
    init {
        println("HelloPeiqiTest-init1")
    }
}
注意:在 JVM 上,如果主构造函数的所有的参数都有默认值,编译器会生成 一个额外的无参构造函数,它将使用默认值。这使得 Kotlin 更易于使用像 Jackson 或者 JPA 这样的通过无参构造函数创建类的实例的库。

class HelloPeiqiTest(age:Int=12) {
    init {
        println("HelloPeiqiTest-init1")
    }
}
创建类的实例
要创建一个类的实例,我们就像普通函数一样调用构造函数,注意 Kotlin 并没有 new 关键字。

fun main(args: Array<String>) {
    println("------------start----------")
    var mHelloPeiqiTest= HelloPeiqiTest()
    println("------------stop----------")
}
class HelloPeiqiTest(age:Int=12) {
    init {
        println("HelloPeiqiTest-init-$age")
    }
}
运行结果:

------------start----------
HelloPeiqiTest-init-12
------------stop----------
总结
类这部分主要讲的就是如何去创建一个类,以为其初始化方法和构造函数,分为主构造函数和次函数,整体写法和java还是有异曲同工之处,需要细细安装教程去写一次差不多都能理解能明白了,难点主要就在于次构造函数委托主构造函数的理解.