kotlin 扩展方法 数据类 属性代理

package kotlinall.chapter4

import java.lang.StringBuilder
import kotlin.reflect.KProperty

//类成员可见性
//kotlin 属性默认public
//internel 模块内可见
//方法重载
/*
* Overloads
* 名称相同,参数不同的方法
* Jvm函数签名的概念:函数名,参数列表
* 跟返回值没有关系
*应该避免定义关系不大的重载
不好的设计

*/
//扩展成员
//二次加工
//
class Overloads{
//    fun a():Int{
//        return 0
//    }
    @JvmOverloads //可以java使用无参的情况
    fun a(i:Int  = 0):Int{//方法重载的问题 一般可以通过默认参数解决
        return i
    }

}
operator fun String.times(i:Int):String{//扩展函数 String.方法名(参数)
    val stringBuilder:StringBuilder = StringBuilder()
    for(i in 0 until i){
        stringBuilder.append(this)
    }
    return stringBuilder.toString()
}
//java 调用扩展成员类似调用静态方法
//扩展属性 扩展属性不能初始化 类似与接口属性 设置getset方法
val String.a:String
    get()="abc"
var String.b:Int
    set(value){

    }
    get()=5


//属性代理
val hello by lazy {
    "hello"
}
//val 属性使用by 相当于get方法交给了代理对象的get方法
val hello1 by X()//扩展了get 方法 可以使用代理

var hello3 by X()
//var 属性使用by相当于get set方法给了代理对象 代理对象必须实现 重写get set方法
class X{
    private var value:String? = null
    operator fun getValue(thiRef:Any?,property:KProperty<*>):String{
        println("getValue $thiRef -> ${property.name}")
        return value ?: ""
    }
    operator fun setValue(thiRef:Any?,property:KProperty<*>,value:String){
        println("setValue $thiRef -> ${property.name}->$value")

        this.value = value
    }
}

//数据类 给类加上data 默认生成tostring eauals hashcode compoment等方法
data class Country(val id:Int,val name:String)//会是final类型 没有默认无参构造方法 javabean的两点需要
//官方除了两个插件noarg allopen 解决这个问题
//component1 .. 可以使用运算符重载
class ComponentX{
    operator fun component1():String{
        return "ffff"
    }
    operator fun component2():String{
        return "aaaaa"
    }
}
fun main(args: Array<String>) {
    val overloads:Overloads = Overloads()
    overloads.a()
    println("abc".times(16))
    println("abc"*16)
    println("abc".a)
    "abc".b = 5
    println(hello1)
    hello3 = "gac"
    println(hello3)

    val china = Country(0,"中国")
    println(china.toString())
    println(china)
    println(china.component1())//第一个参数的值
    println(china.component2())//第二个参数的值
    val (id,name) = china //id 使用component1赋值 name会使用component2赋值
    println(id)
    println(name)
    for((index,value) in args.withIndex()){

    }
    val(name1,nam2) = ComponentX()//因为重载了运算符component方法 可以使用这种多个值返回的形式
    println("$name1   $nam2")

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值