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

news/2024/9/23 18:41:00/

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、声明和调用

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

2、get和set

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

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

kotlin">fun main() {var test = A()test.a = 5test.print()}class A {var a = 2get() {return field - 1}set(value) {field = value + 1}fun print() {println(a)}
}

输出结果:

image-20240418153123854

3、init函数初始化

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

kotlin">fun main() {var test = A()
}class A {var a = 2init {println("A") //自动调用}
}

通过传入值初始化:

kotlin">fun main() {var test = A(5)
}class A(b: Int) {var a = 2init {a = b}
}

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

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

4、constructor构造函数

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

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

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

4.2、二级构造函数
kotlin">class A constructor(var b: Int = 1) {var a = 2init {println("init()...")}constructor() : this(3) { //代理主构造函数println("次构造函数...")}
}

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

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

4.3、多个构造函数
kotlin">class A constructor(var b: Int = 1) {var a = 2init {println("init()...")}constructor(c: Int, d: Int) : this(3) {println("次构造函数1...")}constructor() : this(1, 2) {println("次构造函数2...")}
}

image-20240418161321029

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

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

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

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

多态

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

5、类的继承与重写

5.1、继承
kotlin">fun main() {var b = B()b.print()
}open class A {  //一定一定要添加open关键字var a = 1
}class B : A() {var b = 2fun print() {println(a)println(b)}
}

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

5.2、继承构造函数初始化

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

1、主构造函数初始化

kotlin">open class AParent {}class AChild() : AParent() {} 

2、次构造函数初始化

kotlin">open class AParent {}class AChild : AParent {constructor() : super(){}
}

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

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

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

子类函数2:

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

子类函数1:

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

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

image-20240418172945118

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

image-20240418173640550

赋值输出:

kotlin">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关键字:

kotlin">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中没有。

示例:

kotlin">open class AParent() {open val a = 1open var b = 2
}class AChild : AParent() {override val a: Intget() = super.aoverride var b: Intget() = super.bset(value) {}
}

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

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

kotlin">open class AParent() {open val a = 1open var b = 2
}class AChild : AParent() {override val a: Int = 0override var b: Int = 0
}

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

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

image-20240418180434262

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

6.1、抽象类

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

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

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

kotlin">abstract class AParent() { // 抽象类abstract fun sum() // 抽象方法
}class AChild : AParent() {override fun sum() {}
}
6.2、嵌套类

先上代码:

kotlin">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@类名的方式。示例:

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

http://www.ppmy.cn/news/1432785.html

相关文章

本地生活服务平台都有哪些,靠谱吗?

随着本地生活服务的发展潜力和盈利方式被不断挖掘,越来越多的人开始发现其中所蕴含着的巨大商机,大家所熟悉的抖音、小红书和支付宝等平台也纷纷上线了本地生活板块,再次印证了其前景的广阔。在此背景下,普通人想要趁势入局分一杯…

nodejs 中间件

一、是什么 Node.js 中的中间件,特别是针对 Web 开发框架(如 Express、Koa、Hapi 等)的中间件,其核心功能是用来对 HTTP 请求生命周期进行拦截、处理和传递的。 中间件这一概念是 Web 开发框架为了实现请求处理流程的模块化、可…

springboot整合mybatis-plus模版

1.创建springboot项目 Maven类型Lombok依赖Spring Web 依赖MySQL Driver依赖pom.xml&#xff1a;<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/…

【再探】设计模式-设计原则

设计原则是在编写程序时引导程序员遵循的一些原则和准则。这些原则旨在提高代码的可读性、可维护性、可扩展性和可重用性。 可读性&#xff1a;理解和沟通的难易程度。可维护性&#xff1a;修改和调整的难易程度。可扩展性&#xff1a;应对未来变化的能力。可重用性&#xff1…

uniapp 搜索内容关键字高亮

搜索出来的列表关键字高亮 首先循环搜索的字符串拿到所有的需要高亮的字符&#xff0c;再使用RegExp方法正则匹配所有相同字符&#xff0c;使用模板字符串给匹配到的字符加上高亮的样式&#xff0c;再使用replace方法将正则匹配到的字符替换为模板字符串处理后的高亮字符&#…

Qt Creator 调试控制台无法查看 log4z 的日志

qInstallMessageHandler(outputMessage); 重定向日志到 log4z 后无法查看打印的日志信息。 解决方法 改造 log4z 库&#xff0c;Android 环境下使用 qInfo 将日志输出到调试控制台。 void LogerManager::showColorText(const char *text, int level) {if(level < LOG_LEV…

cdh cm界面HDFS爆红:不良 : 该 DataNode 当前有 1 个卷故障。 临界阈值:任意。(Linux磁盘修复)

一、表现 1.cm界面 报错卷故障 检查该节点&#xff0c;发现存储大小和其他节点不一致&#xff0c;少了一块物理磁盘 2.查看该磁盘 目录无法访问 dmesg检查发现错误 dmesg | grep error二、解决办法 移除挂载 umount /data10 #可以移除挂载盘&#xff0c;或者移除挂载目…

IP地址定位:揭秘精准定位的技术与应用

在数字化时代&#xff0c;IP地址已成为连接互联网世界的关键标识之一。但是&#xff0c;很多人对于IP地址的精准定位能力存在疑虑。本文将深入探讨IP地址定位的技术原理以及其在实际应用中的精确度。 IP地址查询&#xff1a;IP数据云 - 免费IP地址查询 - 全球IP地址定位平台 …