引言
简介
Kotlin是JetBrains推出项目,是一种在Java虚拟机上运行的静态类型编程语言,也可以被编译成为JavaScript源码。在2011年7月推出之前,它已被开发一年之久。直到2016年2月15日,官方发布了第一个稳定的release版本 Kotlin v1.0。
基于JVM编程,这意味着Kotlin可以写服务器代码;
基于Android和Browser编程,这意味着不仅可以写客户端编程,连前端开发都可以;
基于Native编程,直接绕过JVM与底层代码打交道。
发展历史
2010立项
2011.6对外公开
2012.2开源
2013.8支持Android Studio
2014.6 全新的开源web站点和域名 Kotlinlang.org
2016.2发布1.0
2016.9发布1.0.4,支持apt
数据类型
Boolean数据类型
Kotlin中的Bolean类型和Java中的一样,只有两个值true和false。
与Java一样可以使用&&、||、!进行与或非操作
eg:
//Boolean
var num: Boolean = true
Number数据类型
主要包括整型和浮点型 跟java一样
分类 | 类型 | 位宽 |
---|---|---|
浮点型 | Double | 64 |
浮点型 | Float | 32 |
整型 | Long | 64 |
整型 | Int | 32 |
整型 | Short | 16 |
字节 | Byte | 8 |
eg:
//1.双精度 double
val aDouble: Double = 1.0
//2.Float
val aFloat: Float = 0.111F
//4.Int
val aInt: Int = 123123
//5.Short
val aShort: Short = 223
//6.long
val aLong: Long = 312381923882
//7.char
val aChar: Char = 'd'
//8.string
val aString: String = "啦啦阿拉阿娇活动空间撒成本,啊,是否萨克的纪念萨科的萨才能"
kotlin 数字字面量
eg:
//十进制
var a1 = 1
//十六进制
var a2 =0x1
//var a3 =01
//二进制
var a4 = 0b00000
//指数形式
var a5 = 1.2E10
char类型
占两个字节、表示一个16位的Unicode字符,单引号 ‘’ 引起来
eg:’a’ ‘0’ ‘\n’
转义符
转义字符 | 含义 |
---|---|
\t | 制表符 |
\b | 光标后退一个字符 |
\n | 光标回到行首 |
\r | Int |
\’ | 单引号 |
\” | 双引号 |
\ | 反斜杠 |
$ | 美元符号,Kontlin支持美元符号开头的字符串模版 |
eg:
//hello "张三"
println("hello\"张三\"")
//$1000
println("\$1000")
基本类型转换
不支持隐式转换
eg:
var anInt: Int = 2
var numLong: Long = anInt.toLong()
字符串
“一串”Char,用双引号 “” 引起来
eg:
val string1: String = "HelloKotlin"
var stringChars: String = String(charArrayOf('H', 'e', 'l', 'l', 'o', 'K', 'o', 't', 'l', 'i', 'n'))
字符串比较
string1 == stringChars 等价于equals
string1 === stringChars 比较对象是否为同一个 比较对象的引用值
字符串模版
格式的输出,支持字符串、表达式、函数
eg:
val string1: String = "HelloKotlin"
fun a():String{
return ",你好!"
}
println("${string1}!")
println("${1+3}")
println("张三${a()}")
拆箱装箱与Char数据类型
不在区分拆箱和装箱
类和对象
类申明
类是一个抽象的概念,是具有某些特征的事物的概括,不特定指代任何一个具体的事物
eg: 人、动物 …
定义:
和Java一样,Kotlin中使用关键字class来声明一个类。
//没有属性、方法的a类
class a{
}
类的申明包含三部分:类名、类头(指构造参数、构造方法等)、类体(用大括号包裹的部分)。类头和类体这两个部分并非必要的。
//没有属类头,类体的a1类
class a1
属性和赋值
//申明属性,并初始化
class a2{
var name = "张三"
var age = 12
}
属性延迟初始化
Kotlin提供了延迟初始化的方式来解决初始化的问题,使用关键字lateinit即可。
注:Kotlin并不支持对原生类型进行lateinit,因为Kotlin会使用null来对每一个用lateinit修饰的属性做初始化,而基础类型是没有null类型,所以无法使用lateinit。
//申明属性,并初始化,address延迟初始化
class a3{
var name = "张三"
var age = 12
lateinit var address: String
}
创建对象和访问属性
var a = a3()
a.address="丁家桥"
println("姓名:\t${a.name}")
println("年龄:\t${a.age}")
println("地址:\t${a.address}")
Kotlin的类会对每个声明的属性自动生成对应的get/set方法,只读类型的val只有get方法,可变类型的var有get/set方法。相比Java的get/set方法,Kotlin显得要简洁得多。
get/set方法
class a3{
var name = "张三"
var age = 12
get() {
//name的get/set方法输出一句话 field 是name 正真的值
println("我是${name}")
return field
}
Kotlin提供的备用字段(关键字field)的使用范围仅限于属性的get/set方法。
主构造函数
使用场景:属性需要在对象创建时就进行初始化,则需要用到自定义构造函数了。
Kotlin中的类可以拥有一个主构造函数以及多个次构造函数,主构造是类头的一部分,使用关键字constructor声明并且跟在类名之后。
//a4 属性name,age
class a4(name: String, age: Int) {
var name = name
var age = age
}
构造函数中的name和age是形参,类体中的name和age是类的成员变量。
当构造函数没有注解或者可见性声明时,constructor关键字可以省略不写。
但如果构造函数带有可见性声明和注解时,constructor关键字则不可省略,且可见性声明应该在constructor关键字之前。
//带有可见性申明
class a5 public constructor(name: String, age: Int) {
var name = name
var age = age
}
Kotlin类的主构造函数不能包含任何代码,所以,如果你想做一些初始化操作,可以使用init初始化代码块来完成。
class a5 public constructor(name: String, age: Int) {
var name = name
var age = age
init {
if (name != "李四") {
this.name = "李四"
}
}
}
Kotlin中,类属性既可以在声明出直接进行初始化,也可以在init代码块中进行初始化操作。(个人认为直接在实体中把形参赋给成员变量会直观一点)
次构(二级)造函数
次级构造函数不能省略consructor关键字。
当类拥有主构造函时,任何一个二级构造函数都需要直接或间接通过另一个二级构造函数代理主构造函数。
类中的一个构造函数代理另一个构造函数,需要使用关键字this。
class a6(age: Int) {
//z1 主构造函数
var name