Kotlin 面向对象编程 (OOP) 基础:类、对象与继承详解
什么是面向对象编程 (OOP)?
OOP 代表面向对象编程。
过程式编程是编写执行数据操作的过程或方法,而面向对象编程则是创建包含数据和方法的对象。
与过程式编程相比,面向对象编程具有以下几个优势:
OOP更快且更易于执行OOP为程序提供了清晰的结构OOP有助于保持Kotlin代码的DRY原则(“不要重复自己”),使代码更易于维护、修改和调试OOP使得创建可重用的完整应用程序成为可能,使用更少的代码和更短的开发时间
提示:“不要重复自己” (DRY - Don't repeat yourself) 原则旨在减少代码的重复。您应该将应用程序中常见的代码提取出来,放在一个地方重复使用,而不是一遍又一遍地编写相同的代码。
Kotlin - 什么是类和对象?
类和对象是面向对象编程的两个主要方面。
看看下面的示意图,了解类和对象之间的区别:
类
- 水果
对象
- 苹果
- 香蕉
- 芒果
另一个例子:
类
- 汽车
对象
- 沃尔沃
- 奥迪
- 丰田
因此,类 是 对象 的模板,而 对象 是 类 的实例。
当创建单个对象时,它们继承了类中的所有变量和方法。
Kotlin 类和对象
在 Kotlin 中,一切都与类和对象以及它们的属性和函数相关。例如:在现实生活中,汽车是一个对象。汽车有属性,例如品牌、重量和颜色;以及功能,例如驾驶和刹车。
类 就像是对象的构造器,或者说是创建对象的“蓝图”。
创建一个类
要创建一个类,请使用 class 关键字,并指定类的名称:
示例
创建一个包含一些属性(品牌、型号和年份)的 Car 类:
class Car {
var brand = ""
var model = ""
var year = 0
}
属性基本上是属于类的变量。
重要提示:为了更好地组织代码,通常建议类的名称以大写字母开头。
创建一个对象
现在我们可以使用名为 Car 的类来创建对象。
在下面的示例中,我们创建了一个名为 c1 的 Car 对象,然后使用点语法(.)访问 c1 的属性,就像我们访问数组和字符串的属性一样:
示例
// 创建 Car 类的 c1 对象
val c1 = Car()
// 访问属性并为其赋值
c1.brand = "Ford"
c1.model = "Mustang"
c1.year = 1969
println(c1.brand) // 输出 Ford
println(c1.model) // 输出 Mustang
println(c1.year) // 输出 1969
多个对象
您可以创建一个类的多个对象:
示例
val c1 = Car()
c1.brand = "Ford"
c1.model = "Mustang"
c1.year = 1969
val c2 = Car()
c2.brand = "BMW"
c2.model = "X5"
c2.year = 1999
println(c1.brand) // Ford
println(c2.brand) // BMW
Kotlin 构造函数
我们创建了一个类的对象,并在类内部指定了属性,如下所示:
示例
class Car {
var brand = ""
var model = ""
var year = 0
}
fun main() {
val c1 = Car()
c1.brand = "Ford"
c1.model = "Mustang"
c1.year = 1969
}
在 Kotlin 中,可以通过使用构造函数更快地完成此操作。
构造函数 就像一个特殊的函数,它通过在类名后面使用两个括号 () 来定义。您可以在括号内指定属性(就像向普通函数传递参数一样)。
构造函数会在您创建类的对象时初始化属性。只需记住指定属性/变量的类型即可:
示例
class Car(var brand: String, var model: String, var year: Int)
fun main() {
val c1 = Car("Ford", "Mustang", 1969)
}
现在指定一个类的多个对象更加简单了:
示例
class Car(var brand: String, var model: String, var year: Int)
fun main() {
val c1 = Car("Ford", "Mustang", 1969)
val c2 = Car("BMW", "X5", 1999)
val c3 = Car("Tesla", "Model S", 2020)
}
Kotlin 类函数
您还可以在类内部使用函数来执行某些操作:
示例
在 Car 类中创建一个 drive() 函数并调用它:
class Car(var brand: String, var model: String, var year: Int) {
// 类函数
fun drive() {
println("Wrooom!")
}
}
fun main() {
val c1 = Car("Ford", "Mustang", 1969)
// 调用函数
c1.drive()
}
提示:当一个函数在类内部声明时,它被称为类函数或成员函数。
注意:当类的对象被创建时,它可以访问所有的类函数。
类函数参数
与普通函数一样,您可以向类函数传递参数:
示例
创建两个函数:drive() 和 speed(),并向 speed() 函数传递参数:
class Car(var brand: String, var model: String, var year: Int) {
// 类函数
fun drive() {
println("Wrooom!")
}
// 带参数的类函数
fun speed(maxSpeed: Int) {
println("最大速度是:" + maxSpeed)
}
}
fun main() {
val c1 = Car("Ford", "Mustang", 1969)
// 调用函数
c1.drive()
c1.speed(200)
}
Kotlin 继承
在 Kotlin 中,可以从一个类继承类属性和函数到另一个类。我们将“继承概念”分为两类:
- 子类 (child) - 继承自另一个类的类
- 超类 (parent) - 被继承的类
在下面的示例中,MyChildClass(子类)继承了 MyParentClass 类(超类)的属性:
示例
// 超类
open class MyParentClass {
val x = 5
}
// 子类
class MyChildClass: MyParentClass() {
fun myFunction() {
println(x) // x 现在从超类继承而来
}
}
// 创建 MyChildClass 的对象并调用 myFunction
fun main() {
val myObj = MyChildClass()
myObj.myFunction()
}
示例解释
- 使用
open关键字修饰超类/父类,使该类可以被其他类继承属性和函数。 - 要继承一个类,请指定子类的名称,后跟冒号
:,然后是超类的名称。
为什么以及何时使用“继承”?
- 它对代码重用非常有用:在创建新类时,可以重用现有类的属性和函数。
最后
为了方便其他设备和平台的小伙伴观看往期文章:
微信公众号搜索:Let us Coding,关注后即可获取最新文章推送
看完如果觉得有帮助,欢迎 点赞、收藏、关注
Kotlin 面向对象编程 (OOP) 基础:类、对象与继承详解的更多相关文章
- 2016/1/17 笔记 1,面向对象编程OOP 2,类 全
面向对象编程OOP 编程方式的发展 1,面向过程 重用性低 维护工作量大 2,面向对象 重用性高 维护容易 概念 1,对象 Object 一个具体的事物 是类的实例 2,类Class 同一 ...
- JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)
一.介绍 老铁们,这次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,但是可以自己创建啊,哈哈). JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分.所以分成三篇博客来逐个理清. ...
- JS--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)
一.介绍 老铁们,这次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,但是可以自己创建啊,哈哈). JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分.所以分成三篇博客来逐个理清. ...
- php面向对象编程(oop)基础知识示例解释
面向对象并不是一种技术,而是一种思想,是一种解决问题的最基本的思维方式!如何理解使用?OOP:面向对象编程 (直接代码说明) 1.面向对象的基本概念 示例demo: <?php header(& ...
- 面向对象编程(OOP)基础之UML基础
在我们学习OOP过程中,难免会见到一些结构图~各种小框框.各种箭头.今天小猪就来简单介绍一下这些框框箭头的意思——UML. UML定义的关系主要有:泛化(继承).实现.依赖.关联.聚合.组合,这六种关 ...
- BigDecimal类对象的使用详解
双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数进行运算和处理.Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行 ...
- JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)
一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...
- JS--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)
一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...
- JS--我发现,原来你是这样的JS:面向对象编程OOP[3]--(JS继承)
一.面向对象编程(继承) 这篇博客是面向对象编程的第三篇,JS继承.继承顾名思义,就是获取父辈的各种"财产"(属性和方法). 怎么实现继承? 我们的JavaScript比较特别了, ...
- Kotlin——从无到有系列之中级篇(四):面向对象的特征与类(class)继承详解
如果您对Kotlin很有兴趣,或者很想学好这门语言,可以关注我的掘金,或者进入我的QQ群大家一起学习.进步. 欢迎各位大佬进群共同研究.探索 QQ群号:497071402 进入正题 在前面的章节中,详 ...
随机推荐
- Java基础:throw和throws的详解
总结来说,throw是用来抛出一个具体的异常实例,而throws是用来声明方法可能会抛出哪些类型的异常,是对调用者的一种通知和要求. 1. throw 作用: throw关键字用于在方法体内实际抛出一 ...
- 实训day2
HTML基本介绍 编辑网页的语言,超文本标记语言,是迄今为止网络上应用最为广泛的语言,也是抱成网页文档的主要语言.HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字.图形.动画.声 ...
- 如何在Zynq-7000上烧写PL Image
由 技术编辑archive1 于 星期六, 06/28/2014 - 10:05 发表 作者:hqin, Xilinx处理器专家FAE 在Zynq-7000上编程PL大致有3种方法: 用FSBL,将b ...
- 张高兴的 MicroPython 入门指南:(一)环境配置、Blink、部署
目录 什么是 MicroPython 环境配置 硬件部分 软件部分 Hello World! Blink Pico 的引脚 常见电子元件 面包板 跳线 开关 发光二极管 电阻 使你的 Pico 闪烁 ...
- 化腐朽为神奇!揭开ISP图像处理的神秘面纱,基于瑞芯微RK3568J工业平台!
ISP图像处理前后图像对比 化腐朽为神奇!经过ISP图像处理的图片前后对比是如此惊人!从下图中可以观察到,未经处理的原始图像偏绿且暗淡,而经ISP图像处理的图像能够清晰地还原现场真实的颜色细节! 图1 ...
- TI AM62x工业开发板规格书(单/双/四核ARM Cortex-A53 + 单核ARM Cortex-M4F,主频1.4GHz)
1 评估板简介 创龙科技TL62x-EVM是一款基于TI Sitara系列AM62x单/双/四核ARM Cortex-A53 + 单核ARM Cortex-M4F多核处理器设计的高性能低功耗工业评估板 ...
- FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
<FFmpeg开发实战:从零基础到短视频上线>一书的"10.2 FFmpeg推流和拉流"提到直播行业存在RTSP和RTMP两种常见的流媒体协议.除此以外,还有比较两 ...
- Basic_pentesting_1靶机渗透流程
Basic_pentesting_1 Description This is a small boot2root VM I created for my university's cyber secu ...
- SpringBoot集成MQTT
MQTT介绍 MQTT 是基于 Publish/Subscribe(发布/订阅) 模式的物联网通信协议,凭借简单易实现.支持 QoS.报文小等特点. 其具有协议简洁.⼩巧.可扩展性强.省流量.省电等优 ...
- 从Java开发者到.NET Core初级工程师学习路线:C#语言基础
1. C#语言基础 1.1 C#语法概览 欢迎来到C#的世界!对于刚从Java转过来的开发者来说,你会发现C#和Java有很多相似之处,但C#也有其独特的魅力和强大之处.让我们一起来探索C#的基本语法 ...