kotlin第四篇

总结kotlin语法(二)

kotlin类

kotlin变量get和set默认实现

  • 基于kotlin的全名对象模式
  • 在类里定义一个变量之后,通过类实例访问这个变量其实本质是调用了这个变量的get和set函数
  • 那么,基于此,我们可以手动重写这个默认的get和set函数
var no: Int = 100
   get() = field                // 后端变量
   set(value) {
       if (value < 10) {       // 如果传入的值小于 10 返回该值
           field = value
       } else {
           field = -1         // 如果传入的值大于等于 10 返回 -1
       }
   }
var lastName: String = "zhang"
        get() = field.toUpperCase()   // 将变量赋值后转换为大写
        set
  • 此field称之为后端变量,意为在set之后才会生效的变量(额,我是这么理解的)

当使用主构造器的时候,可以在Init代码块进行变量的赋值操作

class Person (a : Int) {
    var ini:Int? = null
    init {
         this.ini = a
    }
}
  • 或者
class People(val firstName: String, val lastName: String) {
    //在类中的方法可以使用主构造器中的变量
}
  • 也就是说,主构造器就相当于是定义变量及初始化

多构造参数之间的关系

class text (var a : Int){
    var s = a
    constructor(b:Int,c:Int):this(b){
    }
}
  • 可以有多个构造函数,但是每个次构造都必须直接或间接调用主构造函数
  • 类中方法可以直接使用主构造的参数,不能使用次构造函数的参数
类的修饰符
  • open // 类可继承,类默认是final的
  • internal // 同一个模块中可见

kotlin继承

  • 如果子类有主构造函数, 则基类必须在主构造函数中立即初始化。
open class Person(var name : String, var age : Int){// 基类}

class Student(name : String, age : Int, var no : String, var score : Int) : Person(name, age) {
}
  • 如果子类没有主构造函数,则必须在每一个二级构造函数中用 super 关键字初始化基类,或者在代理另一个构造函数。初始化基类时,可以调用基类的不同构造方法。
  • 父类方法需要被重写的话必须加上open关键字
  • 当继承的多接口有相同的方法时
interface A {
    fun foo() 
    fun bar()
}
interface B {
    fun foo() 
    fun bar()
}
class D : A, B {
    override fun foo() {
        super<A>.foo()
        super<B>.foo()
    }

    override fun bar() {
        super<B>.bar()
    }
}
  • 如果这多个接口中相同的方法,想通过子类调用父接口方法的话必须用super泛型实现

kotlin扩展

  • Kotlin 可以对一个类的属性和方法进行扩展,扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响。
  • 扩展函数
fun receiverType.functionName(params){
    body
}
  • 若扩展函数和成员函数一致,则使用该函数时,会优先使用成员函数。

猜你喜欢

转载自blog.csdn.net/asffghfgfghfg1556/article/details/79686631