开篇寄语
伯衡君学习完Golang这门编程语言后,开始将掌握Kotlin这门编程语言方法提上日程了,带着之前的经验学习还挺快,从2019年开始不少开发者编写安卓应用逐渐抛弃Java,开始拥抱Kotlin,正是看出了它前途不可限量,伯衡君准备一边学习,一边在本篇文章来完整的将一些主要知识,以及学习中的笔记记录在此。
前情提要
内容详情
Kotlin 是一种现代编程语言,简洁、安全、实用,并且专注于与 Java 代码的互操作性。它几乎可以在当今使用 Java 的任何地方使用:用于服务器端开发、Android 应用程序等等。
基础概念
- Hello World
fun main() { println("Hello, World!") }
以上就是一个最简单的kotlin函数,println()这个函数类似于python的print(),javascript的console.log()等等。
- 数据类型
- Kotlin中每个值都有它的数据类型,以下是最常用几种:
- Int:整数类型(如:1,2,3)
- Double / Float:浮点数类型(如:1.21,9.99)
- Char:字母(如:'a')
- Boolean:逻辑值true或者false
- String:字符串
- Kotlin中每个值都有它的数据类型,以下是最常用几种:
- format
- 类似于python的format,或者是javascript的`${}`
举例如下:
val a = "World" val helloWorld = "Hello $a"
- 变量
- 变量用于存储数据
每个变量都有一个类型,用于定义它所保存的数据的类型。使用 var 关键字声明变量:
var num: Int = 42
除了使用 var 关键字声明变量,还可以使用 val 关键词来声明:
val num: Int = 42
那么,既然都可以,二者的区别是什么呢?val赋值的变量不可改变值。
赋值方法还可以不必添加数据类型,Kotlin会自动推断出它的数据类型:
val name = "Zhang" var num = 12345
- 数学运算
- 包括"+",“-”,“*”,“/”,“%”,“++”,“--”,“+=”,“-=”等等,类似于Javascript
- 逻辑运算
- 包括“>”,“<”,“>=”,“<=”,“==”,“!=”等等,类似于Javascript
- 注释
- 单行注释:以“//”为开头
- 多行注释:以“/* */”为区间中填写
//单行注释 /* 多 行 注 释 */
- 用户输入
- 可以使用 readLine() 函数将值作为用户的输入,举例如下:
fun main() { var age = readLine() println("You entered " + age) }
- 数据转换
- 字符串整数转整数:“12345”.toInt()
- 字符串浮点数转浮点数:"1.234".toFloat()或者“1.234”.toDouble()
- 其他数据类型转字符串:1.24331121.toString()
控制流程
- if/else
- if 语句允许代码在满足条件时运行,也与Javascript的控制流程类似。
fun main() { val num = -7 if (num > 0) { println("Positive") } else if (num < 0) { println("Negative") } else { println("Zero") } }
- ternary operator
- 大多数编程语言是这样这样表示 a ? b : c
- 而在Kotlin则是if(a) b else c,举例如下:
fun main(args: Array<String>) { val num = -7 val result = if (num > 0) "Positive" else "Negative" println(result) }
- when
- if/else的另一种写法,显得更加方便
fun main() { val num = -7 val result = when { num > 0 -> "Positive" num < 0 && num > -10 -> "Negative and Greatter Than -10" num <= -10 -> "Smaller and Equal Than -10" else -> "Zero" } println(result) }
- while
- 只要给定的条件为真,while 循环就用于重复一段代码。
fun main() { var i = 1 while (i <= 5) { println("Hello") i++ } }
- break和continue
- break:中断,程序终端
- continue:跳过,程序继续
以上都和javascript很类似。
数组
- 基本样式
- Kotlin的Array数组样式与php很像,它的表示如下例所示:
- 每一项的位置也是从零开始
var contacts = arrayOf("I", "Love", "You") println(contacts[0]) //输出为“I”
- mapOf
- 类似于javascript中的Object,或者是ruby的hash,或者是python的dictinary
val map = mapOf(1 to "www", 2 to "luckydesigner" , 3 to "space") println(map) //输出结果为{1=www, 2=luckydesigner, 3=space}
- for循环
- 有点类似于python的for循环,试举例如下:
//循环数组 fun main() { var nums = arrayOf(2, 4, 6) for (x in nums) { println(x) } } //循环字符串 fun main() { val name = "zhangboheng" for (x in name) { println(x) } }
- range
- Kotlin 允许您使用以下简单语法轻松创建值范围,在这一点上和ruby和swift这两门编程语言很类似
- 数字范围,字母范围等等,试举一例
fun main() { for (i in 2..5) { println(i) } } //可以生成2,3,4,5 fun main() { for (x in 'a'..'c') { println(x) } } //可以生成"a","b","c" fun main() { for (i in 2 until 5) { println(i) } } //可以生成2,3,4 fun main() { for (x in 'a' until 'c') { println(x) } } //可以生成"a","b"
函数
- 函数是一组用于执行任务的相关代码,之前介绍的println()函数就是属于这种
- 构造函数,首先是有一个fun这个关键词,接着是函数名称,如main(),在括号中,可以添加arguments
fun welcome(name: String) { println("Hello, " + name) }
- 调用函数
- 构建一个函数后进行调用,试举一列
fun divide(x: Int, y: Int): Int { return (x-y) } fun main() { var result = divide(4, 1) println(result) } //结果为3
另一种更为简洁的写法,可以是这样:
fun main() { val f = { a:Int, b:Int -> a - b } var result = f(4, 1) println(result) } //结果为3
- foreach
- Kotlin 提供了一个 forEach 循环,它接受一个函数,定义对每个数组元素执行的操作,类似于php的foreach
fun main() { var arr = arrayOf(1, 3, 5) arr.forEach { item -> println(item * 4) } } //另外一种更简洁的方法 fun main() { var arr = arrayOf(1, 3, 5) arr.forEach { println(it * 4) } }
- 高阶函数
- 一个函数可以接受另一个函数作为参数,这些函数称为高阶函数。
fun apply(x:Int, action: (Int) -> Int): Int { return action(x) } fun main() { println(apply(4, {x -> x*2})) println(apply(4, {x -> x/2})) }
- filter
- 类似于Javascript语言中的filter,可以进行数组的筛选,试举一例
fun main(args: Array<String>) { val arr = arrayOf(42, 3, 10, 4, 6, 1) val res = arr.filter({ it % 2 == 0 }) println(res) }
面向对象
- Classes
- 一个类就像一个蓝图——它定义了我们将要建造的房子的细节
class User { var name = "" var age = 0 } fun main(args: Array<String>) { val u1 = User() u1.name = "Zhang" u1.age = 29 println(u1.name) }
- Constructors
- 构造函数允许您在创建对象时初始化属性,构造函数使用类名后的括号定义,并包含我们想要的属性:
class User { var name = "" var age = 0 constructor(nm: String) { name = nm } constructor(nm: String, v: Int) { name = nm age = v + 2 } } fun main() { val u1 = User("James", 42) val u2 = User("Amy", 20) println(u1.name) println(u2.age) }
- Getters & Setters
- 如字面意思,set()可以在类中设值,get()可以在类中返回值
class User { var name = "" var age = 0 get() = field-1 set(value) { if(value < 0) { field = 18 } else { field = value } } } fun main() { val u = User() u.age = -4 println(u.age) }
- method
- 一个类可以有定义行为的函数,比如下面的例子就是让用户输入字符,然后会返回“Login from user xxx”这样的结果
class User(var name: String, var age: Int) { fun login() { println("Login from user " + name) } } fun main() { var input = readLine()!! var u = User(input, 42) u.login() }
- 类的继承
- 继承是 OOP 中的一个重要概念,它允许您基于其他类创建类,继承它们的功能,试举一例
open class User(var name: String, var age: Int) { } class Admin(name: String, age: Int): User(name, age) { } class Moderator(name: String, age: Int, var country: String): User(name, age) { } fun main(args: Array<String>) { val b = Moderator("Amy", 23, "USA") println(b.country) }
温馨提示:继承的话千万别忘记open开头哦
- 可见性修改器
- Kotlin 提供了可见性修饰符来限制对属性和方法的访问
- public:无限制访问
- protected:仅对子类可访问
- private:从外部无法访问
我们来看一下区别
//private class User(var name: String, private var age: Int) { } fun main() { val u1 = User("Zhang", 29) println(u1.age) } //生成结果是:Cannot access 'age': it is private in 'User' //public class User(var name: String, public var age: Int) { } fun main() { val u1 = User("Zhang", 29) println(u1.age) } //生成结果是29 //private class User(var name: String, protected var age: Int) { } fun main() { val u1 = User("Zhang", 29) println(u1.age) } //生成结果是:Cannot access 'age': it is private in 'User'
- Abstract Classes
- 抽象类,留意override
abstract class User(var name: String, var age: Int) { abstract fun display() } class Admin(name: String, age: Int): User(name, age) { override fun display() { println(name + " is " + age + " years old") } } class Moderator(name: String, age: Int, var country: String): User(name, age) { override fun display() { println(name + " is from " + country) } } fun main() { val a = Moderator("James", 42, "USA") a.display() val b = Admin("Amy", 19) b.display() }
- 我的微信
- 微信扫一扫加好友
- 我的微信公众号
- 扫描关注公众号