kotlin中的程序结构

目录

  • val,var关键字
  • 函数
  • Lambda表达式
  • 类成员
  • 运算符
  • 表达式
  • 循环语句(for循环,while循环,continue,break)
  • 异常捕获
  • 具名参数,变长参数,默认参数

val,var关键字

kotlin中关键字val用来表示常量,var用来表示变量

val a : String = "Hello world"
var b : String = "Hello world"

a的值不能改变,b的值可以改变
另外,kotlin中有类型推导的功能,可以不用写String类型例如下面这样

val c = "Hello world"

可以推倒出c是String类型.
kotlin中的val和java中的final有什么区别?
java中的final是编译期常量,什么是编译期常量?就是在编译的时候就把引用换成值。而kotlin中的val修饰的只是一个不能改变值的变量(可以通过反射改变),如果我们想要在kotlin中定义编译期常量我们可以加上const关键字.

函数

kotlin中函数定义

fun main(args: Array<String>) : Unit{
    
}

Unit是返回类型,它相当于java中的Void关键字声明

fun sum(arg1 : Int,arg2: Int) : Int{
    return arg1 + arg2
}

当然也是可以返回其它的类型

fun main(args: Array<String>) : Unit{
    val arg1 = args[0].toInt()
    val arg2 = args[1].toInt()
    println("$arg1 + $arg2 = ${sum(arg1,arg2)}")
}

对于返回值只有一个表达式的函数还可以简写成:

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

匿名函数

val int2Long = fun(arg : Int) : Long{
    return arg.toLong()
}

Lambda表达式

关于Lambda表达式请参见 :https://www.jianshu.com/p/78f7c6d169f2

类成员

如何在kotlin中声明一个类

class MM(name : String,age : Int,voice : String){
    fun sing(name : String){
        println("sing $name")
    }
}

声明及使用

fun main(args: Array<String>) {
    val mm = MM("",22,"未知")
    mm.sing("天鹅湖")
}

在java中声明一个成员变量,通常会有set和get方法如下

public class JavaA {
    private int b = 0;

    public int getB() {
        System.out.println("some one tries to get b.");
        return b;
    }

    public void setB(int b) {
        System.out.println("some one tries to set b.");
        this.b = b;
    }
}

但是在kotlin中默认是不需要set和get方法的

open class A{
    var b = 0
}

直接就可以使用

var a : A = A()
a.b

这和java中声明成员变量为public差不多. 其实也是可以设置get/set方法的,如下

open class A{
    var b = 0
        get() = field
        set(value){ field = value}
}

另外,kotlin中存在一种延迟加载的机制,var可以用lateinit关键字,val可以用lazy关键字.

open class A{
    var b = 0
    lateinit var a : String
    lateinit var d : X
    val e : X by lazy{
        println("init X")
        X()
    }
}

运算符

在java当中,运算符都是定死的,+-*/, 1+1一定等于2,但是在kotlin中运算符是可以自定义的,也就是说1+1可以不等于2.
官网详情:https://kotlinlang.org/docs/reference/operator-overloading.html
下面我们自定义加法运算符,做一个复数相加的运算

class Complex(var real:Double,var imaginary:Double){
    operator fun plus(other:Complex) : Complex{
        return Complex(real+other.real,imaginary+other.imaginary)
    }

    override fun toString(): String {
        return "${real}+${imaginary}"
    }
}
fun main(args: Array<String>) {
    val c1 : Complex = Complex(3.0,4.0);
    val c2 : Complex = Complex(4.0,5.0);
    println(c1 + c2)
}

最终输出

7.0+9.0i

运算符重写只对参数个数做要求,对参数和返回值类型不做要求
例如我可以重写plus如下:

operator fun plus(other:Int) : Complex{
    return Complex(real+other,imaginary+other)
}
operator fun plus(other:Int) : Int{
   return other
}

以上都是可以的, 另外我们再来看看infix中缀表达式

if ("-name" in args){        
}

使用in其实是关联到了Array中的contains函数,他返回是否存在该元素

public operator fun <@kotlin.internal.OnlyInputTypes T> Array<out T>.contains(element: T): Boolean {
    return indexOf(element) >= 0
}

