一.简述
在今年的谷歌i/o大会上,谷歌官方正式支持Kotlin成为官方认可的安卓开发语言,而且从Android Studio 3.0开始,将直接集成Kotlin而无需安装任何的插件。虽然说不会马上取代java,但艺多不压身。
二.基础语法
1.var和val
var和val都是定义变量,和JavaScript语法有点相似
private var a: Int = 4 //a表示变量名,int表示变量类型 private var b: String ="b" private var c: Person = Person() //Kotlin中没有new关键字,创建对象直接Person()即可 private val d: String ="d" //val相当于java里的final关键字必须初始化赋值 private var e: String? = null //?表示此变量可以为空
2.空指针异常判断
java代码 kotlin代码 if(text != null) { var length = text?.length //如果text为空不会报空指针异常,返回值为null int length = text.length(); var length = text!!.length //如果text为空报NullPointerException }
3.Is As In关键字
java代码 kotlin代码 if(x instanceof Integer){} if(x is Integer){} final String text = (String) other; val text = other as String if(x >= 0 && x <=10){} if(x in 0..10) {}
4.Switch / When
java中的Switch kotlin中的when
Switch(obj) { when(obj){
case a: a -> { /*代码逻辑**/ }
break; b -> { /*代码逻辑**/ }
case b: else -> { /*代码逻辑**/ } //else相当于default:
break; }
default:
break;
}
5.for循环
java代码 kotlin代码 for(int i =1; i <11; i++) { } for(i in 1..10) { } for(int i =1; i <11; i+=2) { } for(i in 1..10 step 2) {} for(String item : collection) { } for(item in collection) {} for(int number : numbers) { numbers.forEach { System.out.println(number); println(it) } }
6.创建集合
var list : ArrayList<String> = arrayListOf("a","b","c") // : 后面表示集合的类型 var list : ArrayList<Person> = ArrayList() var map : HashMap<String,Int> = HashMap() val map = mapOf(1 to "One",2 to "Two",3 to "Three")
三.类和接口
1.创建类
kotlin中没有new关键字,创建对象直接var person : Person = Person()即可
2.函数
函数用关键字fun表示,如果是重写的方法在前面加override关键字,有返回值就在 : 后面加返回值类型
private fun getData() { } private fun setData(data : String) { // 带参数 } private fun getPerson() : Person { // : 后面加返回值类型 return Person() } override fun onClick(v: View?) { }
3.继承
继承用 : 代替关键字 extends,和java一样只能继承一个类,可以实现多个接口
class MainActivity : AppCompatActivity(),View.OnClickListener {
override fun onClick(v: View?) {
}
}
4.静态类和静态方法
如果一个类全是静态方法可以直接 class 类名 改为 object 类名 即可
object ToolUtils { public var a : String = "a" //在其他类直接ToolUtils.a调用 fun getData() { //在其他类直接ToolUtils.getData()调用 } }
.如果一个类只有一部分静态属性和方法就用companion object { }包裹起来
class Person {
var a : string = "a" //不能直接调用,需要Person().a
fun getData() { //Person().getData()
}
companion object {
var b : String = "b" //Person.a
fun setData() { //Person.setData()
}
}
}
5.接口
Kotlin 的接口与 Java 8 类似,既包含抽象方法的声明,也包含实现。与抽象类不同的是,接口无法保存状态。它可以有属性但必须声明为抽象或提供访问器实现。使用关键字interface来定义接口
interface MyInterface{ fun bar() fun foo(){ // 可选的方法体 } }
实现接口,一个类或者对象可以实现一个或多个接口。
class Child : MyInterface{ override fun bar(){ // 方法体 } }
6.内部类/匿名内部类
创建匿名内部类 object : (类或接口) { //重写的方法 },以Handler为例
var handler : Handler = object: Handler() { //如果是接口就不需要加() override fun handleMessage (msg: Message?) { super.handleMessage(msg) } }
7.接口回调
class A : View.OnClickListener{ ...... private var mOnGetText : OnGetText? = null public fun setOnGetText (onGetText : OnGetText) { this.mOnGetText = onGetText } //假如点击了按钮触发了事件 override fun onClick(v: View?) { if( mOnGetText != null) { mOnGetText.getText("abc") mOnGetText.save() } } interface OnGetText { fun getText(text : String) fun save() } } class B { private var a : A = A() fun initData() { a.setOnGetText(object : A { override fun getText(text : String) { //就拿到你需要的"abc"做事情了 } override fun save() { //这个方法也会被触发 } }) } }
四.kotlin可以不用findViewById()了
平时在开发中,一系列的查找控件,强转类型很烦琐,虽然有了很多第三方插件简化操作,但是还是要生成很多注解和命名,使用kotlin语言只需要导入一句代码就搞定了. 以MainActivity为例,导入一句 import kotlinx.android.synthetic.main.activity_main.*就可以了
如果导入包报红色,就说明你没有在app的build.gradle文件中添加 apply - plugin :'kotlin-android-extensions' 属性
然后就可以在MainActivity界面中直接使用R.layout.activity_main布局中设置的android:id="@+id/textView"了
可以直接设置text属性和设置点击事件,不用设置匿名内部类