Kotlin基礎語法五

  • 繼承與重載的open關鍵字
    KT所有的類,默認是final修飾的,不能被繼承,和Java相反
    open:移除final修飾

  • 類型轉換

open class Person2(private val name: String) {fun showName() = "父類 的姓名是【$name】"// KT所有的函數,默認是final修飾的,不能被重寫,和Java相反open fun myPrintln() = println(showName())
}class Student2(private val subName: String) : Person2(subName) {fun showName2() = "子類 的姓名是【${subName}】"override fun myPrintln() = println(showName2())}// TODO 84.Kotlin語言的類型轉換學習
// 1.普通運行子類輸出
// 2.is Person Student File
// 3.is + as 轉換
fun main() {val p: Person2 = Student2("王五")p.myPrintln()println(p is Person2)println(p is Student2)println(p is File)// is + as = 一般是配合一起使用if (p is Student2) {(p as Student2).myPrintln()}if (p is Person2) {// (p as Person2).myPrintln() // 因為子類重寫了父類println((p as Person2).showName())}
}
  • 智能類型轉換
open class Person3(val name: String) {private fun showName() = "父類顯示:$name"open fun myPrintln() = println(showName())fun methodPerson() = println("我是父類的方法...") // 父類獨有的函數
}class Student3(val nameSub: String) : Person3 (nameSub) {override fun myPrintln() = println("子類顯示:$nameSub")fun methodStudent() = println("我是子類的方法...") // 子類獨有的函數
}fun main() {val p : Person3 = Student3("李四")(p as Student3).methodStudent()p.methodStudent()// 智能類型轉換:會根據上面 as 轉成的類型,自動明白,你現在的類型就是上面的類型
}
  • Any超類
    所有的類都默認繼承Any超類,等于Java的Object

  • 對象聲明 object

  • 對象表達式

