前言
以前用过Groovy,最近开始学习Kotlin,下面随手记录下学习的过程
说明文档
在线测试
Array 数组
定义
var arrays:Array
创建
val arrays = arrayOf(1,2,3,4)
val arrays = Array(5, { position -> (position * position).toString() })
5代表数组长度,后面是构建函数 position是下标
ByteArray ,ShortArray , IntArray...
val arrays:IntArray = intArrayOf(1,2,3,5,6,8,10)
val arrays:LongArray = longArrayOf(1,2,3,5,6,8,10)
String
初始化
val str = "啦啦啦"
//多行文本字符串
val text = """
for (c in "foo")
print(c)
"""
//"|"换行的连接符 trimMargin() 去除连接符,也可以用自定义的">" 然后trimMargin(">")
val text = """
|Tell me and I forget.
|Teach me and I remember.
|Involve me and I learn.
|(Benjamin Franklin)
""".trimMargin()
//$取值 下面输出结果是:abc.length is 3
val s = "abc"
val str = "$s.length is ${s.length}"
println(str)
//如果要输出$ 下面输出结果是:$9.99
val price = """
${'$'}9.99
"""
println(price)
流程控制
其他的自己看文档
for循环
val arrays:LongArray = longArrayOf(1,2,3,5,6,8,10)
for ((index, value) in arrays.withIndex()) {
println("arrays遍历的结果是:$value 下标:$index")
}
支持标签跳出某个循环,用@标识 例如 Mine@
//当i+j ==20的时候 跳出m1循环
m1@ for (i in 1..100) {
m2@ for(j in 1..50)
if(i + j == 20) {
break@m1
} else {
println("===========>$i")
}
}
class & Object
类定义
class Invoice {
...
}
构造方法
// 主构造方法
// constructor关键字 可以去掉 123是默认值
class Student constructor(stuId:Int = 123) {
val customField = stuId+100
init {
println("初始化Student()对象 $stuId $customField")
}
}
//外部调用
var stu1 = Student()
var stu2 = Student(222)
有参的构造方法
class Student constructor(stuId:Int) {
val customField = stuId+100
var stuName = ""
init {
println("初始化Student()对象 $stuId $customField")
}
//次要构造方法
constructor(name: String, stuId:Int) : this(stuId) {
stuName = name
}
}
无参的主次构造方法
class Teacher {
var teaName = ""
constructor(name: String) {
teaName = name
println("Teacher()对象 $teaName ")
}
}
继承 ( 构造方法 )
如果父类里面还要Primary构造,子类继承的时候
//关键字 open Kotlin建的类都是final的 open就是非final
open class Person(perName:String)
class Teacher(name:String) : Person(name){
var teaName = name
init {
println("Teacher()对象 $teaName ")
}
}
没有主构造方法,继承父类如下
class MyView : View {
constructor(ctx: Context) : super(ctx) {
...
}
constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs) {
...
}
}
继承 ( 覆写父类方法 )
open class Person(var perName:String) {
//必须加open 不加就相当于java的private final
open fun test() {
println("Person test method() $perName")
}
open fun move(){}
}
class Teacher(var teaName:String,id:Int) : Person(teaName){
var teaId = id
//必须加关键字override 否则编译报错
override fun test() {
super.test()
println("Teacher test method() $teaName")
}
//复写父类的方法 加final 不希望子类复写这个方法
final override move v() {}
}
//外部调用 输入结果: Teacher test method() 王老师
Teacher("王老师",189).test()
如果实现多个接口,有相同的方法,如何父类的方法
open class A {
open fun f() { print("A") }
fun a() { print("a") }
}
interface B {
fun f() { print("B") } // interface members are 'open' by default
fun b() { print("b") }
}
class C() : A(), B {
// The compiler requires f() to be overridden:
override fun f() {
super.f() // call to A.f()
super.f() // call to B.f()
}
}
抽象类
abstract class SuperCls {
abstract fun f()
}
class ExtendCls : SuperCls() {
override fun f() {
println("ExtendCls test f() ")
}
}