大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

函数与变量

开始学习走路之"Hello world!"
# java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}
#  kotlin
fun main(args: Array<String>) {
    println("Hello wolrd!")
}

上述为分别使用Java和Kotlin语言编写的"Hello World!" 程序(老七认为你是有Java基础的哦)
相比而言,Kotlin更为简洁,接下来我就为大家解释一下这段代码:

  • 关键字fun 用来声明一个函数,后接函数名.
  • 参数的类型写再参数名的后面 如 args: Array<String> 前面为参数,冒号后面为参数类型.
  • main 代表函数名为main,且为入口函数.
  • println 代表打印并换行,Java中是System.out.println().
  • 函数可以定义在文件的最外层,不需要放在类中.
  • 并且在每行代码结束的位置不需要再写分好来进行结束.
函数

在上面我们已经看到了怎么声明一个没有返回值的函数,那么如何声明一个有返回值的函数呢?返回类型应该放在哪里呢?如下:

fun max(a: Int, b: Int): Int {
    return if (a > b) a else b
}

fun main(args: Array<String>) {
    val max = max(a = 1, b = 2)
    println(max)
}

>>> 2

函数的声明以关键字fun开始,后面紧跟函数名称max.括号里面的是参数列表,参数列表后面跟着返回类型,它们之间用一个冒号隔开.

注意:
在Kotlin中,if是表达式而不是语句.
表达式和语句的区别在于,表达式有值,并且能作为另一个表达式的一部分使用.
而语句总是包围着它的代码块中的顶层元素,并且没有自己的值.
在Java中,所有的流程控制结构都是语句.
而在Kotlin中,除了循环(for,do和do/while)以外大多数流程控制结构为表达式.
另外一方面,Java中的赋值操作是表达式.而在Kotlin中反而是语句.

表达式函数体

由于上述代码的函数体部分是由单个表达式构成的,可以用这个表达式作为完整的函数体,并去掉括号和return语句:

fun max(a: Int, b: Int): Int = if (a > b) a else b

甚至于更为简化的省掉返回类型

fun max(a: Int, b: Int) = if (a > b) a else b

注:只有表达式函数体的返回类型可以省略.

变量

在Java中声明变量的时候会以变量类型开始,后面接变量名.
在Kotlin中是行不通的,因为许多变量声明的类型都可以省略.
所以在Kotlin中以关键字开始,然后是变量名字,最后可以加上变量类型(也可以不加).
当不指定变量的类型时,编译器会对变量的初始化值进行分析并将它的类型作为变量的类型,如果没有进行初始化,则必须指定变量的类型,因为编译器无法推断出它的类型.

val question = "How old are you"    >>>String
val answer = 42                     >>>Int
val ontherAnswer: Int = 42;         >>>Int
val name: String
    name = "爱笑的七叔阿"             >>>String
val price = 12.34                   >>>Double
可变变量与不可变量

声明变量的关键字有两个:

  • val(value) : 不可变引用.使用val声明的变量不能再舒适化之后再次赋值.对应java中的final变量.
  • var(variable) : 可变引用.变量的值可以改变.对应普通非final变量.
    默认的情况下,应该尽可能的使用val关键字来声明所有的Kotlin变量,仅在必要的时候换成var.
    在定义了val变量的代码块执行期间,val变量只能进行唯一一次初始化.但是,如果编译器能确保只有唯一一条初始化语句会被执行,可以根据条件使用不同的值来初始化它.例如:
val message: String
    if(true){
      message = "true"
    }else{
      message = "false"
    }

注:尽管val引用自身是不可变的, 但是它指向的对象可能是可变的.例如:

val languages = arrayListOf ("Java")
      languages.add("Kotlin")

使用var关键字允许变量改变自己的值,但是类型不能更改.

var answer = 111
    answer = 200     >>>true
    answer ="老七啊"  >>>fasle      Type mismatch  Required:Int Found:String 
字符串模板

修改"Hello World!" 如下:

fun main(args: Array<String>) {
    val name = if (args.size > 0) args[0] else "Kotlin"
    println("Hello,$name!")
}

上述代码在声明了一个变量name,并且在后面的字符串字面值中使用了它.和许多脚本语 言一样.Kotlin允许在字符串字面值中引用局部变量,只需要在变量名称前面加上字符$,等价于Java中的字符串连接.


fun main(args: Array<String>) {
    val name = if (args.size > 0) args[0] else "Kotlin"
    println("Hello,${args[0]}!")
}

使用${} 插入args数组中的第一个元素.
fun main(args: Array<String>) {
    println ("Hello, ${if (args.size > 0) args[0] else "someone"}!")
}

还可以在双引号中直接嵌套双引号,只要它们处在某个表达式的范围内(即花括号内):