Kotlin入门:面向对象编程——04

news2024/11/26 12:37:20

一、类和对象:

  • 在Kotlin中,使用class关键字定义类,使用object关键字定义对象。
  • 类是对象的蓝图,用于描述对象的属性和行为,而对象则是类的一个实例。
  • 类可以包含属性(成员变量)和方法(成员函数)。

代码演示: 

// 定义一个简单的类
class Person(val name: String, var age: Int) {
    // 成员函数
    fun speak() {
        println("My name is $name, I'm $age years old.")
    }
}

fun main() {
    // 创建对象并调用成员函数
    val person = Person("Alice", 25)
    person.speak()
}

运行结果: 

My name is Alice, I'm 25 years old.

二、继承:

  • Kotlin支持单继承,一个子类只能继承自一个父类。
  • 使用:符号来指定继承关系,如class SubClass : SuperClass
  • 子类可以重写父类的方法和属性,使用override关键字进行标记。

 代码演示:

// 继承
open class Animal(val name: String) {
    open fun makeSound() {
        println("$name makes a sound.")
    }
}

class Dog(name: String) : Animal(name) {
    override fun makeSound() {
        println("Dog $name barks.")
    }
}

fun main() {
    // 创建Animal对象并调用makeSound方法
    val animal = Animal("Lion")
    animal.makeSound()

    // 创建Dog对象并调用makeSound方法
    val dog = Dog("Bobby")
    dog.makeSound()
}

运行结果: 

Lion makes a sound.
Dog Bobby barks.

三、接口:

  • Kotlin支持接口的定义和实现,接口可以包含抽象方法和属性。
  • 使用interface关键字定义接口,使用implement关键字实现接口。
  • 一个类可以实现多个接口,通过逗号分隔。

 代码演示:

// 接口
interface Shape {
    fun calculateArea(): Double
}

class Rectangle(private val width: Double, private val height: Double) : Shape {
    override fun calculateArea(): Double {
        return width * height
    }
}
fun main() {
 
    // 接口示例
    val rectangle = Rectangle(5.0, 3.0)
    val area = rectangle.calculateArea()
    println("The area of the rectangle is $area")

  }

运行结果: 

The area of the rectangle is 15

 四、封装和访问控制:

  • Kotlin提供了四种访问控制修饰符:privateprotectedinternalpublic
  • 默认情况下,成员都是public可见性的。
  • 使用private修饰符限制成员只能在类内部访问,使用protected修饰符允许子类访问。

java与kotlin对比:

 

代码演示: 

class Person(private val name: String, protected var age: Int) {
    fun introduce() {
        println("My name is $name.")
    }
    
    fun updateAge(newAge: Int) {
        age = newAge
    }
}

class Employee(name: String, age: Int, private val company: String) : Person(name, age) {
    fun work() {
        println("$name works at $company.")
    }
}

fun main() {
    val person = Person("Alice", 25)
    // 访问private属性,只能在类内部访问
    // person.name   // 编译错误:Unresolved reference: name
    person.introduce()
    
    val employee = Employee("Bob", 30, "ABC Company")
    // 访问protected属性,子类可以访问
    // employee.age   // 编译错误:Unresolved reference: age
    employee.work()
    
    // 修改age属性
    employee.updateAge(32)
    employee.work()
}

        在上述代码中,我们定义了一个Person类和一个Employee类。Person类有一个私有的name属性和一个受保护的age属性。Employee类继承自Person类,拥有所有从父类继承而来的属性和方法,并且还有一个私有的company属性。

        在main函数中,我们创建了一个Person对象和一个Employee对象。我们无法直接访问Person对象的私有属性name,也无法直接访问Employee对象的受保护属性age,因为这些属性的可见性受到限制。但我们可以通过调用公共的成员函数来间接访问这些属性。

        通过在Employee类中调用父类Person的updateAge方法,我们成功修改了age属性的值。

运行结果:

My name is Alice.
Bob works at ABC Company.
Bob works at ABC Company.

