Kotlin学习笔记2-1 基础-基本类型
来源:互联网 发布:淘宝vip专享 编辑:程序博客网 时间:2024/06/05 20:08
基础-基本类型
Kotlin官网:Basics-Basic Types
按照官网的说法,everything is an object
数值型在运行时会有特殊处理,但对于用户来说没有区别,所有数值型都可以类比成Java中的包装类,可以调用方法和属性。其中可空和不可空的基本类型在引用上有些不同。
数的类型
6种数值型特性和Java类似
注意都是大写开头。
字面值
和Java区别不大
整形10进制是字面值,16进制0x,2进制0b
*不支持8进制表示
Long类型用”L”大写L作为后缀
val a = 1 // Intval b = 0xFF // 16进制val c = 0b00001101 //2进制val b = 1L // Long
Double为字面值
Float加f或F后缀
val a = 123.5 // Doubleval b = 123.5e10 // Doubleval c = 123.6F // Float
下划线
Kotlin支持使用”_”下划线分割,不影响字面值,类似于金额中的”,”分割
比如val a = 1_000_000,就是val a = 1000000,只是方便阅读,不会影响程序执行
val b = 123_456Lval c = 0xFF_A0val d = 0b0000_1101
类型含义
比较分为”==“和”===“,==比较的是值相等,===比较的是引用相等
这里涉及到Kotlin的装箱,当声明为”可为空”时,会进行装箱,此时会导致引用的变化
例如:
val a: Int = 10000val b: Int = aval c: Int = aprint(b == c) // Prints ‘true’print(b === c) // Prints 'true' val boxedA: Int? = a val anotherBoxedA: Int? = a print(boxedA == anotherBoxedA) // Prints ‘true’print(boxedA === anotherBoxedA) // Prints ‘false’
显式转换
和Java不同,Kotlin不支持隐式的向上转型,所有的转换都必须显的声明,这个比较好理解,都当做对象使用,自然不能隐式互相转换。
任何数值都带有转换成其他类型的toXXX()方法,XXX为转换的目标类型,比如要将Int转成Long
val a = 1 //Intval b = a.toLong() //Long
支持不同类型的混合计算,这里的原理和Java不同。
在Java中,小范围值和大范围值计算是先将小范围值隐式向上转型后再和大范围值运算
int a = 1 + 2L;
在Java中是先将1转成1L再和2L相加,由于是自动完成的,用户感知不到
在Kotlin中不同类型的混合计算是通过调用重载的运算符方法实现的
val a = 1 + 2L
这里实际上是调用了1这个Int对象的plus方法
public operator fun plus(other: Long): Long
将2L作为参数传进这个方法,得到的val a实际是plus方法的返回值。
public operator fun plus(other: Long): Long
val a = 1 + 2L这句实际上等价于
val a = 1.plus(2L)
运算
数值支持基本的数学运算符
Kotlin中没有位运算符,但是有位运算方法,并且对运算符进行了重载
Kotlin是支持运算符重载的,这在后面的章节中会讲到
Java中位运算对应的Kotlin重载方法
记起来也很方便,就是缩写,sh = shift, l = left, r = right, u = unsigned
除了inv置反以外,其他位运算都可以写成方法和参数的形式,或者运算符号的形式
inv写成调用方法的形式,其他位运算按照普通运算符号写即可
val a = 1val b = a.inv() //置反val c = b shl a // b左移a位val d = b.shl(a) // 和 b shl a 等价
浮点数比较
普通数值比较和Java是相同的
Kotlin额外支持范围a..b,如x in a..b,x !in a..b
val a = 1println(a in 0..1) //trueprintln(a !in 0..1) //false
当浮点类型作为对象来使用时,也就是作为Any调用equals方法,或者作为Comparable调用ompareTo方式时,在Kotlin中有些特别
- NaN和NaN相等
- NaN大于任何其他浮点数,包括正无穷POSITIVE_INFINITY
- -0.0小于0.0
字符型(Char)
和Java不同,Kotlin中字符型不能直接当做数字使用,比如直接和数字判断相等会报错
val c = 'a'println(c==10) //报错
使用方法和Java完全相同,单括号声明变量值,支持转义字符,支持’\uFF00’的Unicode写法。
转义字符:\t, \b, \n, \r, \’, \”, \\ ,\$
Char也有toXXX()转数字方法,需要当数字用时显式转换即可,特性和数字型差不多,也有装箱后引用变化的问题
fun decimalDigitValue(c: Char): Int { if (c !in '0'..'9') throw IllegalArgumentException("Out of range") return c.toInt() - '0'.toInt() // Explicit conversions to numbers}
布尔(Boolean)
和Java基本相同,字面值”true”,”false”,装箱特性和数字相同。
布尔类型支持”||”,”&&”,”!”,不支持”|”和”&”
数组
Kotlin中使用Array<T>类表示Java中的T[]数组,重载了”[]”运算符实现a[i]形式的下标访问,添加了size属性(Java中的length)
创建方法可以使用lib中的函数(arrayOf),或者直接创建Array类
val a = arrayOf("1","2","3")val b = Array(3, { it.toString() })println(a.joinToString(","))println(b.joinToString(","))
输出结果:
1,2,3
0,1,2
Java中T[]类型数组可以赋值给Object[]型变量,如下是正确的
String[] a = new String[0];Object[] b = a;
而在Kotlin中,Array<T>型的实例不能赋值给声明成Array<Any>的变量,但是能赋值给Array<out Any>
val a:Array<String> = arrayOf("1","2","3")val b:Array<Any> = a //报错无法编译val c:Array<out Any> = a //正常
基本类型有对应的无需装箱的XXXArray类,和Array没有继承关系,用法相同
val x: IntArray = intArrayOf(1, 2, 3)x[0] = x[1] + x[2]
字符串
和Java类似,不可变,字面值为双引号,支持转义字符。
不同:
支持下标访问,支持for循环,可以看做一个CharArray。
支持原始字符串,用”“”三个引号括起来,不支持转义字符,支持换行。
有去缩进方法trimMargin(),默认使用”|”作为标记,可以自定义标记。
fun main(args: Array<String>) { val text = """ |Tell me and I forget. |Teach me and I remember. |Involve me and I learn. |(Benjamin Franklin) """ println(text) println(text.trimMargin()) println(""" (====== (Tell me and I forget. (Teach me and I remember. (Involve me and I learn. ((Benjamin Franklin) """.trimMargin("("))}
输出结果:
|Tell me and I forget. |Teach me and I remember. |Involve me and I learn. |(Benjamin Franklin)Tell me and I forget.Teach me and I remember.Involve me and I learn.(Benjamin Franklin)======Tell me and I forget.Teach me and I remember.Involve me and I learn.(Benjamin Franklin)
支持字符模板,支持变量,格式为”$变量名“,支持表达式,格式为”${表达式}”
val i = 10val s = "i = $i" // evaluates to "i = 10"val s2 = "i+1 = ${i+1}" // evaluates to "i+1 = 11"
原始字符串也支持模板,所以在不支持转义字符的情况下可以用模板实现同样效果
val price = """${'$'}9.99"""
- Kotlin学习笔记2-1 基础-基本类型
- Kotlin学习笔记——基本类型
- Kotlin学习笔记一基本类型
- Kotlin 学习笔记(一) 基本类型和基本语法
- Kotlin 学习笔记(1)基本语法
- kotlin学习笔记-2-基础语法
- android kotlin基础(二)-基本类型
- Kotlin基础(一)——基本类型
- Kotlin基础(一)--- 基本类型
- Kotlin 第三章:Kotlin 基础之基本类型
- kotlin(1):基本类型+包
- Kotlin基础语法学习笔记
- Kotlin学习笔记-基础语法
- kotlin 官方学习教程之基本类型
- 学习kotlin第五天_kotlin基本类型
- Kotlin学习(5):基本类型
- Kotlin学习-基本类型(三)
- Kotlin编码规范和基本类型--kotlin官方文档学习
- Lay ui 的时间插件 总是报错 Uncaught TypeError: laydate.render is not a function
- kotlin反射中的类引用
- ++i和i++的区别(C++)
- 《C++ Primer》读书笔记第十四章-2-函数调用运算符
- 手机设备的唯一标识符
- Kotlin学习笔记2-1 基础-基本类型
- python数值类型及输入输出
- 用C语言开发一个BT下载软件 (二) ------ 算法和策略
- 用C语言开发一个BT下载软件 (三) ------ 系统结构设计
- 《C++ Primer》读书笔记第十四章-3-类型转换运算符、二义性
- 网易云课堂推了个“行家计划”,要2年培育100位收入超500万的知识行家
- 亚马逊收购无线摄像头初创公司Blink
- Elon Musk真的要把特斯拉Roadster送上火星?
- 人工智能公司珊口智能SanKoBot斩获国际图像识别比赛大奖