2016-01-08 39 views
1

我有下面的類。空超載構造

class Student(id: String, name: String) { 

    var id: String? = null 
    var name: String? = null 
    var grade: String? = null 

    constructor(id: String, name: String, grade: String) : this(id,name) { 
     this.grade = grade 
    } 
} 

用途:

var student = Student("AB001","Smith","N/A") 

    prinln(student.id + student.name + student.grade) 

輸出:

nullnullN/A

任何人都可以解釋爲什麼我從默認的構造函數的輸出空?

回答

4

除了其他答案,還有另外一種方法。初始化直接使用主構造函數的參數屬性:

class Student(id: String, name: String) { 

    var id: String? = id 
    var name: String? = name 
    var grade: String? = null 

    constructor(id: String, name: String, grade: String) : this(id,name) { 
     this.grade = grade 
    } 
} 

注意,因爲idname總是與非空值初始化,您可以省略?。除此之外,你可以在主構造使用默認值忽略次要構造:

class Student(id: String, name: String, grade: String? = null) { 

    var id: String = id 
    var name: String = name 
    var grade: String? = grade 

} 

但是現在我們只剩下一個構造函數,所以我們可以直接拉動的屬性到構造:

class Student(
     var id: String, 
     var name: String, 
     var grade: String? = null 
) 

因爲類的身體現在是空的,我也省略了大括號。

+0

太棒了!謝謝。 – borrom

+1

順便說一句,你確定,你需要聲明的屬性爲'var's?如果你稍後不會改變它們,就讓它們成爲'val'。 –

5
class Student { 
    var id: String? = null 
    var name: String? = null 
    var grade: String? = null 

    constructor(id: String, name: String) { 
     this.id=id 
     this.name=name 
    } 

    constructor(id: String, name: String, grade: String) : this(id, name) { 
     this.grade = grade 
    } 
} 

class Student(var id: String?, var name: String?) { 
    var grade: String? = null 

    constructor(id: String, name: String, grade: String) : this(id, name) { 
     this.grade = grade 
    } 
} 
1

或者

class Student(id: String, name: String) { 
    var id: String? = null 
    var name: String? = null 
    var grade: String? = null 

    init { 
     this.id = id 
     this.name = name 
    } 

    constructor(id: String, name: String, grade: String) : this(id,name) { 
     this.grade = grade 
    } 
} 

初始化模塊是你如何在主構造,當他們沒有標記爲丘壑或增值經銷商必須做使用參數那裏。

換言之,由於您沒有將主要構造函數中的參數(類名旁邊的括號)標記爲val或vars,因此它們不會自動指定爲屬性。爲了在主構造函數中使用參數,特別是那些沒有被標記爲變量和val的參數,你需要一個init塊。

我不禁想,你真正想要的是雖然:

class Student (var id: String, var name: String, var grade: String? = null) 

甚至其更改爲丘壑,而不是增值經銷商。

+0

順便說一句,什麼時候該初始化塊執行?構造函數執行後? – user1453345

+0

是的。代碼按照它的順序執行。因爲次構造函數調用主構造函數,所以它首先被執行,然後屬性被初始化爲'null',然後'init'塊運行,最後運行二級構造函數中的代碼。 –