Kotlin-特殊類型

文章目錄

  • 數據類型
  • 枚舉類型
  • 匿名類和伴生對象
    • 單例類
    • 伴生對象

數據類型

聲明一個數據類非常簡單:

//在class前面添加data關鍵字表示為一個數據類
data class Student(var name: String, var age: Int)

數據類聲明后,編譯器會根據主構造函數中聲明的所有屬性自動為其生成以下函數:

  • .equals() / .hashCode()
  • .toString()
  • .componentN() 按聲明順序自動生成用于解構的函數
  • .copy()用于對對象進行拷貝

舉個栗子:

data class Student(var name: String, var age: Int)fun main() {val student1 = Student("小明", 18)val student2 = Student("小明", 18)println(student1==student2)println(student1)val (name, age) = student1println("$name, $age")
}

在這里插入圖片描述
為了確保生成代碼的一致性和有效性,數據類必須滿足以下要求:

  • 主構造函數中至少有一個參數
  • 主構造函數中的參數必須標記為valvar
  • 數據類不能是抽象的,可繼承的,密封的或內部的

此外,數據類的成員屬性生成遵循以下規則:

  • 如果數據類主體中,.equals() .hashCode().toString()等函數存在顯式(手動)實現,或者在父類中有final實現,則不會自動生成這些函數
data class Student(var name: String, var age: Int) {override fun toString(): String = "我是自定義的toString"
}fun main() {val student = Student("小明", 18)println(student)
}

在這里插入圖片描述
如果父類具有open operator fun componentN()函數并返回兼容類型,數據類會生成相應的函數,并覆蓋父類的函數,如果由于關鍵字導致無法重寫父類對應的函數會直接導致報錯

在這里插入圖片描述

open class Person {//此函數必須是open的,否則無法被數據類繼承open operator fun component1() = "我想當太空人"
}//自動覆蓋父類的component1函數
data class Student(var name: String, var age: Int): Person() fun main() {val (name, age) = Student("小明", 18)println("$name, $age")
}

在這里插入圖片描述

  • 不允許為.componentN().copy()函數提供顯式實現

在這里插入圖片描述
注意,編譯器只會根據主構造函數中定義的屬性生成對應函數,如果我們不希望某些屬性被添加到自動生成的函數中,我們需要手動將其移出主構造函數:

data class Student(var name: String) {var age: Int = 0 //age屬性不會被處理
}fun main() {val student1 = Student("小明")val student2 = Student("小明")student1.age = 17student2.age = 18println(student1==student2)println(student1)
}

在這里插入圖片描述
數據類自帶一個拷貝對象的函數,使用.copy()函數復制對象

data class Student(var name: String, var age: Int)fun main() {val student = Student("小明", 18)val copyStudent = student.copy()println(student==copyStudent)println(student===copyStudent)
}

在這里插入圖片描述
還允許修改一些屬性,而其余保持不變

data class Student(var name: String, var age: Int)fun main() {val student = Student("小明", 18)val copyStudent = student.copy(age = 17)println(copyStudent)
}

在這里插入圖片描述

枚舉類型

如果我們想要存儲和表示自定義的多種狀態,可以使用枚舉類型

//在類前面添加enum表示枚舉類
enum class TrafficLight {RED, YELLOW, GREEN
}fun main() {val light: TrafficLight = TrafficLight.REDprintln(light)println(light.name) //name屬性是String類型println(light.ordinal)println(TrafficLight.RED.ordinal)println(TrafficLight.YELLOW.ordinal)println(TrafficLight.GREEN.ordinal)
}

在這里插入圖片描述

枚舉也可以具有成員,但不能命名為name,因為name用來返回枚舉名稱了

enum class TrafficLight(var type: String) {//枚舉在定義時必須填寫參數,如果后面還要編寫函數之類的其他內容,需在末尾添加;RED("紅燈"), YELLOW("黃燈"), GREEN("綠燈");fun isGreen() = this == GREENfun test() = println("我是$type")
}fun main() {val light: TrafficLight = TrafficLight.REDprintln(light.type)println(light.isGreen())light.test()
}

