类的定义
- Kotlin 类可以包含:构造函数和初始化代码块、函数、属性、内部类、对象声明。
- Kotlin 中使用关键字 class 声明类,后面紧跟类名:
class DemoClass{ // 类名为 DemoClass
// 大括号内是类体构成
}
class EmptyClass//默认什么都不添加
类的属性
- 类的属性可以用关键字 var 声明为可变的,否则使用只读关键字 val 声明为不可变。
class PropertyClass{
var name: String =""
var url: String ="abc"
val age: Int=1
}
- 一个类只能有一个主构造函数以及多个次要构造函数,只有主构造函数可以写在类头中,其他的次级构造函数(Secondary Constructors)就需要写在类体中以constructor修饰。
- 主构造函数的参数也是类的属性,它们默认属于类的公有字段,可以直接使用,如果你不希望别的类访问到这个变量即如下面例子中的 Person("firstName").firstName是不能够获取到其firstName的,所以可以用private修饰如:
class Person constructor(private var firstName: String) {
//firstNane 即主构造函数的参数也就是所说的属性
//init {} 是如果有额外的代码段需要执行可以卸载 init 中
init {
println(firstName)
}
fun print() {
println(firstName)
}
//次构造函数 用constructor修饰
//二级构造函数中的参数1(name),是委托了主构造函数的参数firstName。
constructor(name: String, age: Int) : this(name)
}
//调用
fun main(args: Array<String>) {
/**
* 初始化直接打印输出 firstName
*/
Person("firstName") //主构造函数 调用主函数只会调用init方法
Person("firstName",10) //次构造函数 可以有很多次构造函数,调用此函数不仅调用init方法还会调用次函数方法块
}
- 注意:可省略constructor的情况,1、在构造函数不具有注释符或者默认的可见性修饰符时,constructor关键字可以省略,2、默认的可见性修饰符时public。可以省略不写。
//类似下面2种情况是不能省略的
class Test private constructor(num: Int){
}
class Test @Inject constructor(num: Int){
}
- 注意:无论 主次构造函数的参数都可以设置默认值例如:
class Person constructor(private var firstName: String="默认值") {
init {
println(firstName)
}
}
fun main(args: Array<String>) {
Person()//当参数有默认值的时候可以通过无参进行初始化
}
fun newStudent(name: String,
age: Int= 18,
sex: String= "男"){
println("$name+是+$age+岁的+$sex+生!")
}
fun main(args: Array<String>) {
//1、默认参数调用
newStudent("鸣人")
//2、非默认参数调用
newStudent("鸣人",20,"女")
//3、使用命名参数
newStudent("鸣人",age=20,sex="女")
}
修饰符
- private 修饰符,同一类或文件(针对包级别定义)中可见
- opens 修饰符 ,Kotlin 默认会为每个变量和方法添加 final 修饰符,在 Kotlin 中默认每个类都是不可被继承的。如果你确定这个类是会被继承的,那么你需要给这个类添加 open 修饰符。
- internal 修饰符,在 Kotlin 中,默认的访问权限是 public,模块级别的访问权限。
何为模块(module),我们称被一起编译的一系列 Kotlin 文件为一个模块。在 IDEA 中可以很明确的看到一个 module 就是一个模块,当跨 module 的时候就无法访问另一个module 的 internal 变量或方法。
- 注意:在Kotlin中,外层的类( outer class)不能访问内部类(inner classes)的private成员。
类的类别
- Kotlin中的类可详细的分为:密封类、内部类(嵌套类)、抽象类、枚举类、接口类、数据类
密封类
内部类
抽象类
枚举类
- 枚举类中的每一个枚举常量都是一个对象,并且他们之间用逗号分隔。
/**
* 例:关于一个网络请求结果的枚举类
*/
enum class State{
/*
NORMAL : 正常
NO_DATA : 数据为空
NO_INTERNET : 网络未连接
ERROR : 错误
OTHER : 其他
*/
NORMAL,NO_DATA,NO_INTERNET,ERROR,OTHER
}
接口类
数据类
网友评论