val : 声明一个不可变的变量,对应java的final变量。
val name:String = "张三"
var: 声明一个可变的变量,对应java的非final变量。
var name:String = "张三"
lateinit : 延迟初始化关键字,不用在声明变量的时候立刻赋值
(::object.isInitialized 可用来判断一个变量或对象是否已经初始化
)
lateinit var name:String // 不用立刻赋值 也不会报错
name = "张三" //后续使用中进行赋值
if(! ::name.isInitialized){
Log.e("AAA","name 还未初始化")
}
Java基本数据类型 | Kotlin对象数据类型 | 数据类型说明 |
---|---|---|
int | Int | 整形 |
long | Long | 长整形 |
short | Short | 短整形 |
float | Float | 单精度浮点型 |
double | Double | 双精度浮点型 |
boolean | Boolean | 布尔型 |
char | Char | 字符型 |
byte | Byte | 字节型 |
a与b是参数," :Int "是返回值类型
fun add(a: Int, b: Int): Int {
return a + b
}
val value = if (a > b) {
a
} else {
b
}
val name = "张三"
val myName = when (name) {
"张三" -> "欢迎张三" //直接返回值
"李四" -> { println("李四来了") } //直接代码块运行
is String -> print("是String类型") //判断类型
else -> "未定义" //默认返回
}
for (i in 0..10) {
println(i)
}
倒序遍历:10到0:
for (i in 10 downTo 0) {
println(i)
}
有条件的遍历:
step 2:每次自加2
0 until 10 :不包含最后一个元素
for (i in 0 until 10 step 2) {
println(i)
}
class Person {
var name = ""
var age = 0
}
val person = Person()
open class Person {
var name = ""
var age = 0
}
class Student : Person(), Eat { //继承自Person,实现了Eat接口
override fun eat() {
print("我是学生,我属于人类,我会吃")
}
}
class Student(name: String, age: Int) { //此括号就是主构造函数,init相当于它的函数体
init {
print("我相当于主构造函数的函数体")
}
}
// 一个类既有主构造函数 又有 次构造函数 次构造函数必须调用主构造函数(包括间接调用)
class Student(name: String, age: Int) {
constructor(name: String) : this(name, 12) {
print("次构造函数")
}
}
interface Eat {
fun eat() {
print("我会吃")
}
}
class Student : Person(), Eat { //继承自Person,实现了Eat接口
override fun eat() {
super.eat()
print("我是学生,我属于人类,我会吃")
}
}
修饰符 | Java | Kotlin |
---|---|---|
public | 所有类可见 | 所有类可见(默认 |
private | 当前类可见 | 当前类可见 |
protected | 当前类、子类、同一包路径下的类可见 | 当前类、子类可见 |
default | 同一包路径下的类可见 | 无 |
internal | 无 | 同一模块中的类可见 |
data class DataBean(val name: String, val age: Int) {
// 没有类体 可以省略大括号
}
val dataBean = DataBean("张三", 18)
// get
println(dataBean.name + dataBean.age)
// set
dataBean.name = "李四"
dataBean.age = 20
println(dataBean.name + dataBean.age)
打印结果:张三18
李四20
// 在Koltin中我们不需要私有化构造函数,也不需要提供getInstance()静态方法,
//只需要把class关键字改为object,就完成了单例类的创建
object Singleton {
fun test(mlog: String) {
println(mlog)
}
}
Singleton.test("我是单例类") // 调用了Singleton中的test()函数
密封类创建(新建kotlin File 使用关键字sealed class来创建):
sealed class TestSealed
class Test1(val msg: String) : TestSealed() // 继承了密封类
class Test2(val erroe: String) : TestSealed() // 继承了密封类
与when配合使用的优点:
fun getResult(testSealed: TestSealed): String = when (testSealed) {
is Test1 -> "t1"
is Test2 -> "t2"
}
var name:String //不可空变量
var name:String? //可空变量
var bean:Bean? //可空变量
bean?.getName() // ?. 操作符:当对象为空时什么都不做,不为空时正常运行
var age = bean?.getAge ?: 18 // ?: 操作符:左边表达式不为空就返回左边结果,否则返回右边结果
bean!!.getId // !!. 操作符:确定此处不会为空,不再进行空指针检查
使用 $ 操作符
val name: String = "张三"
println("我是$name,请多关照!")
val bean = Bean()
println("我是${bean.getName()},请多关照!")
fun add(a: Int = 1, b: Int = 1): Int { //参数默认值
return a + b
}
add(b = 2, a = 2) //指定传参(参数顺序可颠倒)
var bean:Bean? =null
// 不用let函数(每次都需要使用?.操作符)
bean?.getName()
bean?.getAge()
//注意下面这种方式在bean为全局变量时会报错
if (bean != null) {
bean.getAge()
bean.getName()
}
// 使用let函数(正常写Lambda)
bean?.let { b ->
b.getName()
b.getAge()
}
// 使用let函数(当Lambda只有一个参数时,可以省略不写,直接用it代替)
bean?.let {
it.getName()
it.getAge()
}
val value = with(bean) {
// 这里时bean的上下文,可直接调用bean中的方法
val name = getName()
val age = getAge()
name + age.toString() //最后一行作为返回值
}
val value = bean.run {
// 这里时bean的上下文,可直接调用bean中的方法
val name = getName()
val age = getAge()
name + age.toString()//最后一行作为返回值
}
实用小例子:
// 跳转界面需要传多个值,使用apply
val intent = Intent(context, SencondActivity::class.java).apply {
// Intent的上下文,可直接调用Intent中的方法
putExtra("param1", "data1")
putExtra("param2", "data2")
}
context.startActivity(intent)
object Singleton {
fun test(mlog: String) {
println(mlog)
}
}
Singleton.test("哈哈")
class Util {
companion object { // 写在伴生对象中的方法是静态方法
fun test() {
// 我是静态方法
}
}
fun test1() {
//我是普通方法
}
}
Util.test() //调用静态方法
val util = Util()
util.test1() //调用普通方法
//单例类
object Singleton {
@JvmStatic
fun test() {
// 我是静态方法
}
}
//伴生对象
class Util {
companion object {
@JvmStatic
fun test() {
// 我是静态方法
}
}
}
未完待续。。。