一天入门Kotlin学习笔记(三)-程序结构(下 )

[toc]html

前言

继续讲下程序结构,这部分相对简单,有时候可能会比较啰嗦,笔记嘛!就是在学习过程当中我遇到的问题,做为记录。你们没有遇到问题更好。有些是我的理解,有更好的理解欢迎在评论。git

操做符重载(运算符重载)

这部分官网仍是比较好理解的,并且仍是中文操做符重载建议去看下 举例:github

class Complex(var real: Double, var imaginary: Double) {

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

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

    operator fun plus(other: Any): Int {
        return real.toInt()
    }

    override fun toString(): String {
        return "$real +${imaginary}i"
    }
}

class Book {
    infix fun on(any: Any): Boolean {
        return false
    }
}

class Desk

fun main(args: Array<String>) {
    val c1 = Complex(2.0, 3.5)
    val c2 = Complex(4.0, 7.5)
    println(c1 + c2)
    println(c1 + 5)
    println(c1 + "HelloWorld")
    if ("a" in args) {// infix 中缀表达式 不可乱用 下降可读性
    }
    if (Book() on Desk()) {//DSL比较经常使用
    }
}
复制代码

总结:数组

  • 运算符重载方法必须用operator表示这个是运算符方法
  • 运算符重载只能按照官网已有的方法名进行重载,如+ plus - minus += plusAssign
  • 只对参数个数有要求,对参数类型,返回类型无要求
表达式(中缀表达式,分支表达式,when表达式)
  • 中缀表达式

方法只有一个参数的时候能够不用对象.方法名这种方式调用:bash

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

fun main(args: Array<String>) {
    if (Book() on Desk()) {//DSL比较经常使用
    }
}
复制代码

中缀表达式经常使用在DSL中,不建议使用,不然下降可读性ide

  • 分支表达式

if语句:学习

fun main(args: Array<String>) {
    val mode = if (args.isNotEmpty() && args[0] == "1") {
        0
    } else {
        1
    }
}

复制代码

不交条件语句而叫表达式,是由于Kotlin中时带返回值ui

  • when表达式

功能相似于Java中的switch,也是带有返回值的spa

fun main(args: Array<String>) {
    val x = 5
    when (x) {
        !in 1..100 -> println("$x is not in 100")
        in 1..100 -> println("$x is in 100 ")
        args[0].toInt() -> println("x==args[0]")
        is Int -> println("Hello is $x")
        else -> println("default case")
    }

    val mode = when {//有返回值
        args[0].toInt() == 5 -> 1
        else -> 2
    }
}
复制代码

当条件匹配下面的将不会执行,都没有匹配的则执行 else ->后面的语句.net

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

这些属性都很是简单,直接用例子:

fun hello(char: Char='A'){
    
}
复制代码

默认参数就是给形参指定一个默认值,当调用时能够不传参数。不传时使用默认值

  • 变长参数

在Java中也有相似的变长参数

Java
 public void vararg1(String... strings) {
}

Kotlin  
public void vararg1(vararg args:String) {
}
复制代码

变长参数相似于数组。遍历方式与数组或是集合相同。 可是不用的Java的变长参数只能做为参数的最后一个Kotlin是没要求的,如:

Java 
    public void vararg1(String... strings) {
    }//正确
    public void vararg2(String... strings,int i) {
    }//错误
复制代码

在Kotlin中由于有具名参数因此是没有要求的

  • 具名参数
    具名参数就在传入参数的同时,写上参数名称,如:
fun hello(double: Double, vararg args: Int, string: String) {
    args.forEach(::println)
    println(string)
}
调用:
   hello(3.0, 1, 2, 3, 4, string = "Hello")//在变长参数以前是不须要具名参数的 后面是具名参数 即string= 不指定报错
复制代码
  • 数组展开(Spread Operator)
val array = intArrayOf(1, 2, 3, 4)
    val list = ArrayList<Int>()
    list.add(1)
    list.add(2)
    list.add(3)
    hello(*array, string = "hello")
    hello(3.0, *array, string = "hello")
    hello(args = *array, string = "hello")//不传的话 后面的参数使用具名参数
//    hello(*list,string = "hello")//list 如今还不支持* 表示
复制代码
- *操做符能够展开数组,如今还不支持展开集合

- *操做符只用于变长参数列表的实参

- *操做符不能重载    

- *不算通常意义上的运算符  
复制代码

结语

这篇就结束了,下篇是关于面向对象相关的笔记

Github源码直接运行,包含所有详细笔记

相关文章
相关标签/搜索