在這里插入圖片描述

枚舉類型可以用于 when 表達式進行判斷,因為它的狀態是有限的

enum class TrafficLight(var type: String) {//枚舉在定義時必須填寫參數,如果后面還要編寫函數之類的其他內容,需在末尾添加;RED("紅燈"), YELLOW("黃燈"), GREEN("綠燈");
}fun main() {val light: TrafficLight = TrafficLight.REDval result: String = when (light) {TrafficLight.RED -> "禁止通行"TrafficLight.YELLOW -> "減速通行/準備停下"TrafficLight.GREEN -> "正常通行"}println(result)
}

在這里插入圖片描述
在枚舉類中也可以編寫抽象函數,但需要枚舉自行實現

enum class TrafficLight(var type: String) {RED("紅燈") {override fun test() = println("我是紅燈, 禁止通行")}, YELLOW("黃燈") {override fun test() = println("我是黃燈, 是讓你減速, 不是踩油門沖過去")}, GREEN("綠燈") {override fun test() = println("我是綠燈, 速速離去")};abstract fun test()
}fun main() {val light: TrafficLight = TrafficLight.REDlight.test()
}

在這里插入圖片描述

如果枚舉實現了某個接口,既可以成員實現也可以統一實現

interface Message {fun test()
}enum class TrafficLight(var type: String): Message {RED("紅燈") {override fun test() = println("我是紅燈, 禁止通行")}, YELLOW("黃燈") {override fun test() = println("我是黃燈, 是讓你減速, 不是踩油門沖過去")}, GREEN("綠燈") {override fun test() = println("我是綠燈, 速速離去")};
}
enum class TrafficLight(var type: String): Message {RED("紅燈"), YELLOW("黃燈"), GREEN("綠燈");override fun test() = println("回家收衣服咯")
}

匿名類和伴生對象

