kotlin 知識點一 變量和函數

在Kotlin中定義變量的方式和Java 區別很大,在Java 中如果想要定義一個變
量,需要在變量前面聲明這個變量的類型,比如說int a表示a是一個整型變量,String b表
示b是一個字符串變量。而Kotlin中定義一個變量,只允許在變量前聲明兩種關鍵字:val和
var。

val(value 的簡寫)用來聲明一個不可變的變量,這種變量在初始賦值之后就再也不能重新賦
值,對應Java 中的final變量。

var(variable 的簡寫)用來聲明一個可變的變量,這種變量在初始賦值之后仍然可以再被重新
賦值,對應Java 中的非final變量。

如果你有Java 編程經驗的話,可能會在這里產生疑惑,僅僅使用val或者var來聲明一個變量,
那么編譯器怎么能知道這個變量是什么類型呢?這也是Kotlin比較有特色的一點,它擁有出色的
類型推導機制。

舉個例子,我們打開上一節創建的LearnKotlin 文件,在main()函數中編寫如下代碼:

fun main() { val a = 10 println("a = " + a) 
}

注意,Kotlin每一行代碼的結尾是不用加分號的,如果你寫慣了Java 的話,在這里得先熟悉一
下。
在上述代碼中,我們使用val關鍵字定義了一個變量a,并將它賦值為10 ,這里a就會被自動推
導成整型變量。因為既然你要把一個整數賦值給a,那么a就只能是整型變量,而如果你要把一
個字符串賦值給a的話,那么a就會被自動推導成字符串變量,這就是Kotlin的類型推導機制。
現在我們運行一下main()函數,執行結果如圖所示,正是我們所預期的。

在這里插入圖片描述

但是Kotlin的類型推導機制并不總是可以正常工作的,比如說如果我們對一個變量延遲賦值的
話,Kotlin就無法自動推導它的類型了。這時候就需要顯式地聲明變量類型才行,Kotlin提供了
對這一功能的支持,語法如下所示:

val a: Int = 10 

可以看到,我們顯式地聲明了變量a為Int類型,此時Kotlin就不會再嘗試進行類型推導了。如
果現在你嘗試將一個字符串賦值給a,那么編譯器就會拋出類型不匹配的異常。

如果你學過Java 并且足夠細心的話,你可能發現了Kotlin中Int的首字母是大寫的,而Java 中
int的首字母是小寫的。不要小看這一個字母大小寫的差距,這表示Kotlin完全拋棄了Java 中的
基本數據類型,全部使用了對象數據類型。在Java 中int是關鍵字,而在Kotlin中Int變成了一
個類,它擁有自己的方法和繼承結構。

表中列出了Java 中的每一個基本數據類型在Kotlin中對應的對象數據類型。

在這里插入圖片描述

接下來我們嘗試對變量a進行一些數學運算,比如說讓a變大10 倍,可能你會很自然地寫出如下
代碼:

fun main() { val a: Int = 10 a = a * 10 println("a = " + a) 
}

很遺憾,如果你這樣寫的話,編譯器一定會提示一個錯誤:Val cannot be reassigned 。這是
在告訴我們,使用val關鍵字聲明的變量無法被重新賦值。出現這個問題的原因是我們在一開始
定義a的時候將它賦值成了10 ,然后又在下一行讓它變大10 倍,這個時候就是對a進行重新賦值
了,因而編譯器也就報錯了。

解決這個問題的辦法也很簡單,前面已經提到了,val關鍵字用來聲明一個不可變的變量,而
var關鍵字用來聲明一個可變的變量,所以這里只需要把val改成var即可,如下所示:

fun main() { var a: Int = 10 a = a * 10 println("a = " + a) 
}

現在編譯器就不會再報錯了,重新運行一下代碼

在這里插入圖片描述

可以看到,a的值變成了100 ,這說明我們的數學運算操作成功了。
這里你可能會產生疑惑:既然val關鍵字有這么多的束縛,為什么還要用這個關鍵字呢?干脆全
部用var關鍵字不就好了。其實Kotlin之所以這樣設計,是為了解決Java 中final關鍵字沒有被
合理使用的問題。

在Java 中,除非你主動在變量前聲明了final關鍵字,否則這個變量就是可變的。然而這并不
是一件好事,當項目變得越來越復雜,參與開發的人越來越多時,你永遠不知道一個可變的變
量會在什么時候被誰給修改了,即使它原本不應該被修改,這就經常會導致出現一些很難排查
的問題。因此,一個好的編程習慣是,除非一個變量明確允許被修改,否則都應該給它加上
final關鍵字。

