1. 程式人生 > >空型別,智慧型別轉換

空型別,智慧型別轉換

//面向物件
class 妹子 (性格:String, 長相:String, 聲音:String):人(性格,長相,聲音){
    init {//構造方法 方法體
        println("new 了一個妹子,他性格${性格},長相${長相}")
    }


}
class 帥哥 (var 性格:String,var 長相:String,var 聲音:String){
    init {//構造方法 方法體
        println("new 了一個妹子,他性格${性格},長相${長相}")
    }


}

open class 人 (var 性格:String,var 長相:String,var 聲音:String){
    init {//構造方法 方法體
        println("${this.javaClass.simpleName}new 了一個妹子,他性格${性格},長相${長相}")
    }


}
//所有類都是 Any的子類
val my妹子 =妹子("溫柔","甜美","動人")


fun main(args:Array<String>){
    val 我的妹子 = 妹子("","","")
    val 一個帥哥 = 帥哥("","","")
    println(我的妹子 is 人)
}

public class Child extends Parent {
    public String getname(){
        return "child";
    }
}

public class Parent {

}

//空型別安全 智慧型別轉換
fun getName():String{//String 非空型別
   // return null;//編譯器報錯
    return ""
}
fun getName1():String?{//String可以為空型別
    return null
}
fun main(args:Array<String>){
    println(getName().length)//無需要判空
//    if(getName() == null){//condition is always false
//
//    }
    val name1 = getName1()
    if(name1 != null){
        println(name1.length)
    }
    println(name1?.length)//如果name不為空返回長度 為空返回null
    if(getName1() == null) return
    val name2 = getName1() ?: return// ?:(如果是空執行符號後面的語句) 定義一個變數值是null返回 如果不是 直接賦值
    println(name1!!.length)//!! 欺騙編譯器 確定為非空型別
}


fun main(args:Array<String>){
    val parent:Parent = Child()
    if(parent is Child){
        println(parent.getname())//不需要強轉 因為已經做了型別判斷了
    }
    val string:String?="hello"
    if(string is String)
       println(string.length)//做了型別判斷
    if(string != null)//做了非空判斷
        println(string.length)

    val parent1:Parent = Parent()
    val child:Child? = parent as Child //parent強轉child 轉換失敗 丟擲異常
    val child1:Child? = parent as? Child //轉換失敗 直接返回空 as?
}