[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中因为有具名参数所以是没有要求的
- 具名参数 具名参数就在传入参数的同时,写上参数名称,如:
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 现在还不支持* 表示
代码语言:javascript复制- *操作符可以展开数组,现在还不支持展开集合
- *操作符只用于变长参数列表的实参
- *操作符不能重载
- *不算一般意义上的运算符