Kotlin语法入门-类与对象(6)

Kotlin语法入门-类与对象(6)

文章目录

  • Kotlin语法入门-类与对象(6)
    • 六、类与对象
      • 1、声明和调用
      • 2、get和set
      • 3、init函数初始化
      • 4、constructor构造函数
        • 4.1、主构造函数
        • 4.2、二级构造函数
        • 4.3、多个构造函数
        • 4.4、省略主构造函数并写了次构造函数
      • 5、类的继承与重写
        • 5.1、继承
        • 5.2、继承构造函数初始化
        • 5.3、函数的重写
        • 5.4、属性的重写
      • 6、抽象类、嵌套类和内部类
        • 6.1、抽象类
        • 6.2、嵌套类
        • 6.3、内部类

六、类与对象

1、声明和调用

fun main() {
    var a = A()  // 面相函数式,所以不用new关键字也可以
    a.print()
}

class A {
    val a = 2
    fun print() {
        println(a)
    }
}

2、get和set

在kotlin中,不能直接调用get和set方法,默认就是赋值就自动调用了set()方法,取值就自动调用get()方法。

就像下面这段示例,test.a = 5这个赋值操作调用set(),取值调用get():

fun main() {
    var test = A()
    test.a = 5
    test.print()

}

class A {
    var a = 2
        get() {
            return field - 1
        }
        set(value) {
            field = value + 1
        }
    fun print() {
        println(a)
    }
}

输出结果:

image-20240418153123854

3、init函数初始化

我们可以在类中添加初始化函数,每当创建一个类的对象之后,init方法就会自动调用,可以用于初始化数据

fun main() {
    var test = A()
}

class A {
    var a = 2
    init {
        println("A") //自动调用
    }
}

通过传入值初始化:

fun main() {
    var test = A(5)
}

class A(b: Int) {
    var a = 2

    init {
        a = b
    }
}

值得注意的是:在对对象传入值的之后可以同时对变量初始化,例如:class A(var b: Int) {},就代表了b就成为了A对象的成员变量,kotlin语法支持这样写。

但是只能在一级构造函数(主构造函数)上写这种,在二级构造函数中不支持这种语法,二级构造函数接下来有介绍。

4、constructor构造函数

在kotlin中奖构造函数分为主构造函数次构造函数

4.1、主构造函数
class  A constructor() {
    var a = 2
    init {
     	// 主构造函数的方法体
    }
}

其中,主构造函数关键字constructor可以省略不写,其构造的方法体就在init函数中。

4.2、二级构造函数
class A constructor(var b: Int = 1) {
    var a = 2

    init {
        println("init()...")
    }

    constructor() : this(3) { //代理主构造函数
        println("次构造函数...")
    }
}

注意:次构造函数需要主构造函数调用才能实现,即使用this()代理主构造函数,也可以传入参数this(3),可就是将b赋值为3。

这种方式就相当于java中的在构造方法中调用其他构造方法。

4.3、多个构造函数
class A constructor(var b: Int = 1) {
    var a = 2

    init {
        println("init()...")
    }

    constructor(c: Int, d: Int) : this(3) {
        println("次构造函数1...")
    }

    constructor() : this(1, 2) {
        println("次构造函数2...")
    }
}

image-20240418161321029

当然,次构2不一定要代理次构1,也可以直接代理主构,但是次构1就失效了。

4.4、省略主构造函数并写了次构造函数

例如这种,就直接成为主构造函数了:

class A  {
    constructor(c: Int, d: Int) {
        //此时识别为主构造函数
    }
}

多态

class A  {
    constructor(c: Int, d: Int) {
       
    }
    constructor(c: Int) {
        
    }
}

5、类的继承与重写

5.1、继承
fun main() {
    var b = B()
    b.print()
}

open class A {  //一定一定要添加open关键字
    var a = 1
}

class B : A() {
    var b = 2
    fun print() {
        println(a)
        println(b)
    }
}

一定一定要添加open关键字。

5.2、继承构造函数初始化

子类继承父类,子类要对父类进行构造方法的初始化:

1、主构造函数初始化

open class AParent {

}

class AChild() : AParent() {

} 

2、次构造函数初始化

open class AParent {

}

class AChild : AParent {
    constructor() : super(){}
}

3、父类多构造函数–子类主构造函数调用

当父类函数存在两个构造函数时,分别为主构造函数二级构造函数

open class AParent(name: String, age: Int) {
    constructor(name: String) : this(name, 30)
}

子类函数2:

class AChild() : AParent( "A") {}

子类函数1:

class AChild() : AParent( "A",15) {}

上述两种方式都可以实现父类构造函数的初始化,图解:

image-20240418172945118

3、父类多构造函数–子类副构造函数调用

image-20240418173640550

赋值输出:

fun main() {
    var aChild = AChild("rediaz")
    aChild.print()
}

open class AParent(var name: String, var age: Int) {
    constructor(name: String) : this(name, 30)
}

class AChild : AParent {
    constructor(name: String) : super(name)
    fun print(){
        println("name: ${super.name}")
    }
}

image-20240418174040391

