分享下学习Kotlin的历程-访问作用域/类修饰词/继承

转载请注明出处:王亟亟的大牛之路

开篇之前还是老规矩,先安利https://github.com/ddwhan0123/Useful-Open-Source-Android 还是尽量每天做更新和维护

java中访问作用域与继承等姿势很好的对我们的代码进行了封装,那么Kotlin中又是如何定义的呢?

这一篇,通过一个简单的demo来讲一下相关知识


访问作用域

访问作用域也叫访问权限修饰符

通过修饰符来控制类、属性和方法的访问权限和其他功能

首先是Java的

这里写图片描述

其次是Kotlin的
这里写图片描述

与Java的区别在于,Kotlin默认的修饰词是public

他们的区别,待会会在Demo中解释


类属性修饰符

这里写图片描述

除了注解类,其他都是老面孔,在网上搜到了不错的注解类的中文博文,直接 分享给大家:http://www.jianshu.com/p/d3721b171e9f


继承

在类的构造函数之后使用 : 标示继承

class 子类(子类的构造函数所需的参数和类型):父类(子类的构造函数所需的参数){

}

当类未声明构造函数时,继承其他类时,也不需要在primary constructor中显示的声明构造函数,必须在secondary constructor中显示调用父类构造函数,若父类有多个构造函数,可选择其一进行调用

所有类定义时默认是final属性,不可被继承。若需要继承,使用open关键字进行修饰。

ok,大道理讲完了,我们来看下demo

首先,我们“强行给Activity“封装个基类叫BaseActivity,然后写了一系列的方法

BaseActivity.kt

abstract class BaseActivity(value: String) : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(getLayoutID())
        init()
        setListener()
        Log.d("--->", "BaseActivity onCreate")
    }

    //父类的抽象方法,给子类去实现
    abstract fun getLayoutID(): Int

    abstract fun init()

    abstract fun setListener()

    override fun onResume() {
        super.onResume()
        Log.d("--->", "BaseActivity onResume")
    }

    override fun onStart() {
        super.onStart()
        Log.d("--->", "BaseActivity onStart")
    }

    override fun onPause() {
        super.onPause()
        Log.d("--->", "BaseActivity onPause")
    }

    override fun onStop() {
        super.onStop()
        testPrivate()
        Log.d("--->", "BaseActivity onStop")
    }

    override fun onRestart() {
        super.onRestart()
        Log.d("--->", "BaseActivity onRestart")
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.d("--->", "BaseActivity onDestroy")
    }

    //方法默认是final的,不可被子类重载,若需要被重载,使用关键词 open 进行修饰
    open fun showToast(context: Context, msg: String, time: Int) {
        Toast.makeText(context, msg, time).show()
        Log.d("--->", "BaseActivity showToast")
    }

    //获取appVersionName,子类无法调用
    protected fun showAppVersionName(cotext: Context): String {
        var versionName = ""
        try {
            val pm: PackageManager = cotext.packageManager
            val pi: PackageInfo = pm.getPackageInfo(cotext.packageName, 0)
            versionName = pi.versionName
            if (versionName == null) {
                return ""
            }
        } catch (e: Exception) {
            Log.e("VersionInfo", "Exception", e)
        }
        return versionName
    }

    //子类无法调用
    private fun testPrivate() {
        Log.d("--->", "testPrivate")
    }

    //子类可以使用
    public fun getMyPackageName(context: Context): String {
        return context.packageName
    }
}

SecondActivity.kt

//这里只是随便写了个构造函数
class SecondActivity : BaseActivity("") {
    //对onCreate方法进行了拆分,这里会返回布局ID
    override fun getLayoutID(): Int {
        return R.layout.activity_second
    }

    //对onCreate方法进行了拆分,这里可以做简单对初始化操作
    override fun init() {
        Log.d("--->", "SecondActivity init")
        Log.d("--->", "getMyPackageName " + getMyPackageName(this))
    }

    //对onCreate方法进行了拆分,这里可以设置各种监听
    override fun setListener() {
        Log.d("--->", "SecondActivity setListener")
    }

    override fun onResume() {
        super.onResume()
        Log.d("--->", "SecondActivity onResume")
        showToast(this, "我是第二页的 Toast", 1)
    }

    override fun onPause() {
        super.onPause()
        Log.d("--->", "SecondActivity onPause")
    }

    //重载了父类的showToast方法
    //子类重载方法使用 override 关键词
    override fun showToast(context: Context, msg: String, time: Int) {
        Log.d("--->", "SecondActivity showToast 被重写 ")
        Log.d("--->", " VersionName " + showAppVersionName(this))
    }
}

因为Kotlin和java紧密贴合,所以你继承java类和继承Kotlin类几乎无多余操作,简单快捷,接下来一段时间还会深入学习了解

源码地址:https://github.com/ddwhan0123/KotlinAndroidDemo

猜你喜欢

转载自blog.csdn.net/ddwhan0123/article/details/77928519