五、属性和字段:

  • Kotlin中的属性可以自动为字段生成getter和setter方法。
  • 可以使用val关键字定义只读属性(只有getter),使用var关键字定义可变属性(包括getter和setter)。
  • 也可以自定义属性的getter和setter方法。

 代码演示:

package com.example.kotlin
class Person {
    var height: Double = 170.0  // 初始化属性

    var isTall: Boolean
        get() {
            return height >= 180  // 自定义getter方法
        }
        set(value) {
            height = if (value) {
                185.0  // 自定义setter方法
            } else {
                170.0
            }
        }
}

fun main() {
    val person = Person()
    println(person.isTall)  // 调用自定义的getter方法判断是否高个子
    println(person.height)
    person.isTall = true  // 调用自定义的setter方法将身高设置为185
    println(person.height)
}

 运行结果:

 六、数据类:

  •  数据类是Kotlin提供的一种特殊类型的类,用于存储和操作数据。
  •  在数据类中,编译器会自动生成equals()、hashCode()、toString()等方法。
  • 使用data class关键字定义数据类。

 代码演示:

data class Person(val name: String, val age: Int)

fun main() {
    val person1 = Person("John", 25)
    val person2 = Person("John", 25)
    
    println(person1)  // 调用自动生成的toString()方法
    println(person1 == person2)  // 调用自动生成的equals()方法
    
    val person3 = person1.copy(age = 30)  // 使用copy()方法复制对象并修改其中的属性
    
    println(person3)
}

 运行结果: 

七、扩展函数和扩展属性:

  • Kotlin允许对已有的类添加新的函数和属性,称之为扩展函数和扩展属性。
  • 使用fun ClassName.methodName()来定义扩展函数。
  • 使用val ClassName.propertyName来定义扩展属性。 

代码演示:

// 定义一个String类型的扩展函数
fun String.addWelcomeMessage(): String {
    return "Welcome, $this!"  // 在字符串前面添加欢迎消息
}

// 定义一个Int类型的扩展属性
val Int.isEven: Boolean
    get() = this % 2 == 0  // 判断整数是否为偶数

fun main() {
    val name = "John"
    println(name.addWelcomeMessage())  // 调用扩展函数为字符串添加欢迎消息

    val number = 6
    println(number.isEven)  // 调用扩展属性判断整数是否为偶数
}

 运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot复习:(47)ConfigFileApplicationListener

它监听ApplicationEnvironmentPreparedEvent和ApplicationPreparedEvent。 它会把配置文件中配置的内容注入到环境中去,配置文件也就生效了

Photoshop快捷键大全

Photoshop是一款非常强大的图像处理软件,它提供了许多快捷键,可以帮助用户更快地完成操作。熟练掌握这些快捷键,可以大大提高工作效率,让您更加专注于创作。 Photoshop快捷键汇总: 一、基本操作快捷键 1. 新建文档…

TX Text Control .NET Server for ASP.NET Crack

TX Text Control .NET Server for ASP.NET Crack TX Text Control.NET Server for ASP.NET是用于Web应用程序或服务的服务器端组件。它是一个完全可编程的ASP.NET文字处理引擎,提供了广泛的文字处理功能。使用TX Text Control.NET Server,程序员可以开发…

day3 TCP/UDP基础模型、多点通信、TCP开发服务器模型

1.多线程中的newfd,能否修改成全局,不行,为什么? 不能。线程之间共享附属进程的所有资源,newfd是全局变量,作用域是全局,一经更改所有线程中的newfd都会变化。 2.多线程中分支线程的newfd能否…

Android 并发编程--阻塞队列和线程池

一、阻塞队列 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作…

TCP消息传输可靠性保证

TCP链接与断开 -- 三次握手&四次挥手 三次握手 TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作。 所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。在socket编程中,这一…

NLP文本匹配任务Text Matching [无监督训练]:SimCSE、ESimCSE、DiffCSE 项目实践

NLP文本匹配任务Text Matching [无监督训练]:SimCSE、ESimCSE、DiffCSE 项目实践 文本匹配多用于计算两个文本之间的相似度,该示例会基于 ESimCSE 实现一个无监督的文本匹配模型的训练流程。文本匹配多用于计算两段「自然文本」之间的「相似度」。 例如…

