Kotlin 面向对象(二)

【文字内容源于《疯狂Kotlin讲义》,代码内容原创】

Kotlin 面向对象(一)_桃子不出的博客-CSDN博客

目录

四、隐藏和封装

1、包和导包

2、Kotlin的默认导入

3、使用访问控制符

五、深入构造器

1、主构造器和初始化块

2、次构造器和构造器重载

3、主构造器声明属性


四、隐藏和封装

封装( Encapsulation )是面向对象的三大特征之一(另外两个特征是继承和多态)。指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。

封装是面向对象编程语言对客观世界的模拟,在客观世界里,对象的状态信息都被隐藏在对象内部,外界无法直接操作和修改。对一个类或对象实现良好的封装,可以实现以下目的:
  • 隐藏类的实现细节
  • 让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对属性的不合理访问
  • 可进行数据检查,从而有利于保证对象信息的完整性
  • 便于修改,提高代码的可维护性

为了实现良好的封装,需要从两个方面考虑:

  • 将对象的属性和实现细节隐藏起来,不允许外部直接访问
  • 把方法暴露出来,让方法来控制对这些属性进行安全的访问和操作

1、包和导包

Kotlin 的包与 Java 的包相同,既是逻辑上的一个程序单元,也是一个命名空间。如果希望把函数、类放在指定的包结构下 ,则应该在 Kotlin 源程序的第一个非注释行放置如下格式的代码

package com.example.kotlintest

2、Kotlin的默认导入

Kotlin 默认会导入如下包:

  • kotlin.*
  • kotlin.annotation. *
  • kotlin.collections. *
  • kotlin.comparisons. * (自 Kotlin1.1起)
  • kotlin.io. *
  • kotlin.ranges.*
  • kotlin.sequences. *
  • kotlin.text. *

此外,对于JVM平台,还会自动导入如下两个包:

  • java.lang.*
  • kotlin.jvm. *

对于 JavaScript 平台,则额外导入如下包:

  • kotlin.js.*

3、使用访问控制符

Kotlin 提供了4个访问控制符 private、internal、protected、public 分别代表4个访问控制级别。 

  • private:与Java private类似private成员只能在该类的内部或文件的内部被访问
  • internalinternal成员可以在该类的内部或文件的内部或者同一个模块内被访问
  • protected:protected 成员可以在该类的内部或文件的内部或者其子类中被访问
  • public:public成语可以在任意地方被访问

五、深入构造器

构造器用于在创建实例时执行初始化。构造器是创建对象的重要途径,因此Kotlin类必须包含一个或一个以上的构造器。

1、主构造器和初始化块

Kotlin 类可以定义0~1个主构造器和0~N个次构造器。如果主构造器没有任何注解或可见性修饰符,则可以省略 constructor 关键字。

主构造器作为类头的一部分,可以声明形参,但它自己并没有执行体。那么主构造器的形参有什么用呢?其作用主要有两点:

【1】初始化块可以使用主构造器定义的形参

【2】在声明属性时可以使用主构造器定义的形参

由此可见, Kotlin 主构造器并不是传统意义上的构造器,它更像 Java 的初始化块,或者说是对初始化块的增强一-Java 的初始化块不能传入参数: Kotlin 通过主构造器的设计,允许为初始化块传入参数。
class Apple(name: String) {

    init {
        println("name is $name")
    }
}

调用函数:
Apple("红富士")

运行结果:
name is 红富士

程序调用主构造器创建对象,实际上就是执行初始化块。由此可见,主构造器的主要作用就是为初始化块定义参数,因此主构造器更像是初始化块的一部分。也可以说,初始化块就是主构造器的执行体。

2、次构造器和构造器重载

class Apple {

    var name: String?

    constructor() {
        name = "null"
    }

    constructor(name: String) {
        this.name = name
    }

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

调用方法:
val a1 = Apple()
val a2 = Apple("红富士")
println("${a1.name}")
println("${a2.name}")

运行结果:
init...
init...
null
红富士

上面的Apple类提供了两个重载的次构造器,但它们的形参列表不同。在调用构造器时,系统将根据传入的实参列表来决定调用哪个构造器。

从运行结果可以看出,不管调用哪个构造器创建对象,系统总会先执行初始化块。也就是说,初始化块总会在所有次构造器之前执行。用 Kotlin的专业术语来说,叫作:所有的次构造器都要委托调用初始化块。

class Apple(name: String) {

