Kotlin基礎語法--基礎類型

基本類型

在 Kotlin 中爷抓,所有東西都是對象卡者,在這個意義上講我們可以在任何變量上調(diào)用成員函數(shù)和屬性盆赤。 一些類型可以有特殊的內(nèi)部表示——例如贾富,數(shù)字、字符和布爾值可以在運行時表示為原生類型值牺六,但是對于用戶來說颤枪,它們看起來就像普通的類。 在本節(jié)中淑际,我們會描述 Kotlin 中使用的基本類型:數(shù)字畏纲、字符、布爾值春缕、數(shù)組與字符串盗胀。

數(shù)字

Kotlin 處理數(shù)字在某種程度上接近 Java,但是并不完全相同锄贼。例如票灰,對于數(shù)字沒有隱式拓寬轉換(如 Java 中 int 可以隱式轉換為long——譯者注),另外有些情況的字面值略有不同宅荤。
Kotlin 提供了如下的內(nèi)置類型來表示數(shù)字(與 Java 很相近):

Type Bit width
Double 64
Long 64
Float 32
Int 32
Short 16
Byte 8

字面常量

數(shù)值常量字面值有以下幾種:

  • 十進制: 123
  • Long 類型用大寫 L 標記: 123L
  • 十六進制: 0x0F
  • 二進制: 0b00001011

注意: 不支持八進制

Kotlin 同樣支持浮點數(shù)的常規(guī)表示方法:

  • 默認 double:123.5屑迂、123.5e10
  • Float 用 f 或者 F 標記: 123.5f

數(shù)字字面值中的下劃線(自 1.1 起)
你可以使用下劃線使數(shù)字常量更易讀:

val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010

運算

Kotlin中的運算符被定義成相應類的類成員函數(shù),通過復寫相應運算符函數(shù)冯键,可重載運算符功能惹盼。參見 運算符重載
對于位運算惫确,沒有特殊字符來表示手报,而只可用中綴方式調(diào)用命名函數(shù),例如:

val x = (1 shl 2) and 0x000FF000

這是完整的位運算列表(只用于 Int 和 Long):

  • shl(bits) – 有符號左移 (Java 的 <<)
  • shr(bits) – 有符號右移 (Java 的 >>)
  • ushr(bits) – 無符號右移 (Java 的 >>>)
  • and(bits) – 位與
  • or(bits) – 位或
  • xor(bits) – 位異或
  • inv() – 位非

字符

字符用 Char 類型表示改化。它們不能直接當作數(shù)字
字符字面值用單引號括起來:'1'掩蛤。 特殊字符可以用反斜杠轉義。
我們可以顯式把字符轉換為 Int 數(shù)字:

fun decimalDigitValue(c: Char): Int {
    if (c !in '0'..'9')
        throw IllegalArgumentException("Out of range")
    return c.toInt() - '0'.toInt() // 顯式轉換為數(shù)字
}

布爾

布爾用 Boolean 類型表示所袁,它有兩個值:truefalse盏档。
若需要可空引用布爾會被裝箱。
內(nèi)置的布爾運算有:

  • || – 或
  • && – 與
  • ! – 非

數(shù)組

數(shù)組在 Kotlin 中使用 Array 類來表示燥爷,它定義了 get 和 set 函數(shù)(按照運算符重載約定這會轉變?yōu)?[])和 size 屬性蜈亩,以及一些其他有用的成員函數(shù):

class Array<T> private constructor() {
    val size: Int
    operator fun get(index: Int): T
    operator fun set(index: Int, value: T): Unit

    operator fun iterator(): Iterator<T>
    // ……
}

