談談 Kotlin 中的構造方法,有哪些注意事項?

在 Kotlin 中,構造方法分為主構造方法(Primary Constructor)和次構造方法(Secondary Constructor)。

1 主構造方法

主構造方法是類的核心構造方法,直接在類頭聲明,位于類名之后。

1.1 基本語法
class Person constructor(val name: String, val age: Int) {// 類體
}

如果主構造方法沒有注解或可見性修飾符,constructor 關鍵字可以省略:

class Person(val name: String, val age: Int) {// 類體
}
1.2 特點
1.2.1 屬性聲明

參數直接作為屬性:可通過 valvar 將主構造函數的參數聲明為類的屬性。

class Person(val name: String, age: Int) {// name 是屬性,age 是構造方法參數
}
1.2.2 構造方法參數的作用域

主構造方法的參數可以在類體中直接使用,但未聲明 val/ var 的參數僅在 init 代碼塊和屬性初始化器中可見。

class User(private val id: String, name: String, age: Int) {// id 是類屬性,在任何地方都可以用// name、age 僅在 init 代碼塊和屬性初始化器中可見val displayName = "[$id] $name"init {println("age = $age")}
}

屬性初始化器是用于在聲明屬性時直接賦值的語法,它允許在類體或主構造函數中直接為屬性設置初始值。

屬性初始化器可以在以下兩種場景中使用:

  • 主構造函數中聲明屬性并初始化;
  • 類體中可以直接初始化屬性;
// 通過主構造函數參數聲明屬性并初始化
class User(val name: String = "Unknown", var age: Int = 0)class User {val name: String = "Unknown" // 屬性初始化器val age: Int = 0 // 屬性初始化器
}
1.2.3 初始化代碼

使用 init 代碼塊執行額外的初始化邏輯。

class User(name: String, age: Int) {val formattedName: Stringinit {formattedName = "Mr./Ms. $name"println("Person initialized: $formattedName")}
}
1.2.4 可見性修飾符

主構造函數的可見性默認是 public,可顯式指定:

class User private constructor(val name: String) // 私有構造方法

2 次構造方法(Secondary Constructor)

次構造方法通過 constructor 關鍵字在類體內定義,必須直接或間接調用主構造函數。

2.1 基本語法
class Person(val name: String) {var age: Int = 0// 次構造方法必須直接或間接委托給主構造方法constructor(name: String, age: Int) : this(name) {this.age = age}
}
2.2 注意事項
2.2.1 必須委托

每個次構造函數必須通過 this() 調用主構造函數或其他次構造函數,確保所有初始化路徑都經過主構造函數:

class User {constructor(name: String) : this(name, 0) // 錯誤:沒有主構造方法constructor(name: String, age: Int) // 如果沒有主構造方法,次構造方法無需委托
}
2.2.2 初始化順序

主構造函數的參數初始化 —> init 代碼塊 —> 次構造函數體:

class User(val name: String) {init {println("主構造方法初始化")}constructor(name: String, age: Int) : this(name) {println("次構造方法執行")}
}fun main() {User("Eileen", 34)
}// 主構造方法初始化
// 次構造方法執行
2.2.3 避免與主構造方法參數沖突

次構造方法的參數名應避免與主構造方法的屬性名重復:

class User(val name: String) {constructor(name: String, age: Int) : this(name) {// 此處的 name 參數會屏蔽類的 name 屬性}
}

3 初始化順序