    operator fun component1(): String {
        return this.name
    }

    operator fun component2(): String {
        return this.color
    }

    var name: String
    var color: String

    //委托给主构造器
    constructor(name: String, color: String) : this(name) {
        this.color = color
    }

    init {
        println("init...")
        this.name = name
        this.color = "default"
        println("name is $name, color is $color")
    }
}

调用函数:
val (name1, color1) = Apple("红富士")
val (name2, color2) = Apple("红富士", "红色")
println("$name1, $color1")
println("$name2, $color2")

运行结果:
init...
name is 红富士, color is default
init...
name is 红富士, color is default
红富士, default
红富士, 红色

当程序调用主构造器创建实例时 主构造器自动执行初始化块;程序调用次构造器创建实例时,也会先执行初始化块,这是由于它们都委托了主构造器的缘故。

3、主构造器声明属性

Kotlin 允许在主构造器上声明属性,直接在参数之前使用 var / val 即可声明属性一一使用var 声明的是读写属性,使用 val 声明的是只读属性。当程序调用这种方式声明的主构造器创建对象时,传给该构造器的参数将会赋值给对象的属性。

class Apple(var name: String) {

}

调用函数:
val apple = Apple("红富士")
println("apple name is ${apple.name}")


运行结果:
apple name is 红富士

 

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

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

相关文章

Redis —缓存常见异常

文章目录缓存雪崩解决办法缓存击穿解决办法缓存穿透缓存穿透的两种常见情况解决办法布隆过滤器工作原理缓存雪崩 大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机时,如果此时有大量的用户请求,都无法在 Redis 中处理&#…

父子组件传值问题

文章目录前言一、问题描述二、问题解决前言 在写毕业设计,涉及了一些前端Vue.js的组件传值知识并出现了相关问题,因此进行记录。 问题 Vue.js的使用不熟练,相关组件、props等掌握不清晰前端代码书写不规范 望指正! 一、问题描述 …

php企业公司员工考勤加班系统

1、系统管理员 负责员工的基本信息管理(包括姓名、工号、所在部门信息的添加、修改和删除)和员工的上下班时间的添加。 公司考勤记录方式为刷上下班卡,卡机自动记录员工上下班时间。我直接跳过这一步,系统管理员每天在员工下班后直…

面试被问到:测试计划和测试方案有什么区别?

面试的时候,很多小伙伴都被面试官问过这个问题 “测试计划和测试方案有什么区别”? 到底有什么区别呢?我们先好好了解下这两个文档。 一、测试计划 1、测试计划是什么? 测试计划是组织管理层面的文件,从组织管理的…

派盘为您的个人数据安家

现如今,我们的生活中有着各种各样的数据。在工作中会有各种文件、邮件;在生活中则有照片和视频等。数据的来源多,时间点不一致且混乱。 数据是否能安全、稳定、长久的存储以及便捷高效的使用对我们来说相当重要。你是否经常出差需要带上电脑或者移动硬盘,想存网盘又怕丢失或…

一篇文章,弄懂蓝牙协议怎么看,进军物联网!

做过物联网相关项目的小伙伴都知道,避免不了和蓝牙,串口通信打交道。所以了解怎么看蓝牙协议基本上可以说是进军物联网的一大助力。很多新人小伙伴刚进入这个行业都是一脸懵逼的,特别是接入的时候,对方直接给了一个文档&#xff0…

【WCH】基于Keil环境CH32F203 GPIO点灯实验

【WCH】基于Keil环境CH32F203 GPIO点灯实验📌相关篇《关于CH32F203程序下载方式说明》 ✨如果是首次入门使用,请先看上面的相关篇内容,了解其下载相关事宜后,再进来学习。 GPIO模式介绍 🌿在应用手册的第十章介绍GPIO…

1mm³大小,世界首个功率破KW的单芯片激光模组诞生

近年来随着技术不断发展,激光雷达的体积、成本也在不断降低,成为了一种受到各行业关注的关键技术。它的用途越发广泛,可用于自动驾驶汽车、大气观测使用的LiDAR传感器,还可以用于医疗保健(治疗和检查分析)、…

给boss直聘的搜索结果加上hr活跃状态,少看点半年活跃的岗位

背景:这段时间找工作,无奈大环境不好,所在城市大部分公司都投了。就是没几个回复的,要么送达,要么已读不回,要么拿了简历没见邀约。然后boss为了争取我们多浏览网站,把一些陈年老醋也拿上台面&a…

阿里巴巴春招的后端面经来啦~

操作系统 一个操作系统,我们在衡量它的内存占用的时候,它一般会有哪些内存的部分? 读者答:堆和栈 补充: 这个其实是问你对free命令的理解。 主机的内存做一些清理的动作。你知道这里面会涉及到对哪些内存区域进行操…

yolov5-v7.0实例分割快速体验

简介 🚀yolov5-v7.0版本正式发布,本次更新的v7.0则是全面的大版本升级,最主要的功能就是全面集成支持了实例分割,yolov5已经集成检测、分类、分割任务。 前面几篇文章已经介绍过关于Yolov5的一些方面 yolov5目标检测:https://bl…

CIE (PCI Express) 1x, 4x, 8x, 16x总线端子说明

1、概述 PCI Express作为一种高带宽、低引脚数、串行、互连技术。它是为了取代旧的PCI和AGBus标准而设计的。PCIe比旧标准有许多改进,包括更高的最大系统总线吞吐量、更低的I/O引脚数和更小的物理占地面积、更好的总线设备性能扩展、更详细的错误检测和报告机制&am…

4.7--计算机网络之TCP篇之socket编程--(复习+深入)---好好沉淀,加油呀

1.针对 TCP 应该如何 Socket 编程? 1.服务端和客户端初始化 socket,得到文件描述符; 2.服务端调用 bind,将 socket 绑定在指定的 IP 地址和端口; 3.服务端调用 listen,进行监听; 4.服务端调用 accept&#…

版本控制工具Git的常见命令与使用方法

目录概述基础命令提交代码把代码提交到暂存区把代码提交到版本库同一笔提交想追加修改回退代码对代码进行了修改,想回退工作区的修改执行了add操作,想回退到工作区执行了commit操作,想撤销修改执行了commit操作,想回退到暂存区挑代…

二、Java 并发编程(1)

本章概要 常见的 Java 线程创建方式 继承 Thread 类实现 Runnable 接口通过 ExecutorService 和 Callable 接口实现有返回值的线程基于线程池 Java 线程池的原理 线程复用线程池的核心组件和核心类Java 线程池的工作流程线程池的拒绝策略 相对于传统的单线程,多线…

Nuxt项目动态路由带参接参

我们创建一个Nuxt项目 然后 在pages目录下创建 engineering.vue文件 参考代码如下 <template><div><div>工程界面</div><nuxt-child></nuxt-child></div> </template><script> export default {name: EngineeringPage …

java微服务商城高并发秒杀项目--008.订单服务继承Sentinel以及sentinel安装dashboard

在shop-order-service增加Sentinel依赖&#xff1a;<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-a libaba-sentinel</artifactId> </dependency>安装dashboard组件windows系统直接在1.8.0.jar中cm…

SMPL Model转换为bvh格式 (SMPL to BVH ) Python

BVH BVH是BioVision等设备对人体运动进行捕获后产生文件格式的文件扩展名。 BVH文件 BVH文件包含角色的骨骼和肢体关节旋转数据。BVH 是一种通用的人体特征动画文件格式&#xff0c;广泛地被当今流行的各种动画制作软件支持。通常可从记录人类行为运动的运动捕获硬件获得。 B…

说说如何借助webpack来优化前端性能?

通过webpack优化前端的手段有&#xff1a; ① JS代码压缩 ② CSS代码压缩 ③ HTML文件代码压缩 ④ 文件大小压缩 ⑤ 图片压缩 ⑥ Tree Shaking ⑦ 代码分离 ⑧ 内联 chunk 1、JS代码压缩 terser是一个JavaScript的解释、绞肉机、压…

2023年第十四届蓝桥杯将至,来看看第十三届蓝桥杯javaB组题目如何

ฅ(๑˙o˙๑)ฅ 大家好, 欢迎大家光临我的博客&#xff1a;面向阿尼亚学习 算法学习笔记系列持续更新中~ 文章目录一、前言二、2022年蓝桥杯javaB组省赛真题目录A:星期计算[5分]思路⭐代码&#x1f31f;B 山(5分)思路⭐代码&#x1f31f;C 字符统计(10分)思路⭐代码&#x1f3…
最新文章