【ARM】Day1

作业1:思维导图 作业2: 作业3:用for循环实现1~100之间和5050

【Axure高保真原型】通过输入框动态控制环形图

今天和大家分享通过输入框动态控制环形图的原型模板,在输入框里维护项目数据,可以自动生成对应的环形图,鼠标移入对应扇形,可以查看对应数据。使用也非常方便,只需要修改输入框里的数据,或者复制粘贴文本&a…

Go语言为何强大?Python性能差为何霸榜编程语言第一?

目录 Go 语言为何强大 Go、C、C、Java、python做个简单的性能比较 Python底层是如何调用C代码的 为什么python在数据科学、机器学习和自动化较其他语言有优势 对一名软件工程师而言,语言虽然只是一门工具,往往一个软件工程师身上都会写好几门&#x…

MQTT基础入门与资料收集

文章目录 目的基础入门MQTT相关软件MQTT客户端软件MQTT Broker(服务器)软件 MQTT编程总结 目的 最近项目中涉及到MQTT相关内容,在此对相关内容做个基础的梳理。 基础入门 MQTT官网: https://mqtt.org/ MQTT是用于物联网&#x…

十大经典排序算法

目录 前言 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序 十大排序之间的比较 总结 前言 学了数据结构之后一直没有进行文字性的总结,现在趁着还有点时间把相关排序的思路和代码实现来写一下。概念的话网上…

【LeetCode】307 . 区域和检索 - 数组可修改

307 . 区域和检索 - 数组可修改 区间和解题思路 这是一道很经典的题目,通常还能拓展出一大类问题。 针对不同的题目,我们有不同的方案可以选择(假设我们有一个数组): 数组不变,求区间和:「前缀和…

多线程(进阶)

一、常见的锁策略 1.1读写锁 多线程之间,数据的读取方之间不会产生线程安全问题,但数据的写入方互相之间以及和读者之间都需 要进行互斥。如果两种场景下都用同一个锁,就会产生极大的性能损耗。所以读写锁因此而产生。 读写锁(r…

高通清库存芯片大降价,由于手机复苏不及预期

KlipC报道:8月14日,高通为刺激客户拉货意愿并加快出清库存,近期也开启了降价模式,锁定中低端 5G 手机芯片。 KlipC的合伙人Andi D指出高通在非苹中高端手机市场一直处于领先地位,因此本次降价聚焦在中低阶领域&#xf…

生成模型的三个挑战:成功部署或吓跑用户?

一、说明 目前在文本和图像领域中,统治江湖的有六大门派,他们是:OpenAI,Google,Microsoft,Midjounery,StabilityAI,CharecterAI. 每个人都在竞相为文本到文本,文本到图像…

万物识别RAM:图像识别模型,Zero-Shot超越有监督

文章目录 RAM的优势RAM的创新点总结与展望参考文献大语言模型(Large Language Models)已经给自然语言处理(NLP)领域带来了新的革命。在计算机视觉(CV)领域,Facebook近期推出的Segment Anything Model(SAM)工作,在视觉定位(Localization)任务上取得了令人振奋的结果…

怎么对视频进行压缩?

怎么对视频进行压缩?视频压缩,我们都知道是将视频文件进行压缩变小的过程,是我们日常办公中较为常用的手段。现如今,在视频技术不断发展与创新的基础上,视频分辨率也在不断提高,进而导致文件占有量也非常大…

vue-cli前端工程化——创建vue-cli工程 router版本的创建 目录结构 案例初步

目录 引出创建vue-cli前端工程vue-cli是什么自动构建创建vue-cli项目选择Vue的版本号 手动安装进行选择创建成功 手动创建router版多了一个router 运行测试bug解决 Vue项目结构main.jspackage.jsonvue.config.js Vue项目初步hello案例 总结 引出 1.vue-cli是啥,创建…

Docker中部署Nginx

1.Nginx部署需求 2.操作教程 3.实际步骤 把配置粘过来。