Kotlin——程序结构(3)

1、常量与变量(var,val)

var是一个可变变量,这是一个可以通过重新分配来更改为另一个值的变量。这种声明变量的方式和java中声明变量的方式一样。
val是一个只读变量,这种声明变量的方式相当于java中的final变量。一个val创建的时候必须初始化,因为以后不能被改变。
什么是常量?
val = value,值类型
类似Java的final
不能重复赋值
举例:

运行时常量:val x = getX()
编译期常量:const val x = 2 会提高执行效率

什么是变量?
var = variable
举例:

var x = "HelloWorld"//定义变量
x = "HiWorld"//再次赋值

类型推导
编译器可以推导量的类型

val string = "Hello" //推导出String类型
val int = 5 //Int类型
val x = getString() + 5//String类型

2、函数(function)

什么是函数?
以特定功能组织起来的代码块

fun函数名:[返回值类型]{[函数体]}
fun函数名 = [表达式] //返回值是Unit(相当于java中的void),可不写

匿名函数

fun([参数列表])...

举例:

val say = fun(name:String) = println("Hello")

3、lambda表达式

实际上就是匿名函数
写法{[参数列表]->[函数体,最后一行是返回值]}
举例:

val sum = {a:Int,b:Int->a+b}
返回的是a+b的和

类型表示举例
1、()->Unit无参,返回值为Unit
2、(Int)->Int传入整型,返回一个整型
3、(String,(String)->String)->Boolean传入字符串、Lambda表达式,返回Boolan

Lambda表达式的调用
1、用()进行调用
2、等价于invoke()
举例

val sum = {a:Int,b:Int->a+b}
sum(2,3)
sum.invoke(2,3)

Lambda表达式的简化
1、如果函数调用时,最后一个是lambda表达式,在传参的时候可以将它移出去
2、函数参数只有一个lambda表达式,调用时小括号可省略
3、lambda表达式只有一个参数,不写也可以,名字默认为it
4、实参、返回值与形参一致的函数可以用方式作为实参传入

4、类成员(成员方法、成员变量)

属性
或者说成员变量,类范围内的变量
方法
或者说成员函数,类范围内的函数
函数和方法的区别
1、函数强调功能本身,不考虑从属
2、方法的称呼通常是丛类的角度出发
3、叫法不同
定义方法
写法与普通函数完全一致
定义属性
1、构造方法参数中var/val修饰的都是属性
2、类内部也可以定义属性

class Hello(val aField:Int,notAFlield:Int){
var anotherField:Float = 3f
}
aField 是属性
notAField 不是属性,只是普通构造方法的参数

属性的访问控制
属性可以定义getter/setter
举例:

var a: Int = 0
get() = field
set(value) {
field = value
}
val b:Float = 0f
//set(value){ field =value}
get() = field

val不可以set().png

属性初始化
1、属性的初始化尽量在构造方法中完成
2、无法在构造方法中初始化,尝试降级为局部变量
3、var用lateinit延迟初始化,val用lazy
4、可空类型谨慎用null直接初始化(不建议使用null初始化)

class LazyTest {
var a: Int = 0;
lateinit var str: String
lateinit var x1: X
val STR: String = "STR"
val x2: X by lazy {
print("lazy X")
X()
}
}

class X

fun main(args: Array<String>) {
val e: LazyTest = LazyTest()
e.x2
}

5、基本运算符

1、任何类都可以定义或重载父类的基本运算符
2、通过运算符对应的具名函数来定义
3、对参数的个数要求,对参数和返回值类型不做要求
4、不能像Scala一样定义任意运算符

6、表达式(中缀表达式、分支表达式、when表达式等)

1、中缀表达式
只有一个参数,且用infix修饰的函数

fun main(args: Array<String>) {
    val b = Book();
    b on "哈哈"
}
class Book {
    infix fun on(str: String) {
        print("Book on $str")
    }
}

运行结果:Book on 哈哈

2、分支表达式
1)if...else

if(a==b)...else if(a==c)...else...

