Kotlin——基础类型

Kotlin的基础类型

与Java相同,Kotlin也是一门强类型语言

  1. 所有的变量必须先声明后使用
  2. 指定类型的变量只能接受类型与之匹配的值

标识符规则

Kotlin语言是区分大小写的

  • 标识符由 数字、字母、下划线组成,不能以数字开头
  • 标识符不能是Kotlin的硬关键字,在特定上下文中不能使用软关键字和修饰符关键字,但可以包含关键字
    • 硬关键字:这些关键字无论在什么情况下都不能用作标识符
    • 软关键字:这些关键字可以在他们不起作用的上下文中用作标识符
  • 标识符不能包含空格
  • 标识符只能包含下划线(_)

声明变量

Kotlin要求所有的变量必须先声明、后使用。声明变量时必须显式或隐式指定变量的类型

var|val 变量名:[类型][=初始值]
  • var声明的变量是值可变的
  • val声明的变量是值不可变的

Kotlin编译器可以根据初始值确定变量的类型,所以声明变量的语法中,变量的类型可以省略。但不能声明变量时既不指定变量类型,也不指定变量初始值

//声明变量时指定类型
var b:Int
//声明变量时指定初始值
var c = "test123"
//显式指定的类型与赋值类型一致,正确
var age = 25
age = 13
//显式指定类型与初始值不一致 错误
var sun: String = 500
//使用val声明的变量是不可变变量,不能重新被赋值
val book = "Kotlin"
book = "kkk"

使用Val声明的不可变变量相当于常量,也就意味着它的值一旦被初始化之后,将不可以被重新赋值

整型

Kotlin提供了4种整型

  • Byte:Byte型整数在内存中占8位。兼容Java的byte和Byte类型
  • Short:Short型整数在内存中占16位。兼容Java的short和Short类型
  • Int:Int型整数在内存中占32位。兼容Java的int和Integer类型
  • Long:Long型整数在内存中占64。兼容Java的long和Long类型

Int型是Kotlin最常用的整数类型,如果声明一个常量或变量时没有指定数据类型,只是简单指定了初始值为整数值,那么Kotlin会自动判断该变量的类型为Int

Kotlin的整型类型与Java不同,Kotlin的整型不是基本类型,而是引用类型(Java的包装类),Byte、Short、Int、Long都继承了Number类型。

程序可通过访问不同整数类型的MIN_VALUE和MAX_VALUE属性来获取对应类型的最大值和最小值

Kotlin是null安全的语言,因此Byte、Short、Int、Long型变量都不能接受null值,如果要存储Null值,则应该使用Byte?、Short?、Int?、Long?类型

Kotlin语言允许在已有的数据类型后面添加"?"来使数据类型可以存储Null值

普通类型的整型变量将会映射成Java的基本类型

带"?"后缀的整型变量将会映射成Java基本的包装类

var pm1 : Int = 200  //java int
var pm2 : Int = 200  //java int
println(pm1===pm2)//类型比较 true
var ob1 : Int?=200  //Java Integer
var ob2 : Int?=200  //Java Integer
println(pm1===pm2) //引用类型比较 false

===:比较引用运算符要求两个变量引用同一个变量,返回true

==: 比较值

Kotlin的整数数值的表示方式

  • 十进制
  • 二进制 以0b或0B开头的整数数值
  • 十六进制:以0x或0X开头的整数数值

Kotlin不支持八进制的整数

浮点型

Kotlin的浮点型有两种

  • Float:32位浮点型
  • Double:64位双精度浮点型

kotlin的浮点数有两种表示形式

  • 十进制数形式:5.12、0.123
  • 科学计数:5.12e2、5.12E2

如果声明一个常量或变量时没有指定数据类型,只是指定了其初始值为浮点数,那么Kotlin会自动判断该变量的类型为Double

字符型

字符型值必须使用单引号('')括起来

与Java不同,Kotlin的Char型变量不能当成整数值使用,Char型变量或表达式不能赋值给整型变量,整型变量或表达式也不能赋值给Char变量

val aChar:Char='a'
val enterChar:Char = '\r' //转义字符
val ch:Char = '\u9999' //输出Unicode编码

数值型之间的类型转换

整型之间的类型转换

Kotlin与Java不同,Kotlin不支持取值范围小的数据类型隐式转换为取值范围大的类型

