Android修行手册之Kotlin-【类和对象】、【Get和Set】、【继承】、【接口】【抽象类/嵌套类/内部类】、【数据类】
我的军旗依然伫立在这里,你看到来吗,我的长枪依然锐利,只是不能再为你挥舞,于是我筑起来高墙,等待,等待,为你卸下的那一刻。
点击跳转=>熬夜再战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中有一些不同
- 有主构造函数和次构造函数区分
- 主次构造函数建议单独存在,因为要想同时存在需要特殊处理
- 有个初始化函数,只要创建该类,初始化函数里面的内容必执行
构造函数的访问权限怎么修饰?
次要构造函数直接在前面写,主要构造函数在函数前类名后写
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/
📢欢迎点赞👍收藏🌟留言📝
- 点赞
- 收藏
- 关注作者
评论(0)