2)表达式与完备性

val x = if(b<0) 0 else b
val x = if(b<0) 0 //错误,赋值时,分支必须完备

3、when表达式
1)加强版switch,支持任意类型,不需些break
2)支持纯表达式条件分支(类似if)
3)表达式与完备性
举例:

fun main(args: Array<String>) {
    val x = 5
    when (x) {
        is Int -> println("整型")
        in 0..10 -> println(" x in 0..10")
        in 0..100 -> println(" x in 0..100")

        5 -> println("x:$x 值是5")
    }

    val a = when{
        x in 0..10 ->100
        else ->0
    }
    print("a的值是$a")
}

结果:


when事例结果.png

7、循环语句(for循环、while循环、continue、break)

1)for循环
a.基本写法

for(element in elements)...

b.给任意类实现Iterator方法
运行机制简单举例:

class MyIterator(val iterator:Iterator<Int>){

    operator fun next():Int{
        return iterator.next()
    }

    operator fun hasNext():Boolean{
        return iterator.hasNext()
    }

}

class MyIntList{
    private val list = ArrayList<Int>()

    fun add(int:Int){
        list.add(int)
    }

    fun remove(int:Int){
        list.remove(int)
    }

    operator fun iterator():MyIterator{
        return MyIterator(list.iterator())
    }
}

fun main(args: Array<String>) {
    val list = MyIntList()
    list.add(1)
    list.add(2) 
    list.add(3)

    for (i in list){
        println(i)
    }
}

2)while循环
a. do...while(...)...
b. while(...)...
3)continue
跳过当前循环
4)break
终止循环
多层循环嵌套的终止结合标签使用

Outter@for(...){
Inner@while(i<0){if(...break@Outter)}
}
如果break后面没有@Outter,是把while给break了,会继续执行for循环,如果加了@Outter了,就是for循环给break了

8、异常捕获(try...catch、finally)

try...catch
1、catch分支匹配异常类型
2、表达式,可以用来赋值,与if..else、when类似
例如:

fun main(args: Array<String>) {

    val a = try {
        0 / 3
    } catch (e: Exception) {
        e.printStackTrace()
        println("出现异常")
        0
    } finally {
        println("执行finally")
    }
    println(a)
}

运行结果:

执行finally
3

finally
无论代码是否抛出异常都会执行

return try(x/y)catch(e:Exception){0}finally{...}
如果抛异常返回0,否则返回x/y,finally一定会执行,先执行finally再返回。

9、具名参数,变长参数、默认参数

1)具名参数
给函数的实参附上形参
举例:

fun sum(arg1:Int,arg2:Int) = arg1+arg2
sum(arg1=2,arg2=3)

2)变长参数
a.某个参数可以接收多个值
b.可以不为最后一个参数
c.如果传参时有歧义,需要使用具名参数

Spread Opreator
a.只支持展开的Array
b.只用于变长参数列表的实参
c.不能重载

3)默认参数
a.为函数参数指定默认值
b.可以为任意位置的参数指定默认值
c.传参时,如果有歧义,需要使用具名参数

10.练习

1)简单实现计算器

fun main(args: Array<String>) {

    while (ok()) {
        try {
            println("请输入,例如:3 + 4")
            val input = readLine() ?: break
            val split = input.trim().split(" ")
            if (split.size < 3) {
                throw IllegalArgumentException("参数个数不对")
            }
            val a = split[0].toDouble()
            val op = split[1]
            val b = split[2].toDouble()
            println("$a $op $b -> ${Opreator(op).apply(a, b)}")
        } catch (e: NumberFormatException) {
            println("您输入的数字有误")
        } catch (e:IllegalArgumentException) {
            println("参数有误")
        }catch (e:Exception){
            println("其他异常,${e.message}")
        }

        println("再来一发吗?[Y]")
        val cmd = readLine()
        if (cmd == null || cmd.toLowerCase() != "y") {
            break
        }
    }
    println("退出成功!")
}

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

推荐阅读更多精彩内容