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")
}