zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【7】kotlin 类成员变量 set get方法

2023-09-27 14:27:38 时间

什么是类成员

 

  • 属性:或者说成员变量类范围内的变量

  • 方法:或者说成员函数,类范围内的函数

 

函数和方法的区别

 

  • 函数强调功能本身,不考虑从属

  • 方法的称呼通常是从类的角度出发

  • 叫法不同而已,不用纠结

定义方法

  • 写法与普通函数完全一致,就是写在类里面

class Hello{
    fun sayHello(name: String) = print("Hello,$name")
}

定义属性

  • 构造方法中 val/var修饰的都是属性

  • 类内部也可以定义属性

//aField 是属性,, notAField就不是了 是构造参数
class Hello2(val aField: Int, notAField: Int) {
    //这个也是属性
    var anotherField: Float = 3f
}

属性访问控制

属性可以定义getter/setter

属性初始化

  • 属性的初始化尽量再构造方法中完成
  • 无法再构造方法中完成,尝试降级为局部变量
  • 无法降级 var 可以用lateinit 延迟  val 用lazy
  • 可空类型谨慎用null 直接初始化 最好是不用哦

相关代码

java 中的get set

package com.yzdzy.kotlin.member;

public class JavaMember {
    private int b = 0;

    public int getB() {
        System.out.println("Java get B");
        return b;
    }

    public void setB(int b) {
        System.out.println("Java set B");
        this.b = b;
    }
}

kotlin 中的相关代码

package com.yzdzy.kotlin.member

class X
//类名不强制一样。
class KotilinMember {
    var b = 0;get()
    {
        print(" Kotilin get B")
        return field
    }
    set(value)
    {
        print("  Kotilin set B")
        field = value
    }

    val a :Int =1

    //    get set 已经被默认实现 默认是
    var c = 0; public set get
    //可以改为private
    var d = 0; private set get
    //权限控制和java一样
    //  var f:String 直接这么写会报错
    //lateinit 关键字 延迟处理
    lateinit var f: String
    // val e:X 直接这么写会报错 val 代表final
    val e: X by lazy {
        print("init X 在调用的时候才会被执行")
        X()
    }
    var cc: String? = null


}

class Hello {
    fun sayHello(name: String) = print("Hello,$name")
}
//aField 是属性,, notAField就不是了 是构造参数
class Hello2(val aField: Int, notAField: Int) {
    //这个也是属性
    var anotherField: Float = 3f
}

fun main() {
    println("start")
    var a = KotilinMember()
    println("init a ")
    println(a.b)
    println(a.e)
    println(a.c)
    //不初始化会报错 lateinit property f has not been initialized
//    print(a.f)
//两个 !!号 保证不为空。。一个?不确定是否为空
    print(a.cc?.length)
    print(a.cc!!.length)

    //函数强调功能本山。不考虑属性
//    方法的称呼通常是从类的角度出发


}