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仍是有殊途同归之处,须要细细安装教程去写一次差很少都能理解能明白了,难点主要就在于次构造函数委托主构造函数的理解.