但是,不是每個人都能養成這種良好的編程習慣。我相信至少有90% 的Java 程序員沒有主動在
變量前加上final關鍵字的意識,僅僅因為Java 對此是不強制的。因此,Kotlin在設計的時候就
采用了和Java 完全不同的方式,提供了val和var這兩個關鍵字,必須由開發者主動聲明該變量
是可變的還是不可變的。

那么我們應該什么時候使用val,什么時候使用var呢?這里我告訴你一個小訣竅,就是永遠優
先使用val來聲明一個變量,而當val沒有辦法滿足你的需求時再使用var。這樣設計出來的程
序會更加健壯,也更加符合高質量的編碼規范。

函數

對于函數和方法這兩個概念有些混淆,不明白它們有什么區別。其實,函
數和方法就是同一個概念,這兩種叫法都是從英文翻譯過來的,函數翻譯自function ,方法翻
譯自method ,它們并沒有什么區別,只是不同語言的叫法習慣不一樣而已。而因為Java 中方
法的叫法更普遍一些,Kotlin中函數的叫法更普遍一些,因此本書里可能會交叉使用兩種叫法,
你只要知道它們是同一種東西就可以了,不用在這個地方產生疑惑。

函數是用來運行代碼的載體,你可以在一個函數里編寫很多行代碼,當運行這個函數時,函數
中的所有代碼會全部運行。像我們前面使用過的main()函數就是一個函數,只不過它比較特
殊,是程序的入口函數,即程序一旦運行,就是從main()函數開始執行的。

但是只有一個main()函數的程序顯然是很初級的,和其他編程語言一樣,Kotlin也允許我們自
由地定義函數,語法規則如下:

fun methodName(param1: Int, param2: Int): Int { return 0 
}

下面我來解釋一下上述的語法規則,首先fun(function 的簡寫)是定義函數的關鍵字,無論你
定義什么函數,都一定要使用fun來聲明。

緊跟在fun后面的是函數名,這個就沒有什么要求了,你可以根據自己的喜好起任何名字,但是
良好的編程習慣是函數名最好要有一定的意義,能表達這個函數的作用是什么。

函數名后面緊跟著一對括號,里面可以聲明該函數接收什么參數,參數的數量可以是任意多
個,例如上述示例就表示該函數接收兩個Int類型的參數。參數的聲明格式是“參數名: 參數類
型”,其中參數名也是可以隨便定義的,這一點和函數名類似。如果不想接收任何參數,那么寫
一對空括號就可以了。

參數括號后面的那部分是可選的,用于聲明該函數會返回什么類型的數據,上述示例就表示該
函數會返回一個Int類型的數據。如果你的函數不需要返回任何數據,這部分可以直接不寫。

最后兩個大括號之間的內容就是函數體了,我們可以在這里編寫一個函數的具體邏輯。由于上
述示例中聲明了該函數會返回一個Int類型的數據,因此在函數體中我們簡單地返回了一個0。

這就是定義一個函數最標準的方式了,雖然Kotlin中還有許多其他修飾函數的關鍵字,但是只要
掌握了上述函數定義規則,你就已經能應對80% 以上的編程場景了,至于其他的關鍵字,我們
會在后面慢慢學習。

接下來我們嘗試按照上述定義函數的語法規則來定義一個有意義的函數,如下所示:

fun largerNumber(num1: Int, num2: Int): Int { return max(num1, num2) 
}

這里定義了一個名叫largerNumber()的函數,該函數的作用很簡單,接收兩個整型參數,然
后總是返回兩個參數中更大的那個數。

注意,上述代碼中使用了一個max()函數,這是Kotlin提供的一個內置函數,它的作用就是返回
兩個參數中更大的那個數,因此我們的largerNumber()函數其實就是對max()函數做了一層
封裝而已。

現在你可以開始在LearnKotlin 文件中實現largerNumber()這個函數了,當你輸入“max” 這
個單詞時,Android Studio 會自動彈出如圖

在這里插入圖片描述
Android Studio 擁有非常智能的代碼提示和補全功能,通常你只需要鍵入部分代碼,它就能自
動預測你想要編寫的內容,并給出相應的提示列表。我們可以通過上下鍵在提示列表中移動,
然后按下“Enter” 鍵,Android Studio 就會自動幫我們進行代碼補全了。

