本系列文章作为学习 简单 的学习笔记,其目的在于2个:
本系列适合完全没有学过Kotlin并且像快速入门的同学,本人现在也是在学习中,所以作为笔记难免会有错误,如果我理解的不对或是有疑问,真诚希望可以在留言区大家进行讨论。
val b:Boolean=true 复制代码
定义类型格式 : 访问修饰符 修饰符 对象名:类名=具体赋值
变量的修饰符有2种:
val修饰类似于java中的final修饰,定义时必须初始化( 或在构造方法中或是init{}方法中 ), 但是不完全相同Kotlin常量用const修饰 。注意是不可变属性 不是静态属性
var是可变属性,可以不初始化,可以多次赋值
在kotlin中不像java,基本数据类型可以用小写的boolean声明。这里必须用他的装箱类来定义。
访问修饰符默认是public(java是defualt)
val l:Long=1231231L val l1:Long=1231231 val l2:Long=1231231l//error val f:Float=3f val f1:Float=3.0F val f2:Float=3.0//error val d1:Double=3.0 val s:Short=12712 val byte:Byte=127 复制代码
在java中有基本数据类型int对应的装箱类型Integer,Kotlin中是没有这个概念的Kotlin中的Int相当于int与Integer合体,编译器会帮我选择。
Kotlin中不存在隐式转换,如:
short s = 0; int i = 0; long l = 0; i = s; l = i; l = s; 复制代码
java中正确 Kotlin中
val s: Short = 0 var i: Int = 0 i = s.toInt() i = s//error 复制代码
与java基本一致,这里列出一些常用的转义字符
转义字符 | 含义 |
---|---|
/t | 制表符 |
/b | 光标后退一个字符 |
/n | 回车 |
/r | 光标回到行首 |
' | 单引号 |
" | 双引号 |
/ | 反斜杠 |
$ | 美元符号,Kotlin 支持美元符号开头的字符模板 |
val str: String = "str" val str1: String = String(charArrayOf('s', 't', 'r')) fun main(args: Array<String>) { println(str== str1) println(str=== str1) } 结果: true false 复制代码
Kotlin中== 相当于.equals()对象比较相等用 ===
val int1: Int = 1 val int2: Int = 2 println(" " + int1+ " + " + int2 + " = " + (int1 + int2)) println("$int1 + $int2 = ${int1 + int2}") //hello "world" //前面提到的转义字符 println("hello /"world/"") val s:String=""" /t /n hello World """ println(s) 结果: 1 + 2 = 3 1 + 2 = 3 hello "world" /t /n hello World 复制代码
"${}"字符串模板 """ """ 原始字符串 复制代码
直接将理论还是不够直观,所以直接上代码:
class 美女 private constructor(val 性格: String, val 长相: String, val 声音: String) {//1 constructor(性格: String, 长相: String, 声音: String, 三围: String) : this(性格, 长相, 声音)//2 constructor(性格: String, 长相: String) : this(性格, 长相, "动听") } class 帅哥(性格: String, 长相: String, 声音: String) : 人(性格, 长相, 声音) {//3 init {//4 println("帅哥: 性格:$性格,长相:$长相,声音:$声音") } } class Test{//5 val d: Double val i: Int constructor(double: Double, int: Int) { d = double i = int } constructor(double: Double) { d = double i = 0 } } open class 人(val 性格: String, val 长相: String, val 声音: String) { init { println("new 了一个${this.javaClass.simpleName}: 性格:$性格,长相:$长相,声音:$声音") } fun funA() { println(this.声音)//6 } } fun main(args: Array<String>) { val 我喜欢的妹子: 美女 = 美女("温柔", "甜美", "动听","三围") val 我膜拜的汉子: 帅哥 = 帅哥("彪悍", "帅气", "浑厚") val test1 = Test(2.0) val test2 = Test(2.0, 3) } 复制代码
这段代码有点长,但是内容非常简单,我也会分开来说
class <类名> 构造器(实参1/形参1,实参2/形参2){ } 复制代码
Kotlin的构造函数分为 主构造器 (primary constructor)和 次级构造器 (secondary constructor)。
简单理解就是写在类名后面的为 主构造器
写在类里面的为 次构造器
当主构造器被可见性修饰符修饰时,必须加上constructor关键字否则可以省略,如3处帅哥类
更多知识参考 Kotlin的构造函数
在Kotlin对函数有更严格的要求,如在Java中你可以写这样一个方法:
public String getName() { return null; } 复制代码
这样完全是没问题的,但是在Kotlin中却不可以
会提示错误,意思说你不能返回一个空字符串
PS:这里简单说下Kotlin中方法的定义:
<可见性修饰符> <其他修饰符> fun 方法名(形参1,形参2):<返回值类型>{ } 复制代码
这个不难理解,基本和Java一样都是固定格式,没什么好说的.
如果这个方法返回本省就可能为空怎么办呢?可以这样写:
fun getName(): String? { return null } 复制代码
String?表示他是一个可null的字符串,我们调用时可以这样:
fun getName(): String? { return null } fun main(args: Array<String>) { val nameB:String? = getName() println(nameB?.length)// } 复制代码
nameB?这样表示name不为空那么就输出长度,否则打印null,这样程序不会崩溃 但是还有一种情况如下:
val value:String ?= "HelloWorld" println(value!!.length) 复制代码
定义value是可空类型,但是我明确知道它不是null,那么我们可以使用value!!,表示我已经确定知道这个值不是null,不要给我报编译错误。
下面来看:
if (name != null) println(name.length) else return 等价于: val name: String = getName()?: return println(name.length) 复制代码
通过条件语句确定name一定不为空那么可以直接调用方法,这就是只能转换String?转String
Java中:
class Parent{ } class Chlid extends Parent{ public int age=11 } public void main(){ Parent parent=new Child() ((Chlid)parent).age } 复制代码
只有强转才能调用子类的方法,但是在Kotlin中却不用 如下:
val parentA: Parent = Chlid() if (parentA is Chlid) { parentA.age } 复制代码
is关键字,常用语判断,如果判断成立那么parentA就是Child不用强转 关于强转如下:
val chlidA: Chlid = parentB as Chlid//非安全强转失败crash val chlidB: Chlid? = parentB as? Chlid//安全强转失败为null 复制代码
总结:
◆ Java Style类型转换
◆ 安全类型转换
◆ 智能类型转换
关于区间比较简单 直接说下概念:
代码:
val rangeInt: IntRange = 1..1024//[0,1024] val range_exclusive: IntRange = 0 until 1024//[0,1024) val b: Boolean = true fun main(args: Array<String>) { println(rangeInt.contains(50)) println(rangeInt.contains(1024)) println(1024 in rangeInt) println(range_exclusive.contains(1024)) println(1024 in range_exclusive) for (i in range_exclusive) { println(i) } } 复制代码
数组的使用方法
基本操作
为了避免不必要的装箱和拆箱, 基本类型的数组是定制的如下:
例子:
val arrayInt: IntArray = intArrayOf(1, 3, 5, 7) val arrayChar: CharArray = charArrayOf('H', 'e', 'l', 'l', 'o') val arrayString: Array<String> = arrayOf("陈", "冠", "希") val array书记: Array<市委书记> = arrayOf(市委书记("张"), 市委书记("李"), 市委书记("王")) fun main(args: Array<String>) { println(arrayInt.size) for (i in arrayInt) { println(i) } println(arrayChar.joinToString(""))//连接字符 println(arrayString.joinToString(""))//连接字符串 println(array书记[1]) array书记[1] = 市委书记("赵") println(array书记[1]) println(arrayInt.slice(1..3))//表示的是下标 slice表示"切片" } 复制代码