Kotlin学习记录

Kotlin学习记录

  • 1. 权限修饰符
    • 1.1 internal 修饰符
    • 1.2 open 修饰符
  • 2 其它修饰符
    • 2.1 lateinit 修饰符
    • 2.2 inline 修饰符
    • 2.3 var 修饰符 (变量)
    • 2.4 val 修饰符 (常量)
    • 2.5 typealias
  • 3 申明对象
    • 3.1 申明对象不赋值
    • 3.2 申明对象并实例化
    • 3.3 申明常量并用 by lazy 懒加载
  • 4 类、接口、object、fun、const
    • 4.1 class
    • 4.2 interface
    • 4.3 object
    • 4.4 fun
    • 4.5 const
  • 5 suspend挂起函数,必须在Coroutine协程中使用

1. 权限修饰符

除了java的 publicprotecteddefaultprivate 外,又有独特的 internalopen 修饰符。

1.1 internal 修饰符

直译为内部的,访问范围是当前模块可见。使用示例:

// 可以对类修饰
internal class MapboxNavigationAppDelegate { }// 可以对常量修饰,val 为申明常量,var 为申明变量
internal val carAppLifecycleObserver = object : DefaultLifecycleObserver { }// 可以对构造方法和变量修饰
class EtcGateApi internal constructor(internal var experimental: com.mapbox.navigator.Experimental
) {  }

1.2 open 修饰符

默认情况下 class 和成员都是具备 final 修饰符的,即无法被继承和复写。
如果可以被继承或复写,需要添加 open 修饰。使用示例:

open class AutoArrivalController : ArrivalController { }open fun nextChain(chain: AudioTypeResolver) {  }

更多kotlin权限修饰符介绍参考

2 其它修饰符

2.1 lateinit 修饰符

  • 延迟初始化,但又相当于有java中的 @NotNull 注解,所以在使用之前必须已经实例化,否则会报错。
  • lateinit 不能用来修饰基本数据类型,因为基本类型的属性在类加载后的准备阶段都会被初始化为默认值。
  • lateinit不能修饰val常量,只能修饰可变的属性。

2.2 inline 修饰符

inline——内联函数修饰符

inline fun logI(category: String? = null, lazyMsg: () -> String) {if (logLevel().accepts(LoggingLevel.INFO)) {logI(lazyMsg(), category)}
}

2.3 var 修饰符 (变量)

2.4 val 修饰符 (常量)

2.5 typealias

它的作用十分简单,给已有类型取一个别名,可以像使用原类型一样使用这个 “类型别名” 。

private typealias SDKRoadGraphVersionInfo = com.mapbox.navigation.core.RoadGraphVersionInfo

3 申明对象

3.1 申明对象不赋值

private lateinit var navigationCamera: NavigationCamera

3.2 申明对象并实例化

// 基本类型
private var clearingPlayedEvents = false// Class对象
private var historyTimeOffset: Double = 0.0
private val navigationLocationProvider = NavigationLocationProvider()
private var currentJob: Job? = null

3.3 申明常量并用 by lazy 懒加载

类似 lateinit 修饰符 ,但这个懒加载用来申明常量,而 lateinit 修饰符 只能用来申明变量。

private val overviewPadding: EdgeInsets by lazy {EdgeInsets(140.0 * pixelDensity,40.0 * pixelDensity,120.0 * pixelDensity,40.0 * pixelDensity)
}

4 类、接口、object、fun、const

这五种都可以单独定义在一个.kt文件中,也可以多种类型组合。

4.1 class

// 实现了LoggerFrontend接口的 MapboxCommonLoggerFrontend 类
internal class MapboxCommonLoggerFrontend : LoggerFrontend {  }// 继承某个类需要后面加(),还有实现的其它接口用逗号隔开添加
class MapboxNavigationActivity : AppCompatActivity(), OnClickListener {  }// 带构造参数的类定义,有些参数是常量,被传入后不再能修改,有些参数被直接定义,并且是用其它的参数来构造
class NavigationCamera(mapboxMap: MapboxMap,private val cameraPlugin: CameraAnimationsPlugin,private val viewportDataSource: ViewportDataSource,private val stateTransition: NavigationCameraStateTransition =MapboxNavigationCameraStateTransition(mapboxMap, cameraPlugin)
) {  }// 带构造参数的类定义,用 constructor 的方式
class RoadGraphVersionInfo internal constructor(val dataset: String, val version: String) {  }// constructor 定义其它的构造函数
class MapboxNavigation @VisibleForTesting internal constructor(val navigationOptions: NavigationOptions,private val threadController: ThreadController,
) {constructor(navigationOptions: NavigationOptions) : this(navigationOptions, ThreadController())}

4.2 interface

将接口作为一个常量实现,如果接口只有一个方法,可以 = 接口名{ 实现方法 };如果有多个方法要 = object : 接口名{ 实现方法 }

interface Time { }

4.3 object

