前言
Kotlin被Google官方認爲是Android開發的一級編程語言
今天,我將主要講解kotlin中的類的所有知識,主要內容包括如下:
1. 類的聲明 & 實例化
// 格式
class 類名(參數名1:參數類型,參數名2:參數類型...){
// to do
}
// 示例
class User(userName: String, age: Int){
// to do
}
// 實例化
// Kotlin沒有new關鍵字,所以直接創建類的實例(無參情況 & 有參):
var user = User()
var user = User("ABC" , 123)
// 額外說明:Kotlin支持默認參數
// 即在調用函數時可不指定參數,則使用默認函數
class User(userName: String = "hjc", age: Int = 26){
// to do
}
// 在實例化類時不傳入參數,userName默認 = hjc,age默認 = 26
var user = User()
// 在設置默認值後,若不想用默認值可在創建實例時傳入參數
var user = User("ABC" , 123)
// 注:命名參數
若一個默認參數在一個無默認值的參數前,那麼該默認值只能通過使用命名參數調用該函數來使用
class User(userName: String = "hjc", age: Int){
// to do
}
var user = User(age = 26)
對於構造函數,Kotlin中類可有一個主構造函數 & 多個次構造函數,下面將詳細說明。
2. 構造函數
2.1 主構造函數
- 屬於類頭的一部分 = 跟在類名後,採用 constructor 關鍵字
- 不能包含任何的代碼。初始化的代碼放到以 init 關鍵字作爲前綴的代碼塊中
class 類名 constructor(參數名:參數類型){
init {
//...
}
}
// 示例
class User constructor(userName: String) {
init {
//...
}
}
// 注:若主構造函數無任何註解 / 可見性修飾符,可省略 constructor 關鍵字
class 類名(參數名:參數類型){
init {
//...
}
}
// 示例
class User (userName: String) {
init {
//...
}
}
2.2 次構造函數
- 必須加constructor關鍵字
- 一個類中可存在多個次構造函數,傳入參數不同
// 形式
constructor(參數名:參數類型) :{函數體}
// 示例
class User(userName: String) {
// 主構造函數
init {
println(userName)
}
// 次構造函數1:可通過this調主構造函數
constructor() : this("hjc")
// 次構造函數2:可通過this調主構造函數
constructor(age: Int) : this("hjc") {
println(age)
}
// 次構造函數3:通過this調主構造函數
constructor(sex: String, age: Int) : this("hjc") {
println("$sex$age")
}
}
// 實例化類
User("hjc") // 調用主構造函數
User() // 調用次構造函數1
User(2) // 調用次構造函數2
User("male",26) // 調用次構造函數3
3. 類的屬性
Kotlin的類可以擁有屬性:關鍵字var(讀寫) / 關鍵字val(只讀)
class User {
var userName: String
val sex: String = "男"
}
// 使用屬性 = 名稱 + 引用
User().sex // 使用該屬性 = Java的getter方法
User().userName = "hjc" // 設置該屬性 = Java的setter方法
4. 可見性修飾符
5. 繼承 & 重寫
- 類似於Java,Kotlin是單繼承 = 只有一個父類
- 區別:Kotlin使用冒號“ : ”繼承 & 默認不允許繼承(若想讓類可被繼承,需用open關鍵字來標識)
// 用open關鍵字標識該類允許被繼承
open class Food
// 類Fruits繼承類Food
class Fruits : Food()
- 對於子類重寫父類的方法,在Kotlin中,方法也是默認不可重寫的
- 若子類要重寫父類中的方法,則需在父類的方法前面加open關鍵字,然後在子類重寫的方法前加override關鍵字
// 父類
// 在類 & 方法前都加了關鍵字open,爲了被繼承 & 方法重寫
open class Food {
open fun banana() {}
}
// 子類
class Fruits : Food(){
// 重寫了父類的方法
override fun banana() {
super.banana()
}
}
6. 特殊類
下面將講解一些特殊的類:
- 嵌套類(內部類)
- 接口
- 數據類
- 枚舉類
6.1 嵌套類(內部類)
/**
* 1. 嵌套類(內部類)
* 標識:關鍵字inner
* 使用:通過外部類的實例調用嵌套類
*/
class User {
var age: Int = 0
inner class UserName {
}
}
var userName: User.UserName = User().UserName()
6.2 接口
/**
* 2. 接口
* 標識:關鍵字interface
*/
// 聲明
interface A{}
interface B{}
// 方法體
// 接口中的方法可以有默認方法體,有默認方法體的方法可不重寫
// 區別於Java:Java不支持接口裏的方法有方法體。
interface UserImpl{
fun getName(): String // 無默認方法體,必須重寫
fun getAge(): Int{ // 有默認方法體,可不重寫
return 22
}
}
// 實現接口UserImpl:需重寫getName() & 可不重寫getAge()
class User :UserImpl{
override fun getName(): String {
return "hjc"
}
}
// 實現接口:冒號:
class Food : A, B {} // Kotlin是多實現
class Fruits: Food,A, B {} // 繼承 + 實現接口
6.3 數據類
/**
* 3. 數據類
* 作用:保存數據
* 標識:關鍵字data
*/
// 使用:創建類時會自動創建以下方法:
// 1. getter/setter方法;
// 2. equals() / hashCode() 對;
// 3. toString() :輸出"類名(參數+參數值)";
// 4. copy() 函數:複製一個對象&改變它的一些屬性,但其餘部分保持不變
// 示例:
// 聲明1個數據類
data class User(var userName: String, var age: Int)
// copy函數使用
var user = User("hjc",26)
var user1 = user.copy(age = 30)
// 輸出user1.toString(),結果是:User(userName=hjc,age=30)
// 特別注意
// 1. 主構造方法至少要有一個參數,且參數必須標記爲val或var
// 2. 數據類不能用open、abstract、sealed(封閉類)、inner標識
6.4 枚舉類
/**
* 4. 枚舉類
* 標識:關鍵字enum
*/
// 定義
enum class Color {
RED, GREEN, BLUE
}
// 爲枚舉類指定值
enum class Color(rgb: Int) {
RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF)
}
至此,關於kotlin入門語法中的類使用講解完畢。
總結
- 本文全面介紹了Kotlin入門語法中的類
- 接下來推出的文章,我將繼續講解Kotlin的相關知識,包括使用、語法特點等,感興趣的讀者可以繼續關注我的博客哦:Carson_Ho的Android博客