Kotlin基础学习
- 性能——方法调用速度更快,因为不需要在运行时才来判断调用的哪个方法
- 可靠性——编译器验证了程序的正确性,因而运行时崩溃的概率更低
- 可维护性——抹身代码更容易维护,因为你可以看到代码中用到的对象的类型
- 工具支持——静态类型使IDE能提供可靠的重构,精确的代码补全特性
- 优点:减少代码量增加创建数据结构的灵活性
- 缺陷:在编译期不能通过编译期发现拼写类错误,继而导致在运行时出现错误
- 1、简洁
- 2、安全
- 3、扩展函数
- 4、函数式编程
- 5、高度互操作性
2. 没有静态修饰符
注:companion object为伴生对象
3. 编译方法数量
拓展:Intrinsics.checkParameterIsNotNull 方法其实很简单,原理:
数据类型
数字
| 类型 | 宽度 |
|---|---|
| Double | 64 |
| Float | 32 |
| Long | 64 |
| Int | 32 |
| Short | 16 |
| Byte | 8 |
Char 类型
Kotlin 中字符类型为 “Char”,和 Java 中不同的是,Kotlin 中的 Char 类型无法作为数字使用。如果需要将 Char 类型转换为 Int 类型,则可以直接调用"toInt" 方法。
Boolean 类型
Kotlin 中的 Boolean 类型和 Java 中的一样,只有两个值true 和 false。
数据类型的表示方式
- 字面常量十进制表示:1234,1234L(Long 类型)
- 十六进制表示:0x1234ABCD
- 二进制表示:0b00100010
- 不存在八进制表示
- Double 类型:123.45,123.45e10
- Float 类型:123.45F/f
- 使用"_"让数字更加易读
- 1234_5678_9L
- 0x12_34_56_78_AB
- 0b11010010_01101001_10010100_10010010
变量的初始化
在 Kotlin 中存在有 2 种变量 var 和 val。其中 var 表示的是“通常的变量”,val 则表示的是“不可变变量”,这可以类比 Java 中的 final 修饰的数据类型类型。
一切皆对象,所以不管是var还是val变量,都存在成员函数。而val变量不可变的本质就是它不存在 set 方法。所以,可以使用 var 去覆盖一个 val ,但是无法反过来为之。
Kotlin 中变量的初始化语句为:
val/var 变量名 : 变量类型 = 值,其中变量类型是可选的
需要注意的是,在 Kotlin 中不允许声明了一个变量但是却不去初始化它。
在 Kotlin 中,数据有以下的几种初始化方法:
val a :Int = 1 // 对变量 a 立即赋值
val b = 2 // 因为很容易推断出 b 的类型是 Int,所以变量类型可以省略,这种初始化方式后面使用时变量不可赋值为空
val b ?= null // 将 b 的值设置为 null(需要注意 Kotlin 是空类型安全的,每次使用之前需要判断是否为空)
val c = null!! // 将 b 的值强制设置为 null,则之后的代码不再做是否为空的安全检查
b.toLong // 会报错
c.toLong // 不会报错
运算符
隐式类型转换
因为表示的方法不同,较小类型的数据无法隐式转换为较大类型的数据。也就是说,无法在不同类型之间比较两个变量是否在“数值”上是否相等。另外,也不可以将较小类型的数据隐式赋值给较大的数据类型:
val a : Int ?= 1
val b : Long ?= 1
print(a == b) // 这里会产生一个错误, Int 类型和 Long 类型无法进行比较
/****************************************************************/
val a : Byte = 1
val b : Int = a // 错误,小的数据类型无法隐式装箱为大的数据类型,如果需要赋值应该写作: = a.toInt()
Boolean 类型的布尔运算
- || :短路逻辑或运算
- &&:短路逻辑与运算
- !:短路逻辑非运算
字符串
在 Kotlin 中字符串使用 String 类型进行表示。字符串是不可变的。字符串默认拥有迭代器,可以使用 foreach 进行遍历。
和 Java 中的字符串有一处显然的不同点,那就是 Kotlin 中的字符串除了拥有转义字符的赋值方式外,还存在类似于 Python 中那种通过三个引号进行的赋值方法,其中被三个引号括起来的所有文字,都是所见即所得的。
val text = """
for (c in "foo")
print(c)
"""
在这种字符串的赋值方式中,还有一种方法,用于去除前导空格。
val text = """
|Tell me and I forget.
|Teach me and I remember.
|Involve me and I learn.
|(Benjamin Franklin)
""".trimMargin()
在上面的例子中,默认使用"|"作为边界的前缀,如果想要使用其他的符号作为前缀,则将对应符号的字符作为传输传递入 trimMargin 函数。
字符串模板
Kotlin 的字符串应该吸收了很多脚本语言的字符串处理特性。它可以包含有模板表达式。所谓的模板表达式,你可以将其看作是很短的一小段代码。模板表达式由 $ 符号开头,后面紧跟随一个名称。这里的名称可以是某一个变量名。如果需要执行一些比较复杂的表达式,则使用花括号将表达式扩起来共同作为一个名称。
val strA : String = "abcd"
val strB = "$strA.length is ${s.length}" // abcd.length is 4
流程控制
条件语句
条件语句的形式为:if (condition) statement。作为扩展,还有 if ... else语句和多个 if 语句嵌套。
fun max(){
val a = 1
val b = 2
if (a > b) {
retrun a
}else{
return b
}
}
和 Java 中有点不同的是,if 中的分支可以是代码块,最后的一个表达式就作为该块的值。那么,上面的例子就可以写作:
fun man(){
val a = 1
val b = 2
if (a > b){
a
}else{
b
}
}
另外,if语句还可以作为表达式使用:
val max = if (a > b) a else b
在上述语句中,变量 max 的值最终是多少,需要看变量 a 和 b 的最终结果。
条件判断中的范围判断
在传统的 C 语言或者是一些其他的类似 C 的语言中,如果想要判断一个数是否在一个区间内,可能需要那么写:
if (i >= 5 && i <= 10) {
// do something
}
而在 Kotlin 中这一切就简化了许多:
if (i in 5..10) {
// do something
}
另外还有:
if (i !in 5..10) { if (!(i >= 5 && i <= 10))
// do something
}
循环语句
for 循环
需要注意的是,在 Kotlin 中,不支持那种 C 中的传统 for 循环。
使用迭代器
val items = lostOf("apple","banana","kiwi")
for (item in items) {
println(item)
}
使用索引
val items = lostOf("apple","banana","kiwi")
for (index in items.indices) {
println(${items[index]})
}
虽然不具备类似于 C 中那样的 for 循环,但是并不意味着 Kotlin 不可以实现那种需求:
for (i in 1..5) { // for (int i = 1;i <= 5;i++) {print(i)}
print(i) // 12345
}
需要注意的是,这里的 1..5 左右都是闭区间的。
for (i in 5..1) {
print(i) // 错误,没有任何输出
}
类似上面代码展示的这样,是无法进行输出的。如果想要逆序输出,那么你需要使用函数downTo 替代..:
for (i in 5 downTo 1) {
print(i) // 54321
}
以上的例子都是针对步长是1的情况,如果实际的步长不是1,那么需要使用 step 函数来指定步长:
for (i in 1..5 step 2) {
print(i) //1 3 5
}
另外,又有一些时候(大部分的时候)可能并不需要包括结束区间。那么,这时候需要使用到 until 函数来替代 ..:
for (i in 1 until 5) {
print(i) // 1234
}
while 循环
同类 C 语言。
do...while 循环
同类 C 语言。
多重选择 (when)
Kotlin 中不存在 switch...case...这样的表达式,取而代之的是 when 语句。
最简的 when 语句如下:
when (x) {
1 -> print(1)
2 -> print(2)
else ->print("null")
}
其中的 x 的值将会作为判断的条件,此 when 语句会逐一比对条件,如果找到任一匹配的条件,则执行->之后的语句块然后退出。假如所有的条件都不匹配,则会执行else对应的语句块。
和之前的if语句一样,when语句可以作为单独的表达式使用,也可以作为一个语句使用。如果它作为表达式使用,则对应块的值会作为此 when 的值,而每一个语句块的值是由该块最后一条语句所决定的。另外就是如果作为语句使用,则必须包含有 else,除非编译器能够确定每一个分支都已经覆盖到了(比如对于 Boolean 类型,则条件应该是 true 和 false,如果已经包含了这 2 个分支,则可以不需要 else。当然,随手添加一个 else 语句并不是什么坏习惯)。
相对于传统的类 C 语言,when 语句的条件要宽松很多。除了是一个固定的值,还可以是表达式:
when (x) {
parseInt(s) -> print("s encodes x")
else -> print("s does not encode x")
}
////////////////////////////////////////////
when (x) {
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}
Kotlin基础学习的更多相关文章
- Kotlin基础学习笔记(2)
1.基本数据类型 Kotlin的基本数值类型包括byte,short,int,long,float,double等.字符不属于数值类型,是一个独立的数据类型. 数字类型中不会主动转换.例如,不能给Do ...
- Kotlin基础篇(一)
写在前面: 因为工作需要,目前转安卓开发,用的IDE是AS3.2版本,语言的话,用的是Kotlin.由于之前是做.NET的,没接触过这方面的东西,所以完全是小白一枚.所以想着开个博客,以此来记录自己的 ...
- salesforce 零基础学习(五十二)Trigger使用篇(二)
第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...
- 如何从零基础学习VR
转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 近期很多搞技术的朋友问我,如何步入VR的圈子?如何从零基础系统性的学习VR技术? 本人将于2017年1月 ...
- IOS基础学习-2: UIButton
IOS基础学习-2: UIButton UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...
- HTML5零基础学习Web前端需要知道哪些?
HTML零基础学习Web前端网页制作,首先是要掌握一些常用标签的使用和他们的各个属性,常用的标签我总结了一下有以下这些: html:页面的根元素. head:页面的头部标签,是所有头部元素的容器. b ...
- python入门到精通[三]:基础学习(2)
摘要:Python基础学习:列表.元组.字典.函数.序列化.正则.模块. 上一节学习了字符串.流程控制.文件及目录操作,这节介绍下列表.元组.字典.函数.序列化.正则.模块. 1.列表 python中 ...
- python入门到精通[二]:基础学习(1)
摘要:Python基础学习: 注释.字符串操作.用户交互.流程控制.导入模块.文件操作.目录操作. 上一节讲了分别在windows下和linux下的环境配置,这节以linux为例学习基本语法.代码部分 ...
- CSS零基础学习笔记.
酸菜记 之 CSS的零基础. 这篇是我自己从零基础学习CSS的笔记加理解总结归纳的,如有不对的地方,请留言指教, 学前了解: CSS中字母是不分大小写的; CSS文件可以使用在各种程序文件中(如:PH ...
随机推荐
- 火币网API文档——REST API 签名认证
安全认证 目前关于apikey申请和修改,请在“账户 - API管理”页面进行相关操作.其中AccessKey为API 访问密钥,SecretKey为用户对请求进行签名的密钥(仅申请时可见).Pro站 ...
- 查看win10版本方法,及win10升级方法
点击左下角开始图标. 找到并点击左下方设置(齿轮形的图案). 点左上方的系统(笔记本电脑图案). 在左下方 点击关于.找到windows规格. 带大家解读Windows10的规格: 专业版功能较多 ...
- 手把手教你用 Git(转)
转自:http://blog.jobbole.com/78960/ 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统, ...
- PageHelper分页插件
在mybatis配置文件(SqlMapConfig.xml)中配置 <?xml version="1.0" encoding="UTF-8" ?> ...
- mac上命令行解压rar
时间进入到2018年12月,mac上好用的rar解压工具要收费了.被逼的没办法,用命令行吧,谁让咱擅长呢? 1,使用Homebrew安装unrar,没有自己装去 brew install unrar ...
- [LeetCode] 434. Number of Segments in a String_Easy
Count the number of segments in a string, where a segment is defined to be a contiguous sequence of ...
- matplotlib画的图保存为emf格式
在用matplotlib保存图片时,发现不能直接保存为emf格式.百度有人说要先另存为svg格式,再使用INKSCAPE软件转换成emf格式.我试了一下,发现还是不行,后来,发现先用matplotli ...
- MySQL--4操作数据表中的记录小结
最常用,最复杂的语句: 每一项的: 表的参照 From 条件 WHERE 进行记录的分组 GROUP BY 分组的时候对分组的条件进行设定 HAVING 对结果进行排序 ORDER BY ...
- ida脚本函数
#打印光标所在位置函数中地址和汇编代码 startaddr=GetFunctionAttr(ea, FUNCATTR_START) items = idautils.FuncItems(startad ...
- Cocos Creator scrollview添加事件的两种方法
scrollview添加事件 方法一这种方法添加的事件回调和使用编辑器添加的事件回调是一样的,通过代码添加, 你需要首先构造一个 cc.Component.EventHandler 对象,然后设置好对 ...