Android修行手册之Kotlin-【类和对象】、【Get和Set】、【继承】、【接口】【抽象类/嵌套类/内部类】、【数据类】

举报
芝麻粒儿 发表于 2022/01/23 18:01:05 2022/01/23
【摘要】 我的军旗依然伫立在这里,你看到来吗,我的长枪依然锐利,只是不能再为你挥舞,于是我筑起来高墙,等待,等待,为你卸下的那一刻。 往期文章分享点击跳转=>熬夜再战Android从青铜到王者-开发效率插件篇点击跳转=>Unity粒子特效系列-龙卷风预制体做好了,unitypackage包直接用!点击跳转=>姐姐喊我解锁套娃新技能:FairyGUI在Unity中实现List嵌套List/立体画廊等,玩...

我的军旗依然伫立在这里,你看到来吗,我的长枪依然锐利,只是不能再为你挥舞,于是我筑起来高墙,等待,等待,为你卸下的那一刻。

往期文章分享

点击跳转=>熬夜再战Android从青铜到王者-开发效率插件篇
点击跳转=>Unity粒子特效系列-龙卷风预制体做好了,unitypackage包直接用!
点击跳转=>姐姐喊我解锁套娃新技能:FairyGUI在Unity中实现List嵌套List/立体画廊等,玩出花儿来
点击跳转=>Unity新手必备5款宝藏插件–价值上千元白嫖最新版
爆肝万字C#基础入门大总结【建议收藏】
Android修行手册-玩转TextView,想不到有这么多属性
【万字】熬夜修行Android Studio技巧到出神入化,快速涨薪【建议收藏】
Android修行手册之从头到尾学Kotlin【全】

本文约7千字,新手阅读需要16分钟,复习需要5分钟 【收藏随时查阅不再迷路】

👉关于作者

众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣 !!!
专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎私我,交流群让学习不再孤单

👉前提

这是小空坚持写的Android系列,欢迎品尝。

👉实践过程

😜【类和对象】

类的创建也是使用【class】关键字

class Entity {
     var name: String? = null
     var urlJUEJIIN: String? = null
     var urlCSDN: String? = null
     var urlList: List<String>? = null
}

初始化的时候不用new关键字

var tempEntity = Entity() //等同于java的Entity tempEntiy=new Entity();

tempEntity.name=“这是我的名字” //使用里面的属性也是点出来

在Java中构造函数可以有多个,都是类名即可。在Kotlin中有一些不同

  1. 有主构造函数和次构造函数区分
  2. 主次构造函数建议单独存在,因为要想同时存在需要特殊处理
  3. 有个初始化函数,只要创建该类,初始化函数里面的内容必执行

构造函数的访问权限怎么修饰?

次要构造函数直接在前面写,主要构造函数在函数前类名后写

class Entity {
    init {
        Log.e("TAG,", "类的初始化函数,关键字是init-系统内置的 ")
    }

    var name: String? = null
    var urlJUEJIIN: String? = null
    var urlCSDN: String? = null
    var urlList: List<String>? = null

    constructor() {

    }

    private constructor(name: String) {

    }

    //不同参数的次要构造函数
    constructor(name: String, age: Int) {
        Log.e("TAG,", "执行了构造器$name===$age")
    }
}



//这是两个类 在两个文件里 别搞混了

//这个是主构造函数,直接在类名后面用关键字constructor
class Person private constructor(name: String, age: String) {
    init {

    }

    //特殊处理:如果主要构造和次要构造同时存在的话--必须包含主要构造的参数内容
    constructor(name: String, age: String, height: Int) : this(name, age) {

    }
}

//2021-10-14 14:52:59.468 10639-10639/cn.appstudy E/TAG,: 类的初始化函数,关键字是init-系统内置的
//2021-10-14 14:52:59.468 10639-10639/cn.appstudy E/TAG,: 执行了构造器测试===20

那么如果类继承又会怎么样呢?

如果父类有构造函数,则子类也必须有至少一个,如果不足编辑器则会提示警告

使用父类的方法也是使用【super】关键字,并且父类需要【open】关键字

open class Entity {
    init {
        Log.e("TAG,", "类的初始化函数,关键字是init-系统内置的 ")
    }

    constructor() {

    }

    constructor(name: String) {

    }

    //不同参数的次要构造函数
    constructor(name: String, age: Int) {
        Log.e("TAG,", "执行了父类构造器$name===$age")
    }
}

 
class EntityTwo : Entity {
    constructor() {

    }

    constructor(name: String) : this(name, 0) {

    }

    //不同参数的次要构造函数
    constructor(name: String, age: Int) : super(name, age) {
        Log.e("TAG,", "执行了子类构造器$name===$age")
    }
}

😜【Get和Set】

