继续讲下程序结构,这部分相对简单,有时候可能会比较啰嗦,笔记嘛!就是在学习过程中我遇到的问题,作为记录。大家没有遇到问题更好。有些是个人理解,有更好的理解欢迎在评论。
这部分官网还是比较好理解的,而且还是中文 操作符重载 建议去看下 举例:
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比较常用 } } 复制代码
总结:
方法只有一个参数的时候可以不用对象.方法名这种方式调用:
class Book { infix fun on(any: Any): Boolean { return false } } class Desk fun main(args: Array<String>) { if (Book() on Desk()) {//DSL比较常用 } } 复制代码
中缀表达式常用在DSL中,不建议使用,否则降低可读性
if语句:
fun main(args: Array<String>) { val mode = if (args.isNotEmpty() && args[0] == "1") { 0 } else { 1 } } 复制代码
不交条件 语句 而叫表达式,是因为Kotlin中时带 返回值 的
功能类似于Java中的switch,也是带有返回值的
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 ->后面的语句
这些属性都非常简单,直接用例子:
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= 不指定报错 复制代码
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 现在还不支持* 表示 复制代码
- *操作符可以展开数组,现在还不支持展开集合 - *操作符只用于变长参数列表的实参 - *操作符不能重载 - *不算一般意义上的运算符 复制代码