這里我非常建議你經常使用Android Studio 的代碼補全功能,可能有些人覺得全部手敲更有成
就感,但是我要提醒一句,使用代碼補全功能后,Android Studio 不僅會幫我們補全代碼,還
會幫我們自動導包,這一點是很重要的。比如說上述的max()函數,如果你全部手敲出來,那
么這個函數一定會提示一個紅色的錯誤,如圖

在這里插入圖片描述

max()函數提示錯誤

出現這個錯誤的原因是你沒有導入max()函數的包。當然,導包的方法也有很多種,你將光標
移動到這個紅色的錯誤上面就能看到導包的快捷鍵提示,但是最好的做法就是使用Android
Studio 的代碼補全功能,這樣導包工作就自動完成了。

現在我們使用代碼補全功能再來編寫一次max()函數,你會發現LearnKotlin 文件的頭部自動導
入了一個max()函數的包,并且不會再有錯誤提示了,如圖

在這里插入圖片描述

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

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

相關文章

基于數據可視化學習的卡路里消耗預測分析

數據分析實操集合: 1、關于房間傳感器監測數據集的探索 2、EEMD-LSTM模型擇時策略 — 1.EEMD分解與LSTM模型搭建 3、EEMD-LSTM模型擇時策略 — 2. 量化回測 4、國際超市電商銷售數據分析 5、基于問卷調查數據的多元統計數據分析與預測(因子分析、對應分…

記錄Liunx安裝Jenkins時的Package ‘jenkins‘ has no installation candidate

1、確保是否安裝了Java,如果沒有,可通過以下命令進行安裝: sudo apt update sudo apt install openjdk-21-jre2、安裝Jenkins sudo apt update sudo apt install jenkins執行sudo apt install jenkins時,可能會出現 意思是&…

kiln微調大模型-使用deepseek R1去訓練一個你的具備推理能力的chatGPT 4o

前言 隨著deepseek的爆火,對于LLM的各種內容也逐漸步入我的視野,我個人認為,可能未來很長一段時間,AI將持續爆火,進入一段時間的井噴期,AI也會慢慢的走入我們每個家庭之中,為我們的生活提供便利…

用AI玩游戲1——狼人殺六人局

狼人殺六人局1 狼人殺六人局1,好人陣營有兩個平民,一個預言家,一個守衛,壞人陣營有兩個狼人。狼人每晚可以選擇殺死一個人但第一天晚上不能殺人,狼人晚上可以睜眼識別到同伴和其他好人玩家但不知道他們的身份。預言家…

sqli-labs

Less-8 單引號報錯,雙引號顯示正常 又是You are in......看來還是用盲注 布爾盲注: 如下語句是用來判斷當前數據庫名的第一個字母是不是s,后面的以此類推,比較復雜和麻煩 ?id1 and substr(database(),1,1)s -- 比如這個我們通…

自定義ToolbarView實戰指南(Kotlin版)

一、為什么我們需要造輪子? 看到標題你可能會問:系統自帶Toolbar不香嗎?確實香,但遇到這些場景就抓瞎了: 設計稿要求標題欄帶漸變背景動態波浪線產品經理非要搞個不對稱的返回按鈕布局UI設計師堅持標題和副標題要45度…

微軟推出Office免費版,限制諸多,只能編輯不能保存到本地

易采游戲網2月25日獨家消息:微軟宣布推出一款免費的Office版本,允許用戶進行基礎文檔編輯操作,但限制頗多,其中最引人關注的是用戶無法將文件保存到本地。這一舉措引發了廣泛討論,業界人士對其背后的商業策略和用戶體驗…

PyTorch-基礎(CUDA、Dataset、transforms、卷積神經網絡、VGG16)

PyTorch-基礎 環境準備 CUDA Toolkit安裝(核顯跳過此步驟) CUDA Toolkit是NVIDIA的開發工具,里面提供了各種工具、如編譯器、調試器和庫 首先通過NVIDIA控制面板查看本機顯卡驅動對應的CUDA版本,如何去下載對應版本的Toolkit工…

Vue2+Element實現Excel文件上傳下載預覽【超詳細圖解】

目錄 一、需求背景 二、落地實現 1.文件上傳 圖片示例 HTML代碼 業務代碼 2.文件下載 圖片示例 方式一:代碼 方式二:代碼 3.文件預覽 圖片示例 方式一:代碼 方式二:代碼 一、需求背景 在一個愉快的年后&#xff…

【Bug】natten:安裝報錯(臨近注意力機制的高效cuda內核實現)

正常安裝natten報錯 pip install natten 報錯 可以嘗試使用以下網站進行安裝 https://shi-labs.com/natten/ 可以根據自己的cuda與pytorch版本進行安裝 之間復制命令即可,不需要進行任何修改

win10把c盤docker虛擬硬盤映射遷移到別的磁盤

c盤空間本身就比較小、如果安裝了docker服務后,安裝的時候沒選擇其他硬盤,虛擬磁盤也在c盤會占用很大的空間,像我的就三十多個G,把它遷移到其他磁盤一下子節約幾十G 1、先輸入下面命令查看 docker 狀態 wsl -l -v 2、如果沒有停止…

動態內容加載的解決方案:Selenium與Playwright對比故障排查實錄

方案進程 2024-09-01 09:00 | 接到亞航航班數據采集需求 2024-09-01 11:30 | 首次嘗試使用Selenium遭遇Cloudflare驗證 2024-09-01 14:00 | 切換Playwright方案仍觸發反爬機制 2024-09-01 16:30 | 引入爬蟲代理IPUA輪換策略 2024-09-02 10:00 | 雙方案完整實現并通過壓力測試故…

MaxKB上架至阿里云輕量應用服務器鏡像市場

近日,MaxKB開源知識庫問答系統已上架至阿里云輕量應用服務器鏡像市場,目前是阿里云此類鏡像市場中唯一推薦的AI應用鏡像。 ▲圖1 MaxKB已經上架至阿里云輕量應用服務器鏡像市場 MaxKB是飛致云旗下開源項目,是一款基于大語言模型和RAG&…

藍橋杯 2013 省 B 翻硬幣

題目背景 小明正在玩一個“翻硬幣”的游戲。 題目描述 桌上放著排成一排的若干硬幣。我們用 * 表示正面,用 o 表示反面(是小寫字母,不是零),比如可能情形是 **oo***oooo,如果同時翻轉左邊的兩個硬幣&…

分享---rpc運維事故處理

事故案例03 - Qserver RPC調用大量失敗 一、事故背景 Queryserver是內部的核心服務,負責處理數據查詢請求并支持分布式緩存功能。為優化緩存一致性,新增了分布式鎖邏輯:在查詢請求命中緩存時需先獲取分布式鎖(基于Tair實現&…

string類詳解(下)

文章目錄 4. string類的模擬實現4.1 構造 析構4.2 c_str4.3 下標遍歷4.4 迭代器4.5 插入4.6 刪除4.7 查找4.8 賦值4.9 交換4.10 提取子串4.11 比較大小4.12 流插入 && 流提取 5. 現代版寫法的String類5.1 完整代碼 6. 寫時拷貝(了解) 4. string…

win11本地部署deepseek大模型(安裝ollama+docker+open-webui)最終實現自己的項目可通過API調用投喂數據后的模型

硬件配置:筆記本win11,內存32G,CPU銳龍7 ,無獨顯;只能考慮deepseek-r1:1.5b模型。 第一步:安裝Ollama 此處不過多累贅了,https://ollama.com/官網選擇對應的系統版本下載即可。 需要注意的是…

WebSocket簡單介紹 并接入deepseek

目錄 什么是 WebSocket?工作原理: 為什么需要 WebSocket?WebSocket 的優勢HTTP 和 WebSocket 的區別WebSocket 的劣勢WebSocket 的應用場景WebSocket 握手過程1. 客戶端發起握手請求2. 服務器響應握手請求3. 建立連接 WebSocket 事件處理WebS…

虛擬機安裝教程

一、軟件下載與安裝 運行安裝程序: 雙擊下載的.exe文件,運行安裝程序。 按照安裝向導的提示進行操作。 通常情況下,你需要接受許可協議,選擇安裝目錄(建議使用默認路徑,除非你有特殊需求),并選…

order by布爾盲注、時間盲注

pdo防御下,order by、limit不能參數綁定,可以進行sql注入 案例:靶場的less-46 布爾盲注: import requests from lxml import htmldef get_id_one(URL, paload):res requests.get(urlURL, paramspaload)tree html.fromstring(…