前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kotlin学习笔记(三)-程序结构(下 )

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

作者头像
g小志
发布2019-12-19 19:20:51
6570
发布2019-12-19 19:20:51
举报
文章被收录于专栏:Android常用基础

[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
复制
- *操作符可以展开数组,现在还不支持展开集合

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

- *操作符不能重载    

- *不算一般意义上的运算符  
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 操作符重载(运算符重载)
      • 表达式(中缀表达式,分支表达式,when表达式)
        • 默认参数 变长参数 具名参数
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档