Kotlin 可以编译成Java字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行
类定义
一、类和对象
1.1 前言
Kotlin 是一门面向对象的开发语言。也有着面向对象语言的特性。而面向对象的三大特性即封装、继承、多态,这是每一门面向对象语言都具有的特性。
1.2 定义类
使用 Kotlin 创建第一个类,咱描述的详细一点。
Kotlin 类可以包含:
构造函数和初始化代码块
函数(方法)
属性(字段)
嵌套类(内部类)
对象声明。
Kotlin 中使用关键字 class 声明类,后面紧跟类名
/**
* kotlin 类和对象
*/
class ClsClass {
//定义属性
var name:String =""
var age:Int =0
//定义方法
fun info():Unit{
println("$name 今年已经$age")
}
}
类的属性
属性定义
类的属性可以用关键字 var 声明为可变的,否则使用只读关键字 val 声明为不可变。
不可变变量定义:val 关键字,只能赋值一次的变量(类似Java中final修饰的变量)
非空属性必须在定义的时候初始化,kotlin提供了一种可以延迟初始化的方案,使用 lateinit 关键字描述属性:
class Test{
lateinit var a: String
lateinit 对应使用var来声明属性
lateinit 不可以修饰原始数据类型(byte,char,short ,int,long,float,double)
1.3 field val不允许设置setter函数,因为它是只读的。
针对你定义的每一个属性,Kotlin都会产生一个field、一个getter、以及一个setter,field用来存储属性数据,你不能直接定义field,Kotlin会封装field,保护它里面的数据,只暴露给getter和setter使用。
field使用场景:当你需要覆盖Kotlin自动生成的getter和setter时使用。
var age:Int =0
get() = field+20
set(value) {
field = value+6
println(field)
}
age =1
println(age)// 27
我们可以像使用普通函数那样使用构造函数创建类实例: Kotlin 中没有 new 关键字
要使用一个属性,只要用名称引用它即可
println(" ________________kotlin 类的使用__________________")
var cls =ClsClass()
cls.name="dawei"
cls.info()
1.4 构造函数
Koltin 中的类可以有一个主构造器,以及一个或多个次构造器,主构造器是类头部的一部分,位于类名称之后。主构造器是类头部的一部分,位于类名称之后:
class Person constructor(firstName: String) {}
1.4.1 主构造器
我们在UserInfo类的定义头中定义一个主构造函数,使用临时变量为UserInfo的各个属性提供初始值,在Kotlin中,为便于识别,临时变量(包括仅引用一次的参数),通常都会以下划线开头的名字命名。
如果构造器有注解,或者有可见度修饰符,这时constructor关键字是必须的,注解和修饰符要放在它之前,如果主构造器没有任何注解,也没有任何可见度修饰符,那么constructor关键字可以省略。
class Person(_firstName: String) {
}
主构造器中不能包含任何代码,初始化代码可以放在初始化代码段中,初始化代码段使用 init 关键字作为前缀。
class Person constructor(firstName: String) {
init {
println("FirstName is $firstName")
}
}
主构造函数定义属性
Kotlin允许你不使用临时变量赋值,而是直接用一个定义同时指定参数和类属性,这种方式定义类属性,可以减少重复代码。
class UserInfo2(var name:String, _age:Int) {
var age = _age
}
次构造函数
类也可以有二级构造函数,需要加前缀 constructor:
我们可以定义多个次构造函数来配置不同的参数组合。
同时,可以使用次构造函数,定义初始化代码逻辑。
在同一个类中代理另一个构造函数使用 this 关键字
class Person {
constructor(parent: Person) {
parent.children.add(this)
}
}
如果类有主构造函数,每个次构造函数都要,或直接或间接通过另一个次构造函数代理主构造函数。在同一个类中代理另一个构造函数使用 this 关键字:
class Person(val name: String) {
constructor (name: String, age:Int) : this(name) {
// 初始化...
}
}
如果一个非抽象类没有声明构造函数(主构造函数或次构造函数),它会产生一个没有参数的构造函数。构造函数是 public 。如果你不想你的类有公共的构造函数,你就得声明一个空的主构造函数:
class DontCreateMe private constructor () {
}
1.4.3 初始化顺序
-
1、主构造函数里声明的属性
-
2、类级别的属性赋值
-
3、init初始化块里的属性赋值和函数调用
-
4、次构造函数里的属性赋值和函数调用
class UserInfo2(var name: String, _age: Int) {
var age = _age
var isMan = false//设置默认参数。
init {
println("初始化:$name 今年已经$age 岁了,$isMan")
}
//次构造器
constructor(name: String, _isMan: Boolean) : this(name, _age = 21) {
this.name = "$name,BOOM"
isMan = _isMan
println("次构造器:$name 今年已经$age 岁了,$isMan")
}
}
fun main() {
//初始化顺序
UserInfo2("顺讯",true)
}
二、类的修饰符(类别)
Kotlin 类的修饰符包括 classModifier 和 accessModifier
2.1 classModifier
类属性修饰符,标示类本身特性(类别)
abstract // 抽象类
final // 类不可继承,默认属性
enum // 枚举类
open // 类可继承,类默认是final的
annotation // 注解类
data // 数据类
sealed // 密封类
object // 单例类
2.2 accessModifier
访问权限修饰符
Kotlin与Java可见性修饰符对比
修饰符 Java Kotlin
public 所有类可见 所有类可见(默认)
private 当前类可见 当前类可见
protected 当前类、子类、同一包路径下的类可见 当前类、子类可见
default 同一包路径下的类可见(默认) 无
internal 无 同一模块中的类可见