Kotlin 类可以包含:构造函数和初始化代码块、函数、属性、内部类、对象声明。
1,类基本信息
kotlin可以和java一样,都是使用class关键字标识,但不仅仅只用class,还可以用object关键字。
使用class标记的类为public final类型,默认不可被继承,如果需要被继承,需要使用open关键词。
使用object标记的类默认为static类,里面的方法看起来普普通通,但默认都是静态静态方法。
fun main(args: Array<String>) {
var test = TTson()
test.printt()
StaticTT.printHello()
}
class TTson : TestTT() {//继承TestTT
}
open class TestTT { //使用open表示可继承
fun printt() {
print("hello TestTT")
}
}
object StaticTT {
fun printHello() { //自带静态方法加持
print("Hello Static TT")
}
}
2,构造方法
1,白银操作
class TestTT {
var name: String? = null
constructor() {//使用constructor()函数来表示当前为构造方法
}
constructor(name: String) {//另一个构造方法 中规中矩 和java基本一毛一样
this.name = name
}
}
2,黄金操作
class TestTT constructor(name: String) { //构造方法移到上面去了 主构造方法
var name: String? = null
init {
this.name = name //再调用init代码块,如果有多个代码块,按顺序执行
}
}
3,钻石操作
class TestTT (name: String) {
var name: String? = null
init {
this.name = name
}
}
4,荣耀操作
class TestTT (var name: String) {//直接在主构造方法中定义变量
fun printName(){
print(name)
}
}
5,王者操作 如果是纯bean类,可以使用class data来定义
data class TestTT(var name: String)
3,init代码块
class TestTT constructor(var name: String, var addr: String) { //主构造方法
var age: Int = 0
init {
println("this is init $name")
}
constructor(age: Int, name: String) : this(name, "默认") {//所以这里通过this执行了类定义的构造方法
this.age = age
println("this is constructor")
}
fun printName() {
println("$name $age $addr")
}
}
调用
TestTT("monkeyking", "江西").printName()
TestTT(18, "monkey").printName()
输出日志:
this is init monkeyking//执行init代码块 name已被赋值,说明主构造方法先执行
monkeyking 0 江西
this is init monkey//执行init前已经对name进行定义初始化
this is constructor//最后才执行次构造方法
monkey 18 默认
总结:
1,先执行主构造方法
2,再执行init代码块
3,再执行次构造方法
4,嵌套类
嵌套类 2个类相互独立,嵌套的类定义在一个类内部
fun main(args: Array<String>) {
var nest = Out.Nest() 外部类.嵌套类
nest.printNest()
}
class Out {
class Nest {
fun printNest() {
println("this is Nest")
}
}
}
5,内部类
内部类 先有外部类再有内部类,内部类可以持有外部类的引用
fun main(args: Array<String>) {
var nest = Out().Inner()//先实例Out再实例Inner
nest.printNest()
}
class Out {
var name = "OUT"
inner class Inner {
var name = "INNER"
fun printNest() {
println("this is Nest,this is $name")
println("now I call Out's name " + [email protected])//通过this@Out获得外部类的引用
}
}
}
6,类的修饰符
类的修饰符包括 classModifier 和 accessModifier
classModifier: 类属性修饰符,标示类本身特性。
abstract // 抽象类
final // 类不可继承,默认属性
enum // 枚举类
open // 类可继承,类默认是final的
annotation // 注解类
accessModifier: 访问权限修饰符
private // 仅在同一个文件中可见
protected // 同一个文件中或子类可见
public // 所有调用的地方都可见
internal // 同一个模块中可见
7,继承及接口
继承同接口同java的语法是一样的,无非是语句不一样
java的继承 class Son extends Parent{}
kotlin的继承 class Son : Parent(){}
java的接口实现 class AA implements BB{ 重写方法 }
kotlin的接口实现 class AA : BB { 实现方法 }
8,伴生类
fun main(args: Array<String>) {
TestTT.name = "atongmu"
TestTT.sayHello()
}
class TestTT {
companion object { //伴生类 里面的属性和方法都是static 静态的,最多可以有一个
var name: String? = null
fun sayHello() { //静态方法
println("hello, $name")
}
}
}
9,数据类 data class
fun main(args: Array<String>) {
var test = TestTT("sunguanyong", 18)
println(test.toString())
}
class TestTT(var name: String, var age: Int)
输出:com.example.app.TestTT@355da254 //普通类的toString()
fun main(args: Array<String>) {
var test = TestTT("sunguanyong", 18)
println(test.toString())
}
data class TestTT(var name: String, var age: Int)
输出:TestTT(name=sunguanyong, age=18) //数据类的toString()已经被重写了
10,拓展属性及拓展方法
fun main(args: Array<String>) {
var test = TestTT("sunguanyong", 18)
test.print()
println(test.addr)
}
fun Any.sayHello() {//给Any类拓展了一个方法
println("hello")
}
fun TestTT.print() {
println("hello,我是拓展函数")
}
val TestTT.addr: String
get() = "hello,我是拓展属性"
class TestTT(var name: String, var age: Int)