  • 主構造函數參數初始化;
  • 類屬性按聲明順序初始化;
  • init 塊按出現順序執行;
  • 次構造函數執行;
class User(val name: String = "Eileen") {val a = println("a 初始化")init {println("init 1")}val b = println("b 初始化")init {println("init 2")}
}fun main() {User()
}// a 初始化 -> init 1 -> b 初始化 -> init 2

4 默認參數替代次構造方法

Kotlin 支持構造函數參數默認值,可減少構造函數的數量:

class User(val name: String,val age: Int = 0, // 默認參數val country: String = "Unknown"
)fun main() {val user1 = User("Eileen")val user2 = User("Eileen", 34)val user3 = User("Eileen", 34, "China")
}

Java 互操作性:如果需要在 Java 中調用帶默認參數的構造方法,需添加 @JvmOverloads 注解:

class Person @JvmOverloads constructor(val name: String,val age: Int = 0,val country: String = "Unknown"
)

5 繼承中的構造方法

5.1 子類必須初始化父類構造方法

子類的主構造方法需初始化父類的主構造方法:

open class User(val name: String)class Student(name: String) : User(name)

如果父類只有次構造方法(無主類構造方法),子類需通過 super 調用父類的某個次構造方法:

open class User {constructor(name: String) {}
}class Student : User {constructor(name: String) : super(name)
}
5.2 抽象類的構造方法

抽象類的構造函數可由子類實現:

abstract class User(val name: String)class Student(name: String, val age: Int) : User(name)

6 數據類中的構造方法

數據類的主構造方法必須至少有一個參數,且所有的參數必須標記為 valvar

數據類的主構造方法

7 總結

場景注意事項
主構造方法參數可聲明為屬性,初始化順序嚴格,支持默認參數替代次構造方法
次構造方法必須委托主構造方法,代碼體在類初始化后執行
繼承子類必須初始化父類構造方法,優先使用主構造方法
默認參數替代次構造方法,需要 @JvmOverloads 支持 Java 調用
初始化順序init 塊和屬性初始化按照代碼順序執行,次構造方法體最后執行

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81926.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81926.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81926.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

年會招標抽獎活動軟件———仙盟創夢IDE

年會是企業一年的總結與歡慶時刻,而抽獎環節更是點燃全場氣氛的關鍵。如何讓抽獎環節既大氣又充滿儀式感?選對抽獎軟件至關重要!本文精心挑選了 3 款兼具實用性與氛圍感的年會抽獎軟件,從界面設計到功能特色,全方位為你…

安全軟件檢測進程異常行為-Postgresql應用執行異常指令whoami

文章目錄 環境癥狀問題原因解決方案 環境 系統平臺:UOS(海光) 版本:4.5.8 癥狀 數據庫安裝包: 安全軟件告警中提示“sh -c whoami”命令,是由數據庫發出的,安全軟件捕獲到了postgres.exe–fo…

車載診斷架構 --- LIN 節點 ECU 故障設計原則

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 鈍感力的“鈍”,不是木訥、遲鈍,而是直面困境的韌勁和耐力,是面對外界噪音的通透淡然。 生活中有兩種人,一種人格外在意別人的眼光;另一種人無論…

GPU加速的AlphaFold3蛋白質復合體預測:如何在64GB顯存下跑超大規模模型(混合精度+模型并行實戰技巧)

一、AlphaFold3的超大規模挑戰與優化方向 AlphaFold3作為當前生物計算領域的革命性工具,其核心架構基于擴散模型,能夠預測包含蛋白質、核酸、小分子配體等復雜生物復合物的三維結構。然而,模型參數量級(典型配置超百億級&#xf…

Qt功能區:Ribbon控件

控件 1. 按鈕1.1 多選按鈕1.2 2. 下拉列表框SARibbonComboBox2.1 簡介2.2 代碼實現 1. 按鈕 1.1 多選按鈕 軟件功能:用于實現Category的名稱居中。 SARibbonCheckBox繼承于QCheckBox,使用方法完全相同。 SARibbonCheckBox* checkBox new SARibbonChe…

一個由微軟開源的 Python 工具,用于將多種文件格式轉換為 Markdown 格式

📚 Markitdown 由微軟開源的 Python 工具,用于將多種文件格式轉換為 Markdown 格式 支持:PDF、PowerPoint、Word、Excel、圖像、音頻、HTML、文本格式(CSV、JSON、XML)、ZIP 文件的轉換。 它旨在提供一個簡單且靈活的…

Linux的進程概念

目錄 1、馮諾依曼體系結構 2、操作系統(Operating System) 2.1 基本概念 2.2 目的 3、Linux的進程 3.1 基本概念 3.1.1 PCB 3.1.2 struct task_struct 3.1.3 進程的定義 3.2 基本操作 3.2.1 查看進程 3.2.2 初識fork 3.3 進程狀態 3.3.1 操作系統的進程狀態 3.3…

export和import的書寫方式

一、導出模塊(export) 1. 命名導出(Named Exports) // math.js export const PI 3.14159; // 導出單個常量 export function sum(a, b) { return a b; } // 導出單個函數 export class Calculator { /* ..…

HOW - 結合 AI 進行 Tailwind 樣式開發

文章目錄 情況 1:使用 Tailwind CSS 與手寫傳統 CSS 的開發效率對比情況 2:AI Tailwind 自動生成 UI 的效率如何?總結 在 WHAT - Tailwind 樣式方案(不寫任何自定義樣式) 中我們已經簡單介紹過 Tailwind。今天主要認識…

java面試每日一背 day1

1.什么是緩存穿透 緩存穿透是指查詢一個數據庫中根本不存在的數據,導致這個查詢請求繞過緩存直接訪問數據庫的情況。這種情況如果頻繁發生,會對數據庫造成不必要的壓力。 典型特征: (1)查詢的數據在數據庫和緩存中都…

ngx_http_realip_module 模塊概述

一、使用場景 日志記錄 記錄真實客戶端 IP 而非反向代理的 IP,有助于流量分析和安全審計。訪問控制 基于真實 IP 實現防火墻規則(allow/deny)或限流,而非誤將上游 IP 視為客戶端。GeoIP、WAF、限速等功能 模塊化的上游真實 IP 支…

實戰5:個性化數字藝術生成與銷售

盈利思路 數字藝術銷售: 平臺銷售:將生成的數字藝術作品上傳到像OpenSea、Foundation等NFT平臺進行售賣。每一件獨特的藝術品可以通過NFT技術保證其唯一性,吸引收藏家和投資者。 定價策略:根據作品的復雜度、創意性以及市場需求來…

游戲引擎學習第303天:嘗試分開對Y軸和Z軸進行排序

成為我們自己的代碼精靈α 所以現在應該可以正常使用了。不過,這兩周我們沒辦法繼續處理代碼里的問題,而之前留在代碼里的那個問題依然存在,沒有人神奇地幫我們修復,這讓人挺無奈的。其實我們都希望有個神奇的“代碼仙子”&#…

InetAddress 類詳解

InetAddress 類詳解 一、核心作用 封裝 IP 地址:同時支持 IPv4 和 IPv6 地址域名解析:將域名轉換為 IP 地址(DNS 查詢)地址驗證:檢查網絡地址的有效性無構造方法:通過靜態工廠方法獲取實例 二、核心方法 …

spring cloud alibaba-Geteway詳解

spring cloud alibaba-Gateway詳解 Gateway介紹 在 Spring Cloud Alibaba 生態系統中,Gateway 是一個非常重要的組件,用于構建微服務架構中的網關服務。它基于 Spring Cloud Gateway 進行擴展和優化,提供了更強大的功能和更好的性能。 Gat…

iOS 直播技術及優化

iOS直播技術的實現和優化涉及多個技術環節,需結合協議選擇、編解碼方案、播放器技術及性能調優等多方面。 一、核心技術實現 協議選擇與傳輸優化 HLS(HTTP Live Streaming):蘋果官方推薦,基于HTTP分片傳輸&#xff0c…

目標檢測135個前沿算法模型匯總(附源碼)!

目標檢測是計算機視覺核心方向之一,也是發論文的熱門領域! 近來不僅YOLO算法迎來了新突破,迭代出YOLOv12!Mamba、大模型等新技術的發展,也給該領域注入了全新的力量,取得了諸多顯著成果。比如性能飆升82.3…

期刊采編系統安裝升級錯誤

我們以ojs系統為例: PHP Fatal error: Uncaught Error: Call to a member function getId() on null in /esci/data/html/classes/install/Upgrade.inc.php:1019 Stacktrace: #0 /esci/data/html/lib/pkp/classes/install/Installer.inc.php(415): Upgrade->con…

淺談無服務器WebSocket的優勢

實際上,一個實用的解決方案是將構建業務關鍵型實時平臺的復雜性卸載到專門的云服務中。 完全托管的無服務器 WebSocket 解決方案為事件驅動的消息傳遞提供了基礎結構;它使底層基礎設施成為一種商品。客戶端使用提供程序服務發送/接收低延遲消息,并專注于…

Python數據可視化高級實戰之二——熱力圖繪制探究

目錄 一、熱力圖的作用 二、熱力圖反映的信息類型 三、熱力圖的典型應用場景 1. 地球信息系統 (GIS) 2. 城市交通分析 3. 市場分析 4. 用戶行為分析 5. 網絡流量分析 6. 傳染病傳播分析 7. 社交媒體輿情分析 四、Python 繪制熱力圖的關鍵技術要點 1. 數據預處理 2. 顏色選擇與漸…