我们也可以使用infix定义其它的运算符号如 on.

class Desk

class Book{
    infix fun on(desk: Desk):Boolean{
        return false
    }
}

fun main(args: Array<String>) {
    val d = Desk()
    val b = Book()
    if (b on d){
        
    }
}

表达式

if表达式可以有返回值

class Kotlin{
    val DEBUG = 1
    val USER = 2
    fun test(){
        var rule = true
        var mode = if (rule){
            DEBUG
        }else{
            USER
        }
    }
}

when表达式
java中的swich表达式针对的类型有限(只能和int类型兼容,1.7增加了String和枚举),在kotlin中使用when来替代swich表达式

fun test(){
        val x = 5
        when(x){
            is Int -> println("Hello $x")
            in 1..100 -> println("$x is in 1..100")
            !in 1..100 -> println("$x is not in 1..100")
        }
    }

同时when也是有返回值的

fun test(){
    val a = A()
       var mode = when {
        a == null -> 1 else ->0
    }
}

循环语句(for循环,while循环,continue,break)

for循环的几种基本形式

val array = intArrayOf(1, 2, 3)
        for (arg in array){
            println(arg)
        }
for ((index,value) in array.withIndex()){
       println("$index -> $value")
}
for (indexValue in array.withIndex()){
      println("${indexValue.index} -> ${indexValue.value}")
}

关于in操作符


image.png

可以看出in操作符的对象必须满足实现以上三个方法,下面我们来自定义迭代类,然后使用in进行迭代输出

class MyIterator(val iterator: Iterator<Int>){
        operator fun next(): Int{
            return iterator.next()
        }
        operator fun hasNext(): Boolean{
            return iterator.hasNext();
        }
    }
class MyIniList{
        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())
        }
    }

最终输出

 val list = MyIniList()
        list.add(1)
        list.add(2)
        list.add(3)
        for (arg in list){
            println(arg)
        }

while语句

var x = 5
while (x > 0){
     println(x)
     x--
}
do {
    println(x)
    x--
}while (x > 0)

continue,break

class Loop2{

    class Student{
        fun isNotClothedProperly():Boolean{
            return false
        }
    }

    fun test(){
        val students = ArrayList<Student>()
        val you = Student()
        for (student in students){
            if (student == you) continue
            if (student.isNotClothedProperly()){
                break
            }
        }
    }
}

异常捕获

class Sum{
    fun input(args :Array<String>){
        try {
            val arg1 = args[0].toInt()
            val arg2 = args[1].toInt()
            println("$arg1+$arg2=${arg1+arg2}")
        }catch (e : NumberFormatException){
            println("您确定输入的是整数吗?")
        }catch (e : ArrayIndexOutOfBoundsException){
            println("您确定输入的是两个整数吗?")
        }catch (e : Exception){
            println("程序出现了未知异常.${e.message}")
        }finally {
            println("谢谢使用")
        }
    }
}

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

具名参数
具名参数的意思是,在传入参数的同时给定参数名字

class Test{
    fun test(){
        sum(arg2 = 3,arg1 = 2)
    }
    fun sum(arg1 : Int, arg2 : Int){
        
    }
}

变长参数
参数的个数可以任意改变

class Test{
    
    fun test(){
        hello(1,2,3,4,5,string = "hello")
    }
    
    fun hello(vararg ints : Int, string: String){
        ints.forEach(::println)
    }
}

变长参数还支持一个特性

fun test(){
     val array = intArrayOf(1,3,4,5)
     hello(*array,string = "hello")
}

*表示把数组展开成一个个元素传进去.

默认参数
默认参数参数可以给参数设定一个默认值,调用函数的时候可以不用传该参数,具体使用如下

class Test{
    fun test(){
        val array = intArrayOf(1,3,4,5)
        hello(ints = *array,string = "hello")
    }

    fun hello(double: Double = 3.0,vararg ints : Int, string: String){
        ints.forEach(::println)
    }
}

以上是我对kotlin中程序结构相关内容的总结.

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

推荐阅读更多精彩内容