其实Kotlin声明实体类之后,里面的变量默认就带有set和get的属性功能了。除非想要特殊业务内容。

比如set需要结合项目进行其他业务处理,get也是同样的道理。

【filed】是系统内置的一个关键字,算是中间变量

除了这些

var name: String? = null
        set(value) { //value随意起名
            field = value  //这个field是系统内置的 用在get
        }
        get() {
            return field + "这是返回"
        }
var urlJUEJIIN: String? = null
        get() =field+"这是只有get"
var urlCSDN: String? = null
var urlList: List<String>? = null

😜【继承】

在Java中可以说所有的类都继承自Object,而在Kotlin中可以说所有的是继承自Any类。

在Java中继承使用关键字【extends】,而在Kotlin中使用【:】(英文冒号)

除此之外,不管是方法重写还是属性变量重写,前面都加上【override】关键字,这一点和Java一样

class EntityTwo : Entity {
    constructor() {

    }

    constructor(name: String) : this(name, 0) {

    }

    //不同参数的次要构造函数
    constructor(name: String, age: Int) : super(name, age) {
        Log.e("TAG,", "执行了子类构造器$name===$age")
    }
}

😜【接口】

这点也和Java类似,使用【interface】定义,使用上也没差距

修饰类的关键字有

  • abstract // 说明该类为抽象类
  • final // 说明该类为类不可继承,默认属性
  • enum // 说明该类为枚举类
  • open // 说明该类为类可继承,类默认是final的
  • annotation // 说明该类为注解类

访问权限的修饰符有:

  • private // 访问权限-仅在同一个文件中可见
  • protected // 访问权限-同一个文件中或子类可见
  • public // 访问权限-所有调用的地方都可见
  • internal // 访问权限-同一个模块中可见

经过学习和试验验证,小空决定还是用Java的实体类吧,反正他们有互操作性。

😜【抽象类/嵌套类/内部类】

小空带大家直接用实例来看明白

abstract class EntityThree {
    abstract fun methonOne()
}

//嵌套类实例
class One {                  // 这是外部类
    private val age: Int = 1
    class Two {             // 这是在类里面的类,叫做嵌套类
        fun hello() {

        }

        fun hi() = 3
    }
}

//内部类使用关键字inner
class Three {
    inner class Four { //这个Four类是内部类
        fun hello() {

        }
        fun hi() = 3
    }
}
//这是引用示例
var one = Three().Four().hello()

😜【数据类】

数据类就是Java中的实体类

在Kotlin中数据类使用关键词【data】修饰,在类class前面声明,只包含数据,其实和Java我们根据Json生成的实体类同样的玩意,内置了几个函数方法

equals() 比较函数

toString() 格式如 “User(name=John, age=42)”

componentN() functions 对应于属性,按声明顺序排列

copy() 赋值函数

使用Java开发的时候,我们会利用GsonFormat插件来将接口的Json数据快速生成实体。
现在Kotlin也有改类似插件,叫做【Json To Kotlin Class】。
去【File-Setting-Plugins】中搜索安装即可。
使用:利用快捷键【Alt+K】(如果和其他快捷键没冲突的话)或者打开【Generate…】功能框后里面有【Kotlin data classes from JSON】

善于使用插件,可以快速帮我们提升工作效率,在工作上提升不可替代性,进而实现涨薪。

在这提一下密封类,暂时没想到较为常用的应用环境,菜鸟教程原话:

密封类用来表示受限的类继承结构:当一个值为有限几种的类型, 而不能有任何其他类型时。在某种意义上,他们是枚举类的扩展:枚举类型的值集合 也是受限的,但每个枚举常量只存在一个实例,而密封类 的一个子类可以有可包含状态的多个实例。

声明一个密封类,使用 sealed 修饰类,密封类可以有子类,但是所有的子类都必须要内嵌在密封类中。

sealed 不能修饰 interface ,abstract class(会报 warning,但是不会出现编译错误)

😜【泛型】

泛型也是我们开发过程中常用的功能之一,和Java一样,Kotlin也是使用T表示泛型,让代码更加健壮,解决了类型转换的未知步骤。

class Person<T>(t: T) {
    var value = t
}

使用示例如下:

//使用范例
var age = Person<Int>(20)
var name = Person<String>("Runoob")
Log.e("TAG,", "输出:$age")
Log.e("TAG,", "输出:$name")

在泛型约束的使用上和Java也没明显上的差异

fun <T : Comparable<T>> myHeight(list: List<T>) {
    // ……
}
myHeight(listOf(1,2,3,4))

上面示例正确,因为Int 是 Comparable 的子类型

👉其他

📢作者:小空和小芝中的小空
📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
📢欢迎点赞👍收藏🌟留言📝

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。