0、这些系统的学习Kotlin,不过不想按部就班,而是想到哪学到哪,看不懂哪里就学在哪里
1、我司产品,新需求,均采用Kotlin开发,原谅我总想打成Kotalin,大家也要注意了
Kotlin、Kotlin、Kotlin,写上三遍,还能忘掉?
2、Kotlin文件最顶端的package关键字,是倒入包,与java的区别在于,已经不再写分号了,牛13
package com.cmcm.user.login.view.activity
等同于java中的
package com.cmcm.user.login.view.activity;
3、倒入类同样也把分号干掉了,牛13
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.graphics.Bitmap
import android.os.Bundle
4、类的一个定义,与java相比省略了public,现在我们引入Kotlin中类的一个语法规则
class SlidingBlockVerifyActivity : BaseActivity(), View.OnClickListener, View.OnTouchListener, SlidingBlockVerifyPresenter.Companion.Callback {
}
Kotlin中没有添加修饰符直接以class开头的都是final类,并且是public
也就是说SlidingBlockVerifyActivity是个final类,也是public
5、让我们继续类的一点知识
class SlidingBlockVerifyActivity : BaseActivity(), View.OnClickListener, View.OnTouchListener, SlidingBlockVerifyPresenter.Companion.Callback {
}
等同于java中的
public final class SlidingBlockVerifyActivity extends BaseActivity implements View.OnClickListener, View.OnTouchListener, SlidingBlockVerityPresenter.Companion.Callback{
}
因为java中没有Companion这个关键字,所以,java中,假设为静态内部类哈
关键字仍然是class
:后面跟的是父类
逗号隔开父类,其父类的后面都是实现的接口
父类:BaseActivity()
接口:View.OnClickListener, View.OnTouchListener, SlidingBlockVerifyPresenter.Companion.Callback
总结一下
SlidingBlockVerifyActivity继承了一个父类,实现了三个接口
6、这是关于Kotlin中变量的知识:var与val
var mSlidingPercent: Int = 0
var mCheckPicId: String = "0"
var mDownX: Int = 0
var mMobile: String? = "0"
var mBgFinish = false
var mBlockFinish = false
var mVerifySuccess = false
在Kotlin中,变量使用var修饰,只要是变量一定是var修饰
var、var、var, 要写三遍
语法规则:var 变量名: 变量类型 = 初始值
例如:
var mCheckPicId: String = "0"
等同于java中的
String mCheckPicId = "0";
感觉变量类型在初始化的时候可以省略哈,感觉,慢慢再去看
在看val的语法规则
在Kotlin中,val修饰的变量,就是常量
val mCheckFlag:String ="hello world"
等同与java中的
final String mCheckFlag = "hello world";
………………………………………………………………………………华丽丽分割线……………………………………………………………………
val mDefaultWidth = 277
val mDefaultHeight = 492
等同于
final int mDefaultWidth = 277;
final int mDefaultHeight = 492;
7、访问权限先放一放,另外在Kotlin中的类是可以直接继承Java中的类,牛13,就是这么形成
8、Kotlin中的companion,看这B形,就知道这是个关键字了,而且目前我所知,java中肯定没有这个关键字
a、
companion object {
val REQUEST_DEFAULT: Int = 1001
val PARAMS_MOBILE: String = "params_mobile"
fun launchActivityForResult(context: Activity, moblie: String, requestCode: Int) {
val intent = Intent(context, SlidingBlockVerifyActivity::class.java)
intent.putExtra(PARAMS_MOBILE, moblie)
context.startActivityForResult(intent, requestCode)
}
}
9、第九条,决定放个Tips:
如果不知道如何在Kotlin中写一个相当简单的Java表达式。这里有一个简单的诀窍,就是在AndroidStudio的Java文件中编写一段代码,然后将其粘贴到kt文件中,它会自动转换为Kotlin。
10、Kotlin的优势
a、易表现:可以编写少得多的代码
b、更安全:Kotlin对null是安全的,就是说在编译期间就处理了各种null的情况,避免了运行时的异常。节约很多调试NullPointerException的时间
c、易扩展:就算我们没有权限去访问这个类中的代码,我们可以扩展这个类,以获得更多的特性
d、函数式:虽然Kotlin是基于面向对象的语言,但它使用了很多函数式编程但概念,例如使用lambda表达式(懵逼中),其中很棒但特性就是Collections但处理方式
e、兼容性:可以继续使用所有java写但代码和库,一个项目中,可以使用Kotlin和Java两种语言混合编程(公司产品)
11、看个Kotlin中的实体类,即Bean,有多牛逼
a、Kotlin中的数据类,即data修饰的,会自动生成所有属性和它们的public API,并自动生成对应的equals,hashCode、toString方法,这么牛比?
data class User(
var id: Long,
var name: String,
var headUrl: String,)
相当于java中的
public class User{
private long id;
private String name;
private String headUrl;
public void setId(long id){
this.id = id;
}
public long getId(){
return id;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setHeadUrl(String headUrl){
this.headUrl = headUrl;
}
public String getHeadUrl(){
return headUrl;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", headUrl='" + headUrl + '\''
'}';
}
}
12、null安全
背景:为了规避NullPoniterException,我们只有不停的判断 != null
a、但是在Kotlin中,是null安全的
b、安全调用操作符 ? 对没错就是一个问号
c、如果mRtcEngine为null,就返回null,如果不是才调用leaveChannel方法,绝对不会抛出NullPointerException
mRtcEngine?.leaveChannel()
13、可空类型与非可空类型,通过问号来明确指定一个对象是否可以为null
var a: String = "abc" //非可空类型,不得向 a = null
private var mRtcEngine: RtcEngine? = null //可空类型 可以 mRtcEngine = null
14、lateinit关键字
我去,这个关键字是啥意思啊,头回见
正式名字:延迟加载,延迟初始化
作用: 在某个一定能执行的代码块中进行初始化,否则编译会有不通过的提示,切记哦,必须得初始化
private lateinit var mLeftFragment: Fragment
15、!! 操作符
我去!!,这又是什么?
val l = b!!.length
作用:如果b为null,就会抛出NullPointerException
16、override,不必问
等同于java中的@override
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
17、const关键字
干哈的?
a、有了val,怎么又提供了一个const
b、const只能修饰val,不能修饰var
c、经过const修饰的属性只能同样用拼接const修饰的属性去拼接
d、经过const修饰的常量,才是java中理解的常量
companion object {
const val IS_SHOW_BLOCK_FRIENDS_DIALOG = "is_show_block_friends_dialog"//是否是第一次注册时
}
18、$,美元符号的用法
作用1:拼接字符串
const val testName = "ZhangSan"
const val constNameNormal: String = "constNameNormal$testName"
19、fun关键字,funcation的前面三个字母,代表方法。。