fun main() {val obj = object { //使用object關鍵字聲明一個匿名類并創建對象val name = "張三"override fun toString() = "我是匿名類, name: $name"}println(obj)
}

在這里插入圖片描述
匿名類雖然沒名字,也可以定義成員,不過不能定義任何構造函數

匿名類也可以作為某個類的子類定義,或是某個接口的實現

interface Person {fun chat()
}fun main() {val obj: Person = object: Person {override fun chat() = println("以心為鞘,以養利劍")}obj.chat()
}

在這里插入圖片描述

open class Human(val name: String)fun main() {val obj: Human = object: Human("蕭炎") {override fun toString() = "我是$name"}println(obj)
}

在這里插入圖片描述

單例類

object關鍵字除了用于聲明匿名類型,也可以用于聲明單例類(整個程序中只能存在一個對象)

object Singleton {private val name = "超人強"override fun toString(): String = "我叫$name"
}fun main() {val singleton = Singleton //不能通過構造函數創建對象,通過類名直接得到此單例類的對象println(singleton)
}

在這里插入圖片描述

object Singleton {fun test() = println("原神,啟動!")
}fun main() {Singleton.test() //單例定義的函數使用類名直接就能調用
}

在這里插入圖片描述

伴生對象

實際上就是將一個單例類寫到某個類內部

class Student(val name: String, val age: Int) {//使用companion關鍵字在內部編寫一個伴生對象,它同樣是單例的companion object Tools {//伴生對象定義的函數可以直接通過外部類名調用fun create(name: String, age: Int) = Student(name, age)}
}fun main() {Student.create("小明", 18)Student("小紅", 19) //使用構造方法
}

伴生對象在類加載的時候就自動創建好了

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

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

相關文章

在線博客系統【測試報告】

🕒 一. 項目背景 由于紙質筆記容易丟失,攜帶不變,為了方便自己學習的過程中記錄筆記,特開發了這個博客系統。這個系統后端采用 SpringBoot MyBatis SpringMVC ;前端使用Html CSS JS;數據庫使用的是Mysq…

每日刷題c++

快速冪 #include <iostream> using namespace std; #define int long long int power(int a, int b, int p) {int ans 1;while (b){if (b % 2){ans * a;ans % p; // 隨時取模}a * a;a % p; // 隨時取模b / 2;}return ans; } signed main() {int a, b, p;cin >> a …

Python中的變量、賦值及函數的參數傳遞概要

Python中的變量、賦值及函數的參數傳遞概要 python中的變量、賦值 python中的變量不是盒子。 python中的變量無法用“變量是盒子”做解釋。圖說明了在 Python 中為什么不能使用盒子比喻&#xff0c;而便利貼則指出了變量的正確工作方式。 如果把變量想象為盒子&#xff0c;那…

KVM 安裝 Ubuntu 22

在 KVM 中安裝 Ubuntu 22 虛擬機。 首先創建硬盤文件 sudo qemu-img create -f qcow2 /app/vms/ubuntu22.qcow2 100G安裝Ubuntu 22 sudo virt-install \--name ubuntu22 \--ram 4096 \--vcpus 2 \--disk path/app/vms/ubuntu22.qcow2,formatqcow2 \--os-type linux \--os-va…

基于生產-消費模式,使用Channel進行文件傳輸(Tcp方式)

Client端&#xff1a; #region 多文件傳輸 public class FileMetadata {public string FileName { get; set; }public long FileSize { get; set; } }class Program {const int PORT 8888;const int BUFFER_SIZE 60 * 1024 * 1024;//15s-50 25s-64 33s-32 27s-50 31s-40 25…

【后端高階面經:Elasticsearch篇】39、Elasticsearch 查詢性能優化:分頁、冷熱分離與 JVM 調優

一、索引設計優化:構建高效查詢的基石 (一)分片與副本的黃金配置 1. 分片數量計算模型 # 分片數計算公式(單分片建議30-50GB) def calculate_shards(total_data_gb, single_shard_gb=30):return max

學習路之PHP--easyswoole3.3安裝入門

學習路之PHP--easyswoole安裝入門 一、安裝swoole擴展二、安裝easyswoole三、指定PHP版本安裝四、啟動swoole五、EasySwoole的入門學習如果報&#xff1a;not controller class match 六、學習推薦&#xff1a; 0、centos 7、php7.2.33、easyswoole 3.3 一、安裝swoole擴展 二、…

Ad Hoc

什么是 Ad Hoc&#xff1f; Ad hoc 一詞源于拉丁語&#xff0c;意為“為此目的”或“為此特定原因”。一般來講&#xff0c;它指的是為解決某一特定問題或任務&#xff08;而非為了廣泛重復應用&#xff09;而設計的行動、解決方案或組合。在加密貨幣和區塊鏈領域&#xff0c;…

Lines of Thought in Large Language Models

Lines of Thought in Large Language Models 《Lines of Thought in Large Language Models》(大語言模型中的思維鏈)聚焦于分析大語言模型(LLMs)在生成文本時,其內部向量軌跡的統計特性。 核心目標是揭示LLMs復雜的“思維過程”(即文本生成時的隱藏狀態變化)能否被簡…

npm/yarn/pnpm安裝時Sharp模塊報錯解決方法

在安裝依賴模塊時&#xff0c;npm/yarn/pnpm安裝時Sharp模塊報錯解決方法。 打開源代碼發現&#xff1a;使用的下載地址是github地址&#xff0c;就是因為國內經常無法訪問github造成的。 解決辦法&#xff1a; 把涉及到的下載包設置不要從github上下載&#xff0c;設置成淘寶…

基于CEEMDAN-Transformer-BiLSTM的多特征風速氣候預測的完整實現方案及PyTorch源碼解析

基于CEEMDAN-Transformer-BiLSTM的多特征風速氣候預測的完整實現方案及PyTorch源碼解析 一、模型架構設計 1.1 整體框架 該模型采用三級架構設計&#xff08;圖1&#xff09;&#xff1a; CEEMDAN分解層&#xff1a;對非平穩風速序列進行自適應分解多模態特征融合模塊&#…

ubuntu24.04啟用fcitx 5

在ubuntu24.04中啟用fcitx 5 ubuntu24.04系統自帶三種鍵盤輸入法系統&#xff1a; IBusFcitx 5XIM 系統默認使用的是IBus,這個拼音輸入少了一些智能的味道&#xff0c;比較影響輸入體驗。換用Fcitx 5后&#xff0c;加上搜狗細胞詞庫&#xff0c;感覺很絲滑&#xff0c;特記錄…

【HTML/CSS面經】

HTML/CSS面經 HTML1. script標簽中的async和defer的區別2. H5新特性&#xff08;1 標簽語義化&#xff08;2 表單功能增強&#xff08;3 音頻和視頻標簽&#xff08;4 canvas和svg繪畫&#xff08;5 地理位置獲取&#xff08;6 元素拖動API&#xff08;7 Web Worker&#xff08…

Dolphin文檔解析從理論到實踐——保姆級教程

論文&#xff1a;https://arxiv.org/abs/2505.14059 代碼&#xff1a;github.com/bytedance/Dolphin 2025年5月&#xff0c;字節開源了文檔解析Dolphin&#xff0c;讓文檔解析效率提升83%。本文將深入解析字節跳動最新開源的Dolphin模型&#xff0c;先看理論再實戰體驗。 現實…

Web3怎么本地測試連接以太坊?

ETHEREUM_RPC_URLhttps://sepolia.infura.io/v3/你的_INFURA_API_KEY 如果你沒有 Infura Key&#xff0c;注冊 Infura 或 Alchemy&#xff0c;拿一個免費測試網節點就行&#xff1a; Infura&#xff1a;https://infura.io Alchemy&#xff1a;Alchemy - the web3 developme…

深化生態協同,寧盾身份域管完成與拓波軟件兼容互認證

在信創產業蓬勃發展的浪潮下&#xff0c;行業生態的兼容適配決定了信創產品是否好用。近日&#xff0c;寧盾身份域管與拓波軟件 TurboEX 郵件系統完成兼容互認證。測試結果顯示寧盾身份域管&#xff08;信創版&#xff09;與 TurboEX 郵件服務器軟件相互良好兼容&#xff0c;運…

HDFS存儲原理與MapReduce計算模型

HDFS存儲原理 1. 架構設計 主從架構&#xff1a;包含一個NameNode&#xff08;主節點&#xff09;和多個DataNode&#xff08;從節點&#xff09;。 NameNode&#xff1a;管理元數據&#xff08;文件目錄結構、文件塊映射、塊位置信息&#xff09;&#xff0c;不存儲實際數據…

Function calling的過程

文章目錄 逐段講清 **LLM Function Calling&#xff08;函數調用&#xff09;** 的典型鏈路。1. 角色與概念 | Actors & Concepts2. 全流程時序 | End-to-End Sequence3. 關鍵細節 | Key Implementation Notes4. 最小可用示例&#xff08;偽代碼&#xff09; | Minimal Exa…

GlobalExceptionHandler 自定義異常類 + 處理validation的異常

在 Spring Boot 項目中&#xff0c;?自定義異常通常用于處理特定的業務邏輯錯誤&#xff0c;并結合全局異常處理器&#xff08;ControllerAdvice&#xff09;統一返回結構化的錯誤信息。 一.全局異常處理器&#xff1a; 1. 自定義異常類? 定義一個繼承自 RuntimeExceptio…

軟件測試過程中如何定位BUG

在軟件測試過程中&#xff0c;定位BUG是確保軟件質量的關鍵環節。有效的BUG定位不僅能幫助開發人員快速修復問題&#xff0c;還能提升整個軟件項目的效率。以下是軟件測試中定位BUG的系統性方法和策略&#xff1a; 一、復現BUG 步驟&#xff1a; 收集信息&#xff1a;記錄BUG…