当中没有讲到 接口、可见性修饰符、扩展方面的知识,因为这些知识对于作为已经撸了一两年的java的人来说,看这文档都很容易理解的 ,有点需要强调,文档中的一句话:
大多数时候我们在顶层定义扩展,即直接在包里
这里就不说废话,直接举例看kotlin的源码来说。这个.kt文件在Kotlin包下面,他写了很多的扩展函数,没有定义类。
- kotlin源码中有很多这样的文件。我们自己在 写代码时也可以这样,比如一些工具呀,之前不是创建的工具类吗,其实可以不用创建工具类。还是看一个例子吧
package com.asdf.myapplication
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.util.Log
//导包
import com.asdf.myapplication.test.isFilexists
import com.asdf.myapplication.test.toast
class Main2Activity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
var c = "youxin".isFilexists()
var d = "youxin".toast(this).isFilexists()//是不是用起来很方便 怎么去使用就看个人了,
Log.e("youxin", c.toString())
Log.e("youxin", d.toString())
}
}
//下面就是我创建的一个工具文件
package com.asdf.myapplication.test
import android.content.Context
import android.widget.Toast
import java.io.File
/**
* Created by Administrator on 2017/9/19 0019.
*/
fun String.isFilexists(): Boolean {
val dir = File(this)
return dir.exists()
}
//这个 this 关键字在扩展函数内部对应到接收者对象(传过来的在点符号前的对象)这个应该不难理解吧。
fun String.toast(context: Context):String {
Toast.makeText(context,this,Toast.LENGTH_LONG).show()
return this;
}
- 这需要提一下的就是Android studio的一个插件叫JsonToKotlinClass 可以更具json转换成kotlin对应的data数据类,这插件和之前java里面的GsonFormat使用 方式有点微微的差别。
- 注意点:
//这么写也没有错,但是我觉得还是不要这样做
data class Che(
var content_id: Int = 1,
var title: String
) {
var name: String = "adsf"
}
//下面看看 编译器编译这个之后的代码
public final data class Che public constructor(content_id: kotlin.Int /* = compiled code */, title: kotlin.String) {
public final var content_id: kotlin.Int /* compiled code */
public final var name: kotlin.String /* compiled code */
public final var title: kotlin.String /* compiled code */
public final operator fun component1(): kotlin.Int { /* compiled code */ }
public final operator fun component2(): kotlin.String { /* compiled code */ }
}
// 其中的component只有两个 ,另外使用copy函数的时候name也会不在其中,所以我们还是按照标准写。至于这样写会不会有什么其他的用于,就不知道了。大家
//如果发现了 可以告知下,相互学习
- 标准数据类,标准库提供了 Pair 和 Triple。这两个标注库太牛逼了,我们不能停留在简单的用法上面,它更好,更帅的用法,如何去使用后面会讲到。