Kotlin數(shù)組創(chuàng)建方法:

    //創(chuàng)建數(shù)組懦窘,并賦值為1,2稚配,3
    val arrInt: Array<Int> = arrayOf(1, 2, 3)

    //創(chuàng)建數(shù)組畅涂,長度為5,內(nèi)容為空
    val arrStringNulls: Array<String?> = arrayOfNulls<String>(5)
    for (index in 0 until arrStringNulls.size) {
        arrStringNulls[index] = "This is " + index
    }
    for (index in arrStringNulls.indices)
        println("arrStringNulls[$index] = ${arrStringNulls[index]}")

    //創(chuàng)建數(shù)組道川,長度為5午衰,使用一個函數(shù)參數(shù)的工廠函數(shù)生產(chǎn)元素
    val arrStringByFactroy: Array<String> = Array<String>(5, { i -> (i * i).toString() })
    for (value in arrStringByFactroy)
        println("value=$value")

Kotlin 也有無裝箱開銷的專門的類來表示原生類型數(shù)組: ByteArrayShortArray冒萄、IntArray 等等臊岸。這些類和 Array 并沒有繼承關系,但是它們有同樣的方法屬性集尊流。它們也都有相應的工廠方法:

val x: IntArray = intArrayOf(1, 2, 3)
x[0] = x[1] + x[2]

字符串

字符串用 String 類型表示帅戒。字符串是不可變的。 字符串的元素——字符可以使用索引運算符訪問: s[i]崖技。 可以用 for 循環(huán)迭代字符串:

for (c in str) {
    println(c)
}

字符串字面值

Kotlin 有兩種類型的字符串字面值: 轉義字符串逻住,原生字符串。

  1. 轉義字符串:可以有轉義字符迎献,轉義字符串很像 Java 字符串:
val s = "Hello, world!\n"
  1. 原生字符串:使用三個引號(""")分界符括起來瞎访,內(nèi)部沒有轉義并且可以包含換行和任何其他字符:
val text = """
    |Tell me and I forget.
    |Teach me and I remember.
    |Involve me and I learn.
    |(Benjamin Franklin)
    """.trimMargin()

通過 trimMargin() 函數(shù)去除前導空格,默認 | 用作邊界前綴吁恍,但你可以選擇其他字符并作為參數(shù)傳入扒秸,比如 trimMargin(">")

val text = """
    >Tell me and I forget.
    >Teach me and I remember.
    >Involve me and I learn.
    >(Benjamin Franklin)
    """.trimMargin(">")

變量

Kotlin的變量分為可變和不可變變量践盼,和Java中是否采用final修飾的變量含義一樣鸦采。

  • 采用 val 聲明的變量為不可變變量,即常量:
//編譯期常量
const val tag: String = "MainActivity"
//常量
val tag: String = getString()
//等同于Java
final String tag = "MainActivity";
  • 采用 var 聲明的變量為可變變量:
var num: Int = 1
//等同于Java
int num = 1;

函數(shù)

Kotlin定義一個函數(shù)的格式如下:

訪問控制符 fun 方法名(參數(shù)咕幻,參數(shù)渔伯,參數(shù)) : 返回值類型 {
···
···
}

  • 訪問控制符:Kotlin的訪問控制符范圍從大到小分別為:
    publicinternal肄程、protected锣吼、private,不聲明默認為 public蓝厌;

Kotlin與Java函數(shù)的一個重大的區(qū)別就是:
Kotlin支持包級函數(shù)玄叠,即函數(shù)不依賴于類而存在,而在Java中拓提,函數(shù)必須聲明在類里面:

//包級函數(shù)
fun main(args: Array<String>){
}
//Java函數(shù)必須依賴類而存在
public class ClzFun{
    public static void main(String[] args){
    }
}

可變參數(shù)

Kotlin中读恃,可變參數(shù)使用關鍵字 vararg


fun variousArgs(vararg args: String) {
    for (arg: String in args)
        println(arg)
}
//Java可變參數(shù)
public void variousArgs(String... args){

}

靜態(tài)變量和靜態(tài)函數(shù)

Kotlin中并沒有像Java一樣,提供 static 這個關鍵字,如果想在Kotlin中實現(xiàn)靜態(tài)變量和靜態(tài)函數(shù)寺惫,可以使用 companion object, companion object 后可以加上自定義的object名疹吃,也可以省略。


fun main(args: Array<String>) {
    println(KotlinStatic.staticInt)
    KotlinStatic.getInstance()
}

class KotlinStatic{
    companion object StaticTest{
        var staticInt: Int = 1
        fun getInstance() : KotlinStatic{
            return KotlinStatic()
        }
    }
}
//Java靜態(tài)常量和靜態(tài)函數(shù)
public class JavaStatic{
    public static int staticInt = 1;
    public static JavaStatic getInstance(){
        return new JavaStatic();
    }
}

對于在Kotlin中實現(xiàn)static變量和static方法西雀,官方更推薦直接使用包級別的變量或函數(shù)來實現(xiàn)萨驶。因為如果使用 companion object 實現(xiàn) static 功能,Kotlin在運行的時候艇肴,是會創(chuàng)建一個 companion object 實例對象腔呜,就相當于多了一些時間進行對象創(chuàng)建,初始化分配空間等操作再悼。

附錄

注意事項:

  • Kotlin對于數(shù)字沒有隱式拓寬轉換(如 Java 中 int 可以隱式轉換為long)
    所以核畴,對于下面這個例子,其是無法通過編譯的:
val b: Byte = 1 // OK, 字面值是靜態(tài)檢測的
val i: Int = b // 錯誤

Kotlin沒有辦法將 Byte 賦值給 Int 類型帮哈,對于這種不同類型數(shù)值賦值膛檀,我們必須通過 顯示轉型 來拓寬數(shù)字:

val i: Int = b.toInt() // OK: 顯式拓寬

每種數(shù)字類型支持如下的轉換:

  • toByte(): Byte

  • toShort(): Short

  • toInt(): Int

  • toLong(): Long

  • toFloat(): Float

  • toDouble(): Double

  • toChar(): Char

  • 運算符重載示例:

data class Counter(val x: Int) {
    operator fun plus(inc: Int) = Counter(x + inc)
    operator fun plus(inc: Counter): Counter {
        return Counter(x + inc.x)
    }
}

fun main(args: Array<String>) {
    println(Counter(1) + Counter(3))
    println(Counter(1) + 11)
}

本文大部分內(nèi)容來自:https://hltj.gitbooks.io/kotlin-reference-chinese/content/txt/basic-types.html

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锰镀,一起剝皮案震驚了整個濱河市娘侍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泳炉,老刑警劉巖憾筏,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異花鹅,居然都是意外死亡氧腰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門刨肃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來古拴,“玉大人,你說我怎么就攤上這事真友』苹荆” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵盔然,是天一觀的道長桅打。 經(jīng)常有香客問我,道長愈案,這世上最難降的妖魔是什么挺尾? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮站绪,結果婚禮上遭铺,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好魂挂,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布航厚。 她就那樣靜靜地躺著,像睡著了一般锰蓬。 火紅的嫁衣襯著肌膚如雪幔睬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天芹扭,我揣著相機與錄音麻顶,去河邊找鬼。 笑死舱卡,一個胖子當著我的面吹牛辅肾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播轮锥,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼矫钓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了舍杜?” 一聲冷哼從身側響起新娜,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎既绩,沒想到半個月后概龄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡饲握,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年私杜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片救欧。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡衰粹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出笆怠,到底是詐尸還是另有隱情铝耻,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布骑疆,位于F島的核電站田篇,受9級特大地震影響,放射性物質發(fā)生泄漏箍铭。R本人自食惡果不足惜泊柬,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诈火。 院中可真熱鬧兽赁,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至亮钦,卻和暖如春馆截,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜂莉。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工蜡娶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人映穗。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓窖张,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蚁滋。 傳聞我的和親對象是個殘疾皇子宿接,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容