kotlin-2-类相关基础知识

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,继承及接口

扫描二维码关注公众号,回复: 15964401 查看本文章
继承同接口同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)

猜你喜欢

转载自blog.csdn.net/sunguanyong/article/details/125269684