Kotlin学习(一)——函数、常量与变量、数据类型

一、函数

Kotlin中,使用关键字fun来申明函数,fun 后面紧跟着的是函数名,函数形式参数,返回值,函数体
例如:
函数名:sun
形参:有a、b两个,都是Int类型,
返回值:以:申明后面跟着的是具体的返回值类型,如需要返回无意义的值(java的void)时可以不写或者用Unit<br />

fun sum(a: Int, b: Int): Int {
      return a + b
}

无返回值

fun printSum(a: Int, b: Int):Unit {
println("sum of $a and $b is ${a + b}")
}

或者不写Unit

fun printSum(a: Int, b: Int):Unit {
println("sum of $a and $b is ${a + b}")
}

<br />

Main函数
fun main(args: Array<String>) {
println("hello world");//在kotlin中,对;结束标识符没有作严格要求,可写可不写,println是kotlin种的打印语句相当于java的System.out.println
}

二、常量与变量

kotlin中常量和变量的定义分别用val、var来定义,定义常量和变量分别有以下几种形式:

常量的定义(使用val关键字)

val a: Int = 1  // 立即赋值
val b = 2   // 自动推断出 `Int` 类型
val c: Int  // 如果没有初始值类型不能省略
c = 3       // 明确赋值

变量的定义(使用var关键字)

var x = 5 // 自动推断出 `Int` 类型
x += 1

三、数据类型

在 Kotlin 中,所有东西都是对象,在这个意义上讲所以我们可以在任何变量上调用成员函数和属性。有些类型是内置的,因为他们的实现是优化过的。但是用户看起来他们就像普通的类。本节我们会描述大多数这些类型:数字、字符、布尔和数组。<br />

1.数字类型

Kotlin 提供了6种类型来表示数字(与 Java 很相近):Double、Float、Long、Int、Short、Byte<br />
注意在 Kotlin 中字符不是数字<br />
kotlin中数字类型的字面值有个特性,就是支持下划线使得数字更有阅读性(从kotlin以后1.1)<br />
例如:

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

值常量字面值有以下几种:

十进制: 123<br />
Long 类型用大写 L 标记: 123L<br />
十六进制: 0x0F<br />
二进制: 0b00001011<br />
注意: 不支持八进制<br />
Kotlin 同样支持浮点数的常规表示方法:<br />
默认 double:123.5、123.5e10<br />
Float 用 f 或者 F 标记: 123.5f<br />

2.类型转换

  • 隐式转换,不需要书写格外代码,由系统自动实现类型转换,Kotlin中如果定义变量明确指定了数字类型,那么就不能进行隐式转换了,如下面的代码就不被支持

      val a: Int? = 1 // 一个装箱的 Int (java.lang.Integer)
      val b: Long? = a // 隐式转换产生一个装箱的 Long (java.lang.Long) 
    
      正确的转换代码:
      val a:Int? = 1
      val b:Long? = a.toLong
    
  • 显示转换,需要使用格外的代码,如需要把一个Int类型转换成Long类型,需要使用Int.toLong

      每个数字类型支持如下的转换:
      toByte(): Byte
      toShort(): Short
      toInt(): Int
      toLong(): Long
      toFloat(): Float
      toDouble(): Double
      toChar(): Char
    

3.布尔

布尔用 Boolean 类型表示,它有两个值:true 和 false。

若需要可空引用布尔会被装箱。

内置的布尔运算有:

|| – 短路逻辑或
&& – 短路逻辑与
! - 逻辑非

4.数组

数组在 Kotlin 中使用 Array 类来表示,它定义了 get 和 set 函数(按照运算符重载约定这会转变为 [])和size 属性,以及一些其他有用的成员函数:

class Array<T> private constructor() {
val size: Intoperator fun get(index: Int): Toperator fun set(index: Int, value: T): Unitoperator fun iterator(): Iterator<T>// ……
}   

我们可以使用库函数 arrayOf() 来创建一个数组并传递元素值给它,这样 arrayOf(1, 2, 3) 创建了 array [1, 2, 3]。 或者,库函数 arrayOfNulls() 可以用于创建一个指定大小、元素都为空的数组。
另一个选项是用接受数组大小和一个函数参数的工厂函数,用作参数的函数能够返回 给定索引的每个元素初始值:
Kotlin 也有无装箱开销的专门的类来表示原生类型数组: ByteArray、 ShortArray、IntArray 等等。这些类和 Array 并没有继承关系,但是 它们有同样的方法属性集。它们也都有相应的工厂方法:

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

数组的使用Demo

    fun testArray() {
    //数组的定义
    var arrays: Array<Int> = arrayOf(12, 21, 33, 44, 55);//定义一个Int类型数组,直接赋值
    var arrays2: Array<Int?> = arrayOfNulls<Int>(arrays.size)//定义一个长度和arrays一样的空数组,后赋值
    //遍历arrays数组,并且给arrays赋值
    for (c in 0..arrays.size-1){
        println("arrays的值遍历:${arrays[c]}");
        arrays2.set(c,arrays.get(c)+1)
    }
    //遍历arrays2数组
    for (c in arrays2) {
        println("arrays2:$c   ");
    }
}

5.字符串

字符串用 String 类型表示。字符串是不可变的。 字符串的元素——字符可以使用索引运算符访问: s[i]。 可以用 for 循环迭代字符串:

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

字符串字面值<br />
Kotlin 有两种类型的字符串字面值: 转义字符串可以有转义字符,以及原生字符串可以包含换行和任意文本。转义字符串很像 Java 字符串:

val s = "Hello, world!\n";//转义采用传统的反斜杠方式

原生字符串 使用三个引号(""")分界符括起来,内部没有转义并且可以包含换行和任何其他字符:

val text = """
for (c in "foo")
print(c)"""

也可以类似Java中通过 trimMargin() 函数去除前导空格:

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

默认 | 用作边界前缀,也可以选择其他字符并作为参数传入,比如 trimMargin(">")。

6.字符串模板

字符串可以包含模板表达式 ,即一些小段代码,会求值并把结果合并到字符串中。 模板表达式以美元符($)开头,由一个简单的名字构成:

val i = 10
val s = "i = $i" // 求值结果为 "i = 10"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容