IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 你们知道幕后字段吗?(Kotlin中基本类的创建) -> 正文阅读

[移动开发]你们知道幕后字段吗?(Kotlin中基本类的创建)

一、构造函数和初始化块

1.初始化块

代码的初始化工作由它负责,在调用主构造函数之前执行,这部分理论上可以进行任何工作,但建议类的初始化赋值可以放在这,其余的最好由其他专门的地方处理,采用init关键字

init{
    println("ww cool")
}

2.主构造函数

主构造函数只能由一个,初始化块相当于放在主构造函数的无参函数中,按顺序执行初始化块,这一点和传统的面向对象编程中的主构造函数没有太大的区别。由关键字constructor提供,一般情况省略此关键字

class MyClass (name:String){
    
}

//或者使用关键字
class MyClass constructor(name:String){
    
}

3.次构造函数

同样使用constructor关键字作为函数名,但它不能省略函数名,使用时需要调用主构造函数

class MyClass constructor(name:String){
    constructor(name1:String,name2:String):this(name1){
        //这部分规则和大多数面向对象的规则差不多
    }
}

谈谈主构造函数和次构造函数的区别

  • 次构造函数可以有多个,而主构造函数只能有一个
  • 次构造函数可以包含代码,主构造函数不行
  • 次构造函数属性不能用var和val关键字修饰而主构造函数可以

4.他们之间的联系

初始化块有多个的情况下,按照声明顺序执行,主构造函数调用之前会执行初始化块,而次构造函数调用之前会先执行主构造函数的初始化块然后再调用主构造函数

//顺序如下
初始化块->主构造函数->次构造函数

二、属性

1.属性的声明

最简单的方式

class MyClass(){
    val name:String
}

此时默认已经帮你创建好了getter和setter,val 类型的只有getter,var类型的两个都有

也可以手动创建getter和setter,如果对它们不满意的话

class MyClass(){
    var name:String
    get() = "my"
    //set等下请看幕后字段
}

2.避免递归调用的幕后字段

下面这个代码看上去好像没有问题,但事实上它递归调用了属性的get和set方法

class MyClass(){
    var name:String
    get() = name
	set(value){
        this.name = value
    }
}

执行一下,果然报错了,栈溢出报错

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7dTP9u4S-1639369491606)(C:\Users\y\Desktop\博客\kotlin100天学完\主构造函数、次构造函数、初始化块之间的爱恨情仇(Kotlin中基本类的创建)]\1.jpg)

原因就是递归调用了name这个属性导致的,所以这就要引入一个幕后字段进行调整,便于再setter和getter时替换变量

class MyClass(){
    var name:String
    get() = field
	set(value){
        field = value
    }
}

这一点和java语言差异比较大,需要注意一下,不过平时基本上不会用到自定义的setter和getter,所以不用这么担心

三、常用的类

  • 抽象类

    含有抽象方法的类称为抽象类,这一点和java里面很像

  • 内部类

    使用inner关键字,可以访问内部类外的属性

    class outer{
        val name = "ww"
        inner class inside{
            println("my name is $name")
        }
    }
    
  • 嵌套类

    和内部类很像,但是没有加inner关键字,不能访问外部的变量

    class outer{
        val name = "ww"
        class inside{
            println("my name is ww")
            //不能直接调用外部的变量
        }
    }
    
  • 枚举类

    与传统的java写法相比,由于少了getter和setter,所以代码显得相当简洁,也很容易读懂

    enum class Color ( var colorName: String, var number:Int){
        Green("绿色",1),
        Blue("蓝色",2)
    }
    

关注我的技术公众号,每天都有优质技术文章推送。

微信扫一扫下方二维码即可关注:

加入我的技术社区,每天一起学习Kotlin。

点击下方的logo即可加入kotlin开发者社区:

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-14 16:03:59  更:2021-12-14 16:06:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:47:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码