由于不同整型支持的表数范围存在差异,因此进行类型转换时必须注意选择合适的类型

  • toByte() 转换为Byte类型
  • toShort() 转换为Short类型
  • toInt() 转换为Int类型
  • toLong() 转换为Long类型
  • toFloat() 转换为Float类型
  • toDouble() 转换为Double类型
  • toChar() 转换为Char类型

不同整型的变量或值之间必须进行显式转换

var bookPrice : Byte = 79
var itemPrice : Short = 120
//类型转换错误
var a :Short = bookPrice
//显式类型转换
var a : Short= bookPrice.toShort()
var b : Byte = itemPrice.toByte()

浮点型与整型之间的转换

浮点型之间需要进行显式转换,浮点型与整型之间也需要进行显式转换

var width: Float = 2.3f
var height: Double = 4.5d
var a : Double = width.toDouble()
//area的类型也被推断为Float
var area = width*height.toFloat()

表达式类型的自动提升

当一个算术表达式包含多个数值型的值时,整个算术表达式的数据类型将发生自动提升。Kotlin定义了与Java基本相似的自动提升规则

  • 所有的Byte、Short将被提升成Int类型
  • 整个算数表达式的数据类型自动提升到表达式中最高操作等级数同样的类型

Boolean类型

布尔型只有一个Boolean类型,只能是true或false 不能用0或非0来代表

var b1:Boolean  = true
var b2 = false  

null安全

非空类型和可空类型

var str = "hello"
var num:Int = str.toIntOrNull() //str可能为空 无法通过编译

var num:Int? = str.toIntOrNull() //可以通过编译

对于可能发生值缺失的变量,编译器会自动推断该变量的类型为可空类型

var n = str.toIntOrNull()

只有可空类型的变量或常量才能接受Null,非空类型的变量或常量不能接受Null

Kotlin中如果不加任何处理,可空类型不允许直接调用方法、访问属性。通过可空类型与非空类型的区分,可以避免空指针异常

var aStr = "fkit"
var bStr:String = "fkit"
aStr = null //错误 aStr为非空类型,不接受Null
bStr = null //正确

先判断后使用

可空类型的变量不允许直接调用方法或属性,但可以先判断该变量不为null,然后再调用该变量的方法或属性

var b:String? = "fkit"
var len = if(b!=null) b.length else -1 //先判断后使用

安全调用

安全调用在Java中已经存在,如下面的SpringEL

user?.dog?.name

上面的表达式表示:如果user不为null,则返回user的dog属性,如果dog属性值不为Null,则继续获取dog的name属性值,如果user为null或user.dog为null,整个表达式返回null 并不会NPE

在Kotlin中

var b:String?="fkit"
println(b?.length)// 输出4
b = null
println(b?.length) //输出null

Elvis运算

Elvis运算其实就是if else的简化写法

var b:String?="kit"
var len1 = if(b!=null) b.length else -1
println(len1)
//elvis
var len2=b?.length?:-1

强制调用

Kotlin中使用 “!!.”即可强制调用空变量的方法或属性

var b:String?="fikt"
println(b!!.length)//输出4

字符串

字符串类型

字符串表示一个有序的字符集合

String允许通过s[i]的语法来访问字符串指定索引处的字符,也可以通过for循环遍历字符串中的每一个字符

  • 转义字符串:转义字符串可以有转义字符
  • 原始字符串:原始字符串可以包含换行和任意文本,原始字符串需要使用3个引号引起来
//普通字符串
var str = "fkit"
//原始字符串
var oriStr = """|aasda
                                |sdasd
                                |asdas
                                |dad"""

Kotlin使用竖线作为边界符,所有竖线之前的内容都会被去掉

字符串模板

Kotlin允许在字符串中嵌入变量或表达式,需要将变量或表达式放入${}中,这样Kotlin将会把该变量或表达式的值嵌入该字符串中

字符串模板不仅可以在普通字符串中使用,也可以在原始字符串中使用

val bookPrice = 79
var s = "图书的价格是${bookPrice}"

Kotlin字符串的方法

Kotlin和Java的String提供的功能大致相似,Kotlin提供了一系列toXxx()将字符串转换成其他数值的方法

val s1 = "2.34"
//转Double
val d:Double = s1.toDouble()
//Int
val i:Int = s1.toInt()
  • capitalize() 首字母大写
  • Decapitalize() 首字母小写

类型别名

Kotlin可以为已有的类型指定另一个可读性更高的名字,Kotlin提供typealias来定义类型别名

typealias 类型别名 = 已有类型
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容