object InternalJobControlFactory { // 内部可以定义fun和constfun createDefaultScopeJobControl(): JobControl {val parentJob = SupervisorJob()return JobControl(parentJob, CoroutineScope(parentJob + Dispatchers.Default))}
}

4.4 fun

package com.mapbox.navigation.utils.internalimport android.location.Location
import com.mapbox.geojson.Pointfun Location.toPoint(): Point {return Point.fromLngLat(this.longitude, this.latitude)
}

4.5 const

package com.mapbox.navigation.utils.internalconst val NOTIFICATION_CHANNEL = "Navigation Notifications"
const val NAVIGATION_NOTIFICATION_CHANNEL = "NAVIGATION_NOTIFICATION_CHANNEL"
const val END_NAVIGATION_ACTION = "com.mapbox.intent.action.END_NAVIGATION"
const val SET_BACKGROUND_COLOR = "setBackgroundColor"
const val NOTIFICATION_ID = 7654

5 suspend挂起函数,必须在Coroutine协程中使用

private suspend fun simulateEvents(replayEventsCallback: (List<ReplayEventBase>) -> Unit) {val loopStart = timeSeconds()val replayEvents = movePivot(loopStart)if (replayEvents.isNotEmpty()) {replayEventsCallback(replayEvents)}val loopElapsedSeconds = timeSeconds() - loopStartval loopElapsedMillis = (loopElapsedSeconds * MILLIS_PER_SECOND).roundToLong()val delayMillis = max(0L, REPLAY_UPDATE_SPEED_MILLIS - loopElapsedMillis)delay(delayMillis)
}fun launchSimulator(replayEventsCallback: (List<ReplayEventBase>) -> Unit): Job {resetSimulatorClock()return jobControl.scope.launch { // 协程中使用while (isActive) {if (isDonePlayingEvents()) {delay(IS_DONE_PLAYING_EVENTS_DELAY_MILLIS)} else {simulateEvents(replayEventsCallback) // 上面的挂起函数调用}}}.also {currentJob = it}
}// InternalJobControlFactory是object,提供了main、default、io线程的协程JobControl获取
private val jobControl = InternalJobControlFactory.createMainScopeJobControl()

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

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

相关文章

day-45 代码随想录算法训练营(19)动态规划 part 07

70.爬楼梯&#xff08;进阶&#xff09; 分析&#xff1a;基本动态规划转换为完全背包&#xff0c;因为1、2 两种上楼梯方式是无限选择的 思路&#xff1a; 1. j 表示 容量为 j 时&#xff0c;装满有dp[j]种方法2. dp[j]dp[j-nums[i]]3. 初始化 dp[0]1,dp[1]14. 遍历顺序&am…

[docker]笔记-portainer的安装

1、portainer是一款可视化的容器管理软件&#xff0c;利用portainer可以轻松方便的管理和创建容器。portainer本身是一个容器&#xff0c;完全免费并且具有汉化版。本文介绍portainer的安装和使用。 2、安装好容器并配置好容器环境&#xff0c;可参照https://blog.csdn.net/bl…

智安网络|面临日益增长的安全威胁:云安全和零信任架构的重要性

随着云计算技术的快速发展和广泛应用&#xff0c;云安全和零信任架构变得愈发重要。在数字化时代&#xff0c;云计算技术得到了广泛的应用和推广。企业和组织借助云服务提供商的强大能力&#xff0c;实现了高效、灵活和可扩展的IT基础设施。然而&#xff0c;随着云环境的快速发…

解决VSCode调试或者发布运行时闪退问题

解决方案&#xff1a;此方案不一定适合所有类型的闪退&#xff0c;但可以尝试一下。 步骤1&#xff1a;依次选择&#xff1a;文件→首选项→设置 步骤2&#xff1a;搜索 terminal.integrated.Default →找到Terminal > Integrated Default Profile: Windows选项→下拉框的…

Reinforcement Learning for Solving the Vehicle Routing Problem

Reinforcement Learning for Solving the Vehicle Routing Problem 一、背景二、模型三、公式 一、背景 本篇论文讨论一种有容量限制的版本CVRP&#xff0c;一辆有有限容量的车辆负责向地理分布的、需求有限的客户交付物品&#xff1b;当车辆的负载耗尽&#xff0c;它返回仓库…

200行代码实现canvas九宫格密码锁

现在很多app&#xff0c;在一些隐私页面&#xff0c;往往都会加入二次验证&#xff0c;例如银行app、支付宝理财和我的页面&#xff0c;一般会有「九宫格密码」和指纹密码。 今天我们用canvas来写一个九宫格手势密码锁&#xff0c;大概就是下面这样。 思路 准备一个正方形画布…

motionface respeak新的aigc视频与音频对口型数字人

在当今的数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;正在逐渐渗透到我们生活的方方面面。其中&#xff0c;AI技术在视频制作和处理领域的应用也日益广泛。本文将探讨如何利用AI技术实现视频中人脸与音频同步对口型的方法&#xff0c;旨在进一步丰富视频制作的效…

手写Spring:第7章-实现应用上下文

文章目录 一、目标&#xff1a;实现应用上下文二、设计&#xff1a;实现应用上下文三、实现&#xff1a;实现应用上下文3.1 工程结构3.2 Spring应用上下文和Bean对象扩展类图3.3 对象工厂和对象扩展接口3.3.1 对象工厂扩展接口3.3.2 对象扩展接口 3.4 定义应用上下文3.4.1 定义…

MySQL卸载干净再重新安装【Windows】

家人们&#xff0c;谁懂啊&#xff1f; 上学期学的数据库&#xff0c;由于上学期不知道为什么抽风&#xff0c;过得十分的迷&#xff0c;上课跟老师步骤安装好了Mysql&#xff0c;但后面在使用的过程中出现了问题&#xff0c;而且还出现了忘记密码这么蠢的操作&#xff0c;后半…

Splunk Enterprise for Mac:卓越的数据分析与管理工具

在当今的数字化时代&#xff0c;数据已经成为企业成功的核心驱动力。然而&#xff0c;如何有效地管理和分析这些数据&#xff0c;却常常让企业感到困惑。Splunk Enterprise for Mac 是一款领先的数据分析和管理工具&#xff0c;可以帮助你解决这一难题。 Splunk Enterprise fo…

【ES6】class静态方法

类相当于实例的原型&#xff0c;所有在类中定义的方法&#xff0c;都会被实例继承。如果在一个方法前&#xff0c;加上static关键字&#xff0c;就表示该方法不会被实例继承&#xff0c;而是直接通过类来调用&#xff0c;这就称为“静态方法”。 class Foo {static classMetho…

在linux上挂载windows共享目录

挂载要求 非root用户&#xff08;普通用户&#xff09;能够读写windows共享目录&#xff0c;比如查看文件、创建文件、修改文件、删除文件 # 让普通用户也可以正常读写 uidvalue and gidvalue Set the owner and group of the root of the file system (default: uidgid0, bu…

阿里云ubuntu服务器搭建ftp服务器

阿里云ubuntu服务器搭建ftp服务器 服务器环境安装步骤一.创建用户二.安装 vsftp三 配置vsftp四.配置阿里云安全组 服务器环境 阿里云上的云服务器&#xff0c;操作系统为 ubuntu20.04。 安装步骤 一.创建用户 为什么需要创建用户&#xff1f; 这里的用户&#xff0c;指的是…

美国CN2服务器速度怎么样

美国服务器以免备案、大带宽、性价比高的优势&#xff0c;多用于企业、电商、外贸、视频等个中大型网站建设。但是&#xff0c;因中美服 务器接口原因&#xff0c;导致某些服务器的网络并不稳定&#xff0c;这时候就会对美国服务器产品失望&#xff0c;解决这种问题的方法就是选…

NFT 合约部署教程

本篇文章主要介绍如何将您的 NFT(ERC-721 Token) 通过智能合约部署到去中心化网络中 Init Project //创建一款ocean的NFT mkdir nft-ocean//进入目录 cd nft-ocean//初始化项目&#xff0c;根据提示填写即可&#xff0c;packname和description填写即可 npm init//添加hardhat…

QT Creator更改主题和编辑器风格(附几款黑色主题)

适用于qtcreator 一、使用自带主题与编辑器风格 打开Qt选择"工具"->"选项"&#xff1b; 2. 选择"环境"->"Theme"切换不同的主题风格 这里切换的是外边框的风格&#xff0c;如果编辑器中有同名的风格&#xff0c;编辑器的风格也…

数据可视化:四大发明的现代转化引擎

在科技和工业的蓬勃发展中&#xff0c;中国的四大发明——造纸术、印刷术、火药和指南针&#xff0c;早已不再是古代创新的象征&#xff0c;而是催生了众多衍生行业的崭新可能性。其中&#xff0c;数据可视化技术正成为这些行业的一颗璀璨明珠&#xff0c;开启了全新的时代。 1…

(数字图像处理MATLAB+Python)第十二章图像编码-第三、四节:有损编码和JPEG

文章目录 一&#xff1a;有损编码&#xff08;1&#xff09;预测编码A&#xff1a;概述B&#xff1a;DM编码C&#xff1a;最优预测器 &#xff08;2&#xff09;变换编码A&#xff1a;概述B&#xff1a;实现变换编码的主要问题 二&#xff1a;JPEG 一&#xff1a;有损编码 &am…

基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析能力与项目科研水平教程

详情点击链接&#xff1a;基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析能力与项目科研水平教程 一&#xff0c;空间数据获取与制图 1.1 软件安装与应用 1.2 空间数据 1.3海量空间数据下载 1.4 ArcGIS软件…

推断统计|显著性水平|无偏抽样

推断统计则是研究如何利用样本数据来推断总体特征的统计学方法&#xff0c;其内容包括参数估计和假设检验两大类。其中&#xff0c;参数估计是利用样本信息推断总体特征&#xff1b;假设检验是利用样本信息判断对总体的假设是否成立。 推断统计学是统计学的一个重要分支&#…