5.3、函数的重写

正常继承,默认无法进行重写:

image-20240418174447191

它说需要override关键字,好嘛加上:

image-20240418174609562

然后又说基类的方法关键字是final修饰的。

正确重写方式,在父类的成员方法中加上open关键字:

open class AParent() {
    open  fun A() { println("A") }
    open fun B() { println("B") }
}

class AChild : AParent() {
    override fun A() {}
    override fun B() {}
}
5.4、属性的重写

这个是kotlin中特有的操作,Java中没有。

示例:

open class AParent() {
    open val a = 1
   open var b = 2
}

class AChild : AParent() {
    override val a: Int
        get() = super.a

    override var b: Int
        get() = super.b
        set(value) {}
}

上述这种方式就实现了重写属性成员a和b,其中a是常量,b是变量,所以重写之后有点区别。

重写的时候可以直接赋值进行覆盖:

open class AParent() {
    open val a = 1
    open var b = 2
}

class AChild : AParent() {
    override val a: Int = 0
    override var b: Int = 0
}

但是底层还是有get和set方法

重写时将a的val换成var,则其会将代码编译成新的变量,并生成对应的get和set方法:

image-20240418180434262

6、抽象类、嵌套类和内部类

6.1、抽象类

对于抽象类,其用法与Java无异

抽象是面向对象编程的特征之一,类本身,或类中的部分成员,都可以声明为abstract的。抽象成员在类中不存在具体的实现。

需要注意的是:不用对抽象类或抽象成员标注open注解。

abstract class AParent() { // 抽象类
    abstract fun sum() // 抽象方法
}

class AChild : AParent() {
    override fun sum() {
       
    }
}
6.2、嵌套类

先上代码:

fun main() {
    var aParent = AParent()
    aParent.print()
    var aChild = AParent.AChild()
    aChild.print()
}

class AParent() { // 抽象类
    fun print() {
        println("外部类")
    }

    class AChild() {
        fun print() {
            println("嵌套类")
        }
    }

}

注:在Java中,这是一个内部类的一个写法,但是在koltin中,这种事属于内部类的一个写法。

嵌套类是被final关键字修饰的

6.3、内部类

在嵌套类的基础上,在嵌套类的前面加上一个关键字inner就变成了内部类,并且可以访问外部类中的成员变量,使用this@类名的方式。示例:

fun main() {
    AParent().AChild().print()
}

class AParent() {
    val a = 1
    fun print() {
        println("外部类")
    }
 
    inner class AChild() { //加上inner关键字
        fun print() {
            println("嵌套类")
            println(this@AParent.a) //获取AParent中的a值
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/568706.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每天五分钟计算机视觉:基于YOLO算法精确分类定位图片中的对象

滑动窗口的卷积的问题 滑动窗口的卷积实现效率很高,但是它依然不能够输出最精准的边界框,比如下面所示: 我们可以看到蓝色框不论在什么位置都不能很好的确定车的位置,有一个算法是YOLO 算法它能够帮助我们解决这个问题。 YOLO 算法 比如我们的输入图像是100*100,我们会…

TCP相关问题总结

文章目录 TCP连接建立过程1. TCP三次握手2. TCP四次挥手3. TCP为什么是三次握手4. TCP为什么是四次挥手 TCP流量控制TCP拥塞控制1. 为什么需要拥塞控制2. 控制手段 TCP连接建立过程中出现丢包 TCP连接建立过程 1. TCP三次握手 首先client端发出连接请求,并且请求同…

在 VSCode 中运行 C#

文章目录 1.为何选择VSCode而不是VS2.操作步骤2.1 安装.NET2.2 安装扩展插件2.2.1 C#2.2.2 Code Runner 3.新建工程HelloCsharp 1.为何选择VSCode而不是VS VS实在是太“重”了,如果只是写一些简单控制台程序进行调试,则完全没必要 2.操作步骤 2.1 安装…

线性代数 --- 矩阵的对角化以及矩阵的n次幂

矩阵的对角化以及矩阵的n次幂 (特征向量与特征值的应用) 前言: 在上一篇文章中,我记录了学习矩阵的特征向量和特征值的学习笔记,所关注的是那些矩阵A作用于向量x后,方向不发生改变的x(仅有尺度的缩放)。线…

iOS - 多线程-GCD-队列组

文章目录 iOS - 多线程-GCD-队列组1. 队列组1.1 基本使用步骤 iOS - 多线程-GCD-队列组 开发过程中,有时候想实现这样的效果 多个任务并发执行所有任务执行完成后,进行下一步处理(比如回到主线程刷新UI) 1. 队列组 可以使用GC…

探索亚马逊云科技「生成式 AI 精英速成计划」

目录 前言「生成式 AI 精英速成计划」技术开发课程学习课程学习 总结 前言 亚马逊云科技(Amazon Web Services,简称AWS)作为全球领先的云计算服务提供商,一直以来在推动人工智能(AI)领域的发展中扮演着重要…

调度问题变形的贪心算法分析与实现

调度问题变形的贪心算法分析与实现 一、问题背景与算法描述二、算法正确性证明三、算法实现与分析四、结论 一、问题背景与算法描述 带截止时间和惩罚的单位时间任务调度问题是一个典型的贪心算法应用场景。该问题的目标是最小化超过截止时间导致的惩罚总和。给定一组单位时间…

element plus:tree拖动节点交换位置和改变层级

图层list里有各种组件,用element plus的tree来渲染,可以把图片等组件到面板里,面板是容器,非容器组件,比如图片、文本等,就不能让其他组件拖进来。 主要在于allow-drop属性的回调函数编写,要理清…

毕业撒花 流感服务小程序的设计与实现

目录 1.1 总体页面设计 1.1.1 用户首页 1.1.2 新闻页面 1.1.3 我的页面 1.1.5 管理员登陆页面 1.1.6 管理员首页 1.2 用户模块 1.2.1 体检预约功能 1.2.2 体检报告功能 1.2.4 流感数据可视化功能 1.2.5 知识科普功能 1.2.6 疾病判断功能 1.2.7 出示个人就诊码功能 …

java实现解析html获取图片或视频url

一、前言 有时在实际项目中,比如发布某篇文章,需要取文章中的某张图片作为封面,那么此时需要文章内容,获取html内容中的图片地址作为封面,下面讲下如何获取html中的图片或视频地址。 二、实现 1.先定义一个工具类&…

Elasticsearch集群部署(Linux)

1. 准备环境 这里准备三台Linux虚拟机,用于配置Elasticsearch集群和部署可视化工具Kibana。 角色IP域名集群名称节点名称版本操作系统ES192.168.243.100linux100cluster-eses-node-1007.12.0CentOS 7192.168.243.101linux101cluster-eses-node-101192.168.243.102…

IDEA 常规设置,让工作便利化

1、自动提示,不区分大小写 File-->Settings-->Editor-->Code completion 然后把Match Case前面的勾选去掉,点击OK保存 2.快速生成main方法设置 idea快速生成main方法的快捷键是psvm (public static void main(String[] args) {}) ;…

C语言入门课程学习笔记1

C语言入门课程学习笔记1 第1课 - 概论第2课 -helloworld第3课 -数据输出第4课 -数据类型与变量第5课 - 深入数据类型与变量第6课 - 类型与变量编程练习第7课 - 程序中的数据输入 本文学习自狄泰软件学院 唐佐林老师的 C语言入门课程,图片全部来源于课程PPT&#xff…

分割链表和回文链表习题

感谢大佬的光临各位,希望和大家一起进步,望得到你的三连,互三支持,一起进步 个人主页:LaNzikinh-CSDN博客 收入专栏:初阶数据结构_LaNzikinh篮子的博客-CSDN博客 文章目录 一.回文链表LCR 027. 回文链表 - 力扣&#x…

BUUCTF---[SWPU2019]神奇的二维码

1、下载附件是一张二维码,拿去扫描得到了flag 2、拿去提交是错的(不会这么简单哈哈哈),常规操作在kali中分析 3、分离发现图片里面有东西 4、查看txt,发现里面有一串字符,解码后为 5、查看文档&#xff0c…

比特币之路:技术突破、创新思维与领军人物

比特币的兴起是一段充满技术突破、创新思维和领军人物的传奇之路。在这篇文章中,我们将探讨比特币发展的历程,以及那些在这一过程中发挥重要作用的关键人物。 技术突破与前奏 比特币的诞生并非凭空而来,而是建立在先前的技术储备之上。在密码…

小程序 rich-text 解析富文本 图片过大时如何自适应?

在微信小程序中&#xff0c;用rich-text 解析后端返回的数据&#xff0c;当图片尺寸太大时&#xff0c;会溢出屏幕&#xff0c;导致横向出现滚动 查看富文本代码 图片是用 <img 标签&#xff0c;所以写个正则匹配一下图片标签&#xff0c;手动加上样式即可 // content 为后…

(一)、SQL进阶——神奇的SQL

一、CASE表达式 1、CASE表达式概述 case表达式有简单case表达式和搜索case表达式两种写法 -- 简单case表达式 case sex when 1 then 男 when 0 then 女 else 其他 end -- 搜索case表达式 case when sex1 then 男 when sex1 then 男 else 其他 end 这两种写法执行的结…

(5)步态识别论文研读——GaitDAN:基于对抗域适应的跨视角步态识别

GaitDAN: Cross-view Gait Recognition via Adversarial Domain Adaptation | IEEE Journals & Magazine | IEEE Xplore GaitDAN: Cross-view Gait Recognition via Adversarial Domain Adaptation 基于对抗与适应 摘要&#xff1a;视角变化导致步态外观存在显着差异。因…

黄金行情下跌有投资机会吗?

尽管黄金价格的波动常常引起投资者的高度关注&#xff0c;但行情的下跌未必只是警讯&#xff0c;亦可能蕴藏着某些难得的投资机会。总之&#xff0c;答案是肯定的——在黄金行情下跌时&#xff0c;依旧有适宜的投资机会&#xff0c;只是这需要投资者具备相应的应对知识和策略。…