interface RunnableKT {fun run()
}open class KtBase88 {open fun add(info: String) = println("KtBase88 add:$info")open fun del(info: String) = println("KtBase88 del:$info")
}// 1.add del println
// 2.匿名對象表達式方式
// 3.具名實現方式
// 4.對Java的接口 用對象表達式方式
fun main() {// 匿名對象 表達式方式val p : KtBase88 = object : KtBase88() {override fun add(info: String) {// super.add(info)println("我是匿名對象 add:$info")}override fun del(info: String) {// super.del(info)println("我是匿名對象 del:$info")}}p.add("李元霸")p.del("李連杰")// 具名實現方式val p2 = KtBase88Impl()p2.add("劉一")p2.del("劉二")// 對Java的接口 用   KT[對象表達式方式]  方式一val p3 = object : Runnable {override fun run() {println("Runnable run ...")}}p3.run()// 對Java的接口 用   Java最簡潔的方式 方式二val p4 = Runnable {println("Runnable run2 ...")}p4.run()// 對KT的接口 用   KT[對象表達式方式]  方式一object : RunnableKT {override fun run() {println("RunnableKT 方式一 run ...")}}.run()// 對KT的接口 用   Java最簡潔的方式 方式二/*RunnableKT {}*/
}// 小結:Java接口,有兩種方式 1(object : 對象表達式)  2簡潔版,
//       KT接口,只有一種方式 1(object : 對象表達式)// 具名實現  具體名字 == KtBase88Impl
class KtBase88Impl : KtBase88() {override fun add(info: String) {// super.add(info)println("我是具名對象 add:$info")}override fun del(info: String) {// super.del(info)println("我是具名對象 del:$info")}
}
  • 伴生對象
// 伴生對象的由來: 在KT中是沒有Java的這種static靜態,伴生很大程度上和Java的這種static靜態 差不多的
// 無論 KtBase89() 構建對象多少次,我們的伴生對象,只有一次加載
// 無論 KtBase89.showInfo() 調用多少次,我們的伴生對象,只有一次加載
// 伴生對象只會初始化一次companion object {val info = "UserInfo"fun showInfo() = println("顯示:$info")val name = "Derry"}
  • 內部類 & 嵌套類
// TODO 內部類
// 內部類的特點: 內部的類 能訪問 外部的類
//              外部的類 能訪問 內部的類
class Body(_bodyInfo: String) { // 身體類val bodyInfo = _bodyInfofun show() {Heart().run()}// 默認情況下:內部的類 不能訪問 外部的類,要增加修飾符inner 成為內部類才可以訪問外部類inner class Heart { // 心臟類fun run() = println("心臟訪問身體信息:$bodyInfo")}inner class Kidney { // 腎臟fun work() = println("腎臟訪問身體信息:$bodyInfo")}inner class Hand { // 手inner class LeftHand { // 左手fun run() = println("左手訪問身體信息:$bodyInfo")}inner class RightHand { // 右手fun run() = println("右手訪問身體信息:$bodyInfo")}}
}// 默認情況下:就是嵌套類關系
// 嵌套類特點:外部的類 能訪問 內部的嵌套類
//           內部的類 不能訪問 外部類的成員
class Outer {val info: String  = "OK"fun show() {Nested().output()}class Nested {fun output() = println("嵌套類")}
}fun main() {// 內部類:Body("isOK").Heart().run()Body("isOK").Hand().LeftHand().run()Body("isOK").Hand().RightHand().run()// 嵌套類:Outer.Nested().output()}
  • 數據類
// set get 構造函數 解構操作 copy toString hashCode equals  數據類 生成 更豐富
data class ResponseResultBean2(var msg: String, var code: Int, var data: String) : Any()
  • copy
//  深拷貝 重新創建對象
data class User(val name: String)
val a = User("Alice")
val b = a.copy()
println(a === b) // 輸出 false//淺拷貝 復用同一個對象
data class Book(val title: String)
data class User(val name: String, val book: Book)val u1 = User("Bob", Book("Kotlin"))
val u2 = u1.copy(name = "Alice")
u2.book.title = "Java" // 會同時修改u1.book
  • 解構聲明
// 普通類
class Student1(var name: String , var age: Int, var sex: Char) {// 注意事項:component0 順序必須是 component1 component2 component3 和成員一一對應,順序下來的operator fun component1() = nameoperator fun component2() = ageoperator fun component3() = sex
}// 數據類
data class Student2Data(var name: String , var age: Int, var sex: Char)fun main() {val(name, age, sex) = Student1("李四", 89, '男')println("普通類 結構后:name:$name, age:$age, sex:$sex")val(name1, age1, sex1) = Student2Data("李四", 89, '男')println("數據類 結構后:name:$name1, age:$age1, sex:$sex1")val(_, age2, _) = Student1("李四", 89, '男')println("數據類 結構后: age2:$age2")
}
  • 運算符重載
// 寫一個數據類,就是為了,toString 打印方便而已哦
data class AddClass2(var number1: Int, var number2: Int) {operator fun plus(p1: AddClass2) : Int {return (number1 + p1.number1) + (number2 + p1.number2)}
}// TODO 94-Kotlin語言的運算符重載學習
fun main() {// C++語言  +運算符重載就行了  -運算符重載就行了// KT語言  plus代表+運算符重載println(AddClass2(1, 1) + AddClass2(2, 2))
}
  • 密封類
    ?1. 替代枚舉(Enum),但支持更靈活的數據類型?
    ?枚舉的局限性?:每個枚舉值只能是單例,不能攜帶不同的數據。
    ?密封類的優勢?:每個子類可以有自己的屬性和方法,且可以是object(單例)或data class(帶數據)。
sealed class PaymentMethod {data class CreditCard(val cardNumber: String, val expiryDate: String) : PaymentMethod()data class PayPal(val email: String) : PaymentMethod()object Cash : PaymentMethod()
}

?2. 結合 when 表達式,實現編譯期安全檢查?

sealed class ApiResult {data class Success(val data: String) : ApiResult()data class Error(val message: String, val code: Int) : ApiResult()
}fun handleResult(result: ApiResult) = when (result) {is ApiResult.Success -> println("成功: ${result.data}")is ApiResult.Error -> println("錯誤: ${result.message} (${result.code})")// 不需要 else,編譯器確保所有情況已覆蓋
}
  1. 適用于狀態管理(如 UI 狀態、業務邏輯狀態)?
sealed class UiState {object Loading : UiState()data class Success(val data: List<String>) : UiState()data class Error(val message: String) : UiState()
}fun updateUI(state: UiState) = when (state) {is UiState.Loading -> showProgressBar()is UiState.Success -> showData(state.data)is UiState.Error -> showError(state.message)
}

?4. 替代 when + else 的防御性編程?

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

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

相關文章

MySQL數據庫:關系型數據庫的基石

文章目錄 每日一句正能量前言一、MySQL簡介&#xff08;一&#xff09;什么是MySQL&#xff1f;&#xff08;二&#xff09;MySQL的歷史 二、MySQL的特點&#xff08;一&#xff09;開源與免費&#xff08;二&#xff09;高性能&#xff08;三&#xff09;跨平臺支持&#xff0…

【kafka】Golang實現分布式Masscan任務調度系統

要求: 輸出兩個程序,一個命令行程序(命令行參數用flag)和一個服務端程序。 命令行程序支持通過命令行參數配置下發IP或IP段、端口、掃描帶寬,然后將消息推送到kafka里面。 服務端程序: 從kafka消費者接收掃描任務信息通過調用masscan啟動探測任務,獲取進度和結果信息,…

ARM 和 x86_64是什么關系

什么是 ARM 和 x86_64&#xff1f; 它們都是 CPU 指令集架構&#xff08;ISA&#xff09; 指令集架構&#xff08;Instruction Set Architecture&#xff09;就是&#xff1a; CPU 能夠理解和執行的“語言”和“命令格式”。 類比解釋&#xff1a;指令集就像“語言” 類比對…

nginx配置中有無‘‘/’’的區別

在Nginx配置中&#xff0c;location指令末尾的斜杠/和proxy_pass目標地址末尾的斜杠/組合使用會產生顯著差異。以下是四種組合的區別詳解&#xff1a; ??核心區別對比表?? 配置方案匹配規則請求URI傳遞邏輯實際轉發效果示例location /api/ proxy_pass ...701/僅匹配/api/…

系統安全之身份認證

本篇我們對常用的身份認證協議做簡要的梳理&#xff0c;包括主流的 HTTP 相關認證協議以及證書密鑰對、新興的 WebAuthn 認證。 HTTP 協議認證 RFC 7235 中定義了 HTTP 協議的認證框架&#xff0c;要求在支持 HTTP 協議的服務器&#xff0c;如果訪問服務的身份驗證失敗&#…

部署http服務

使用flask搭建一個http服務&#xff0c;能夠通過本地的另外一個終端訪問對應接口&#xff0c;拿到服務端的計算結果 服務端&#xff1a; 創建一個test_http_dtw.py并運行 from flask import Flask, request, jsonifyapp Flask(__name__)# 示例分析函數 def analysis(data):…

WLAN 技術指南:從入門到原理

文章目錄 目錄 文章目錄 前言 一.WLAN 基本概念 有線側組網概念 AP-AC 組網方式 AC 連接方式 CAPWAP 協議 無線側組網概念 無線信道 ?編輯 BSS/SSID/BSSID ?編輯 VAP ESS 二.WLAN 組網架構 基本的 WLAN 組網架構 四.WLAN 工作原理 AP 上線 AP 獲取 IP 地址階段 CAP…

語言學習專用AI播放器推薦:LLPlayer

學語言&#xff0c;經常會看大量的比較優秀的視頻材料&#xff0c;那么推薦一款語言學習利器&#xff0c;極大提高生產力。 LLPlayer 是一款專為語言學習者設計的獨特視頻播放器。 它具有許多重要功能&#xff0c;例如可同時顯示文本字幕和位圖字幕、使用 OpenAI Whisper 自動…

mysql 關聯表查詢,索引失效

來源表: ##示例 CREATE TABLE order_wide (order_id varchar(33) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 訂單ID,member_id int(11) DEFAULT NULL COMMENT 用戶ID,content varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 訂單標簽,PRIMARY KEY (order_…

Oracle DG庫手動注冊歸檔日志的兩種方法

Oracle DG庫手動注冊歸檔日志的兩種方法 注冊單個歸檔日志文件注冊多個歸檔日志文件有的時候由于網絡或各種原因,Oracle DG庫服務器上可能缺少部分歸檔日志文件,導致DG庫的MRP進程一直處于WAIT_FOR_GAP狀態。 此時我們可以手動從主庫或其他DG拷貝歸檔日志到當前DG服務器,并…

中小型VUE3項目創建流程相關命令tips

開新項目因為距離上次初始化時間太過久遠,忘記初始化命令的有多少? 不得已簡要記錄一下流程 1. 使用vite構建新項目 1.1 構建 npm create vite@latest my-vue-app --template vue1.2 安裝依賴 npm install1.3 啟動 npm run dev參考文檔 2. 添加需要的插件 2.1 準備工作…

Web后端開發(請求、響應)

目錄 請求&#xff1a; Postman&#xff1a; 簡單參數&#xff1a; 實體參數&#xff1a; 數組集合參數&#xff1a; 日期參數&#xff1a; Json參數&#xff1a; 路徑參數&#xff1a; 響應&#xff1a; 請求響應&#xff1a; 請求&#xff1a;獲取請求數據 響應&a…

Excel大廠自動化報表實戰(互聯網金融-數據分析周報制作上)

這是Excel大廠自動化報表實戰第二期--互聯網金融-數據分析周報制作上 數據資源已經與這篇博客捆綁&#xff0c;有需要者可以下載通過網盤分享的文件&#xff1a;2.4自動化報表-8月成交數據.xlsx&#xff0c;2.4自動化報表-8月獲客數據.csv等2個文件 鏈接: https://pan.baidu.co…

HTTP 網絡協議演進過程

網絡協議演進問題&#xff0c;涉及到HTTP版本之間的連接復用優化和協議升級&#xff08;特別是從HTTP/2到HTTP/3&#xff09;的核心變化。我們以 HTTP/1.0 到 HTTP/2.0&#xff0c;再到 HTTP/3.0 的演進順序來詳細解釋它們在通道復用&#xff08;TCP/QUIC&#xff09;上的優化和…

Xsens動捕和Manus數據手套在元宇宙數字人制作中提供解決方案

硬件連接與數據傳輸 Xsens與Manus集成&#xff1a;Xsens慣性動作捕捉系統負責捕捉人體的身體動作&#xff0c;Manus數據手套專門精確捕捉手指動作。Xsens動捕套裝上有接口或無線連接模塊&#xff0c;可與Manus手套配對和傳輸數據&#xff0c;將身體與手指跟蹤數據結合。 Face…

【Java開發日記】簡單說一說使用 Netty 進行 Socket 編程

目錄 什么是 Netty 對比Netty和傳統的Socket 傳統Socket編程服務端 傳統Socket編程客戶端 Netty環境搭建 先創建出來一個項目 Netty服務端程序 Netty客戶端程序 Channel Channel分類 為什么選擇Netty 什么是 Netty Netty是由JBOSS提供的一個java開源框架&#xff0c…

目標檢測任務的評估指標mAP50和mAP50-95

mAP50 和 mAP50-95 是目標檢測任務中常用的評估指標&#xff0c;用于衡量模型在不同 交并比&#xff08;IoU&#xff09;閾值 下的平均精度&#xff08;Average Precision, AP&#xff09;。它們的區別主要體現在 IoU 閾值范圍 上。 ? 1. mAP50&#xff08;mean Average Prec…

COHERENT XPRV23光電接收器控制軟件

COHERENT XPRV23光電接收器控制軟件

執行應用共享內存空間 同步QT進行快速捕獲數據流

引言&#xff1a;本文章針對驅動的應用app&#xff0c;例如sensor data內容的獲取&#xff0c;顯示到QT的一種辦法&#xff0c;共享內存。舉例子&#xff0c;這是一個常見需求&#xff0c;比如攝像頭采集進程與 GUI 顯示進程分離&#xff0c;通過共享內存傳輸圖像&#xff0c;避…

opencl的簡單介紹以及c++實例

&#x1f9e9; 一、什么是 OpenCL&#xff1f; OpenCL&#xff08;Open Computing Language&#xff09; 是一個用于異構計算的開放標準&#xff0c;由 Khronos Group 提出和維護。它允許你在各種計算設備上&#xff08;如 CPU、GPU、DSP、FPGA&#xff09;并行運行代碼&#…