Code Kotlin学习笔记0x04

基本数据类型

根类型Any

Kotlin中所有的类有一个共同的超类Any,如果类声明时候没有指定超类,则默认为Any

Any 只有equals() hashCode() 和toString 三个函数

1
2
3
4
5
public open class Any{
public open operator fun equals(other: Any?):Boolean
public open fun hashCode():Int
public open fun toSting():String
}

基础类型

在Kotlin中一切皆是对象,所有类型都是引用类型,没有类似java中的基本类型。

数字类型

类型 宽度(Bit)
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8

上述各个数字类型均继承了Nummber类和Compare类

字面常量值

  • 十进制: 123
  • Long类型用大写的L标记 123L
  • 十六进制 0x78
  • 二进制 0b1111011
  • Float类型用F或者f标记 12.3f

    没有八进制哦!

另外Kotlin从1.1起允许使用数字字面值的下划线,提高可读性
100_000 等价于100000

123_456_789L 等价于123456789L

0xFF_D7_D7_D7 等价于 0xFFD7D7D7

0b1111_1111_1111 等价于0b111111111111

类型转换

值范围较小类型 不能进行隐式转换成值范围较大的类型,但是可以通过显式转换来转换类型

1
2
3
4
5
var i: Int = 1
var b: Byte = 2
i = b//可以直接进行
b = i//不可以直接进行
b = i.toByte()//显式转换

位运算

在Kotlin并不是使用特殊字符来进行位运算,而是使用中缀方式调用这些位运算的函数

1
2
val x = (1 shl 2) and 0x000FF00
//相对于在Java中的 x = (1<<2) & 0x000FF00
  • shl(bits) 有符号的左移 <<
  • shr(bits) 有符号的右移 >>
  • ushl(bits) 无符号的左移 <<
  • ushr(bits) 无符号的左移 <<
  • and(bits) 位与 &
  • or(bits) 位或 |
  • xor(bits) 位异或 ^
  • inv(bits) 位非 ~

String 字符串类型

Kotlin中,字符串用String 表示,String类不可以被继承

索引运算符

字符串中的元素 可以使用索引运算符进行访问

1
2
var str:String = "abc"
//s[0]即是a

索引运算符要考虑越界问题

原生字符串

原生字符串使用三个引号

1
2
var str = """我是原生字符串,
内部可以包含换行和其他特殊字符"""

字符串模板

在字符串中可以包含模板表达式,模板表达式由$开头

1
2
3
4
5
6
7
8
val h = 123
val str = "h is $h"
var str2 = "str.length is ${str.length}"
//str是h is 123
//str2是str.length is 3
在原生字符串中同样支持模板
val str3 = """str.length is ${str.length}"""
//str3是str.length is 3

数组类型

数组在Kotlin中使用Array类来表示

1
2
3
4
5
6
7
class Array<T> private constructor() {
val size: Int
operator fun get(index: Int): T
operator fun set(index: Int, value: T): Unit
operator fun iterator(): Iterator<T>
// ……
}

Kotlin 允许将不同类型的元素放到一个数组当中

1
2
3
4
5
6
7
8
fun main(args:Array<String>){
var arr = arrayOf(1,"2",true)
arr.forEach{
print(it)
print(" ")
println(it::class)
}
}
1
2
3
1 class kotlin.Int
2 class kotlin.String
true class kotlin.Boolean

这个时候Kotlin会把这个数组类型设置成java.lang.Object
但是当你使用具体的元素时候,这些元素又会对应自己各自的类型

原生数组类型

Kotlin中也有无装箱的开销的专门类来表示原生数组类型.
BooleanArray

ByteArray

CharArray

ShortArray

IntArray

LongArray

FloatArray

DoubleArray

BooleanArray

可空类型

Kotlin 中的null

1
2
3
4
5
6
7
8
null == null
//true
null != null
//false
null is Any
//false
null is Any?
//true

null对应的类型是Nothing?
null 可以进行加法运算

1
2
3
4
println(null + 7)
println(null+"777")
//println(7+null) 不合法 因为Int没有重载+ null
//println("777"+null) 不合法 因为String没有重载+ null
1
2
null7
null777

###安全调用?.

在Java中,为了防止传来的值是空值,经常会加上一个空判断处理

1
2
3
4
5
6
public static int getLength2(String str) throws Exception{
if(null==str){
throw str.length()
}
return str.length()
}

在Kotlin中,普通类型形如Int,String等类型是不允许指向null的,只有可空类型才可以指向null
可空类型就是在普通类型的后面接上一个?,如String?,Int?
可空类型的调用必须通过安全调用(?.)或者非空断言(!!.)进行调用

1
2
3
4
fun getLength(str:String?):Int?=str?.length
var s:String?="QAQ"
println(getLength(s))
//3

Nothing类型

Kotlin中没有类似Java 或者C语言中的函数没有返回值的标记void,但是拥有一个对应的Nothing类型。在Java中
返回void的方法,其返回值void是无法被访问到的,而java中的Void类型是可以获取到值,也可以当作值被打印输出,但是Void类型的返回值,返回值永远是null

在Kotlin中对应的就是Nothing?,它唯一的可被访问到的返回值也是null

类型转换与类型检测

is,!is运算符

is运算符可以检查对象是否与特定的类型相兼容,is运算符用来检查对象是否属于某个数据类型

1
2
3
4
5
6
7
"a" is String       //true
"a" !is String //false
1 is Int //true
null is Any //false
null is Any? //true
null is Nothing //false
null is Nothing? //true

大都数情况下,我们不需要在Kotlin中使用显示转换符,因为编译器会跟踪不可变值的is 检查,并在需要时候自动插入安全的转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
fun main(args:Array<String>){
println(strlen(1))
println(strlen(false))
println(strlen(123.1))
println(strlen("123"))
}
fun strlen(ani:Any):Int{
if(ani is String){
return ani.length
}else if(ani is Number){
return ani.toString().length
}else if(ani is Char){
return 1
}else if(ani is Boolean){
return 1
}
println("Not A String")
return -1
}

输出结果:

1
2
3
4
1
1
5
3

as 运算符

as运算符用于执行引用类型的显示类型转换,如果要转换的类型于指定的类型兼容,就会成功转换;如果不兼容,使用as?运算符就会返回null

参考资料

在线Kotlin IDE

To Be Continue

阅读量: