Kotlin学习笔记(三)-程序结构(下 )

2019-12-19 19:20:51 浏览数 (1)

[toc]

前言

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

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

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

代码语言:javascript复制
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表达式)
  • 中缀表达式

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

代码语言:javascript复制
class Book {
    infix fun on(any: Any): Boolean {
        return false
    }
}
class Desk

fun main(args: Array<String>) {
    if (Book() on Desk()) {//DSL比较常用
    }
}

中缀表达式常用在DSL中,不建议使用,否则降低可读性

  • 分支表达式

if语句:

代码语言:javascript复制
fun main(args: Array<String>) {
    val mode = if (args.isNotEmpty() && args[0] == "1") {
        0
    } else {
        1
    }
}

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

  • when表达式

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

代码语言:javascript复制
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 ->后面的语句

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

这些属性都非常简单,直接用例子:

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

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

  • 变长参数

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

代码语言:javascript复制
Java
 public void vararg1(String... strings) {
}

Kotlin  
public void vararg1(vararg args:String) {
}

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

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

在Kotlin中因为有具名参数所以是没有要求的

  • 具名参数 具名参数就在传入参数的同时,写上参数名称,如:
代码语言:javascript复制
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)
代码语言:javascript复制
    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 现在还不支持* 表示
代码语言:javascript复制
- *操作符可以展开数组,现在还不支持展开集合

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

- *操作符不能重载    

- *不算一般意义上的运算符  

0 人点赞