kotlin学习教程

news2024/11/26 15:51:24
  1. kotlin的方法 可以直接调用 不用 new?
    2.kotlin关于字符串 用 $拼接变量
    3.kotlin 类 方法 变量 可以同级的,同级的 方法 和 变量(常量) 是 生成了 一个新的 xxxKt.class ,并且都是 static的,
    4.kotlin的类,方法,默认是 final的,成员变量不是,如果想给成员变量定义,那么指定 val即可(局部变量 没有讨论 static final的 必要)
    5.kotlin变量 可以不初始化吗?(不知道 目前还)
    6.怎么定义 static 伴生类 和 单例类(推荐,因为半生类,还要再类下面写类),用@JVMStatic 注解 修饰 方法 和 成员变量即可
    7.关于修饰符 后面再说
    kotlin 的 类型 分为 可空 和 非空? 即使是 Unit也是 可空 和 非空的,如果定义了 非空变量,那么它一直是 非空的,代码上如果出现可能为 null的情况,idea会提示有问题的,所以如果编译成功,那么一定不会为null

8.Any 是 所有 kt类的 父类,Object是 java类 两者不一样
9.如果 在 kotlin中,知道 这个类型 一定是 某个具体的类型,那么 kotlin会自动将其转换成其类型,不像 java 要 强制转换才行
如果真的 不知道,你想要 强转,那么用 a As String 即可

10.when 可以替换 if else 和 switch case

11.如果 函数体 返回,且只有 一句话,那么 可以用 fun xxx = xxxx 省略 {} 用 = 连接
同样 var x = 后面可以接{}的

12.kotlin中 有 重载运算符的概念,范围的运算符 in(java 里面 btween and), x in 2…5 代表 x 在 2到5的范围中

13.kotlin 的 stream流的使用 和 java 有点不一样

14.kotlin中,一个类可以有一个 primary构造方法 和 多个 secondary构造方法,实际就和 java的多个构造方法一样
kotlin 如果不定义构造方法,默认有一个 主构造方法,无参的,构造体没有代码
主构造方法是类头的一部分,它位于类的后面,
如果primary构造方法没有任何 可见修饰符修饰,或者注解修饰,constructor关键字 可以省略
primary构造方法的 参数,可以在 init里面使用(init就是 primary构造方法的 方法体),以及成员变量 后直接赋值,
对于变量后直接赋值,和java里面的不一样,kotlin中 如果用 primary构造参数 给 成员变量赋值,那么实际 是,在primary构造函数执行中,给其赋值初始值,
换句话说,成员变量 初始化的时候,都是在 primary构造函数中的,所以 成员变量 初始化 可以是任何值,这里用primary的参数,是因为,初始化过程是在 primary里面执行的
也就是在 init里面执行的,

主构造方法中的参数,可以在 init里面用,并给成员变量赋值,也可以直接 赋值在成员变量后,实际就是 编译后,在 init中给 其赋值

初始化 成员变量的 执行顺序 取决于,他们在代码中的顺序,例如 先执行 成员变量 = xxx 后执行 init里面的语句,可以重复赋值的,实际在java中,成员变量直接赋值,也是在 无参构造方法中执行的

成员变量 = xxx;
init{
成员变量 = xxx;
}

java中,是吧 成员变量xxx 和 {} 放在了无参构造中的,简单来说,初始化对象 必须 走 构造方法,不走无参,就是有参

在这里插入图片描述
这种只是 简化写法 这里的 成员变量 也是 赋初始值了的 就是 this.name = name

关于 secondry构造函数,实际 就是 kotlin给 提供的 构造函数 重载,secondary构造函数,必须调用 主构造函数 ,而且 secondary构造函数 是 不适用 上面的简便 写法的,

主构造方法必须有,次构造方法可有可无,如果不写构造函数会有一个默认空的构造函数,
如果写了 次后置函数,那么必须手写 主构造函数

如果 按照那种简便写法,

15.kotlin语言,方法中参数是可以 赋初始值的,java不具备
class Kk(var name:String = “zhangsan”)

而且 如果 主构造方法 所有参数 都有 默认值,那么 JVM 会生成 一个 不带参数的 构造方法,实际 是 为了 给 整合一些 框架使用的,当然 你完全 可以 把 无参构造 和 次级有参 都写出来 但是 很多代码 都是 不写 无参的,还要用到 无参,那么…

这种简便写法 是写的 最多的

15,修饰符的默认性,如果不知道,那么可以 手动加上 但是不一定手动加上 就一定是你加的那个,还是要遵守 kotlin的规范

16,成员变量 必须 赋初始值吗?,java中可以不赋初始值,都是如果有 无参构造的话,会在无参构造 中 赋默认初始值的

17.所有类 在kotlin中 都是 final的 open关键字 可以解除 类 和 方法的 final 让其可以继承 和 重写 重写必须加上 override关键字

kotlin 是可以没有 主构造函数,只有 次级构造函数的,如果有主构造,也有次级构造,那么次级构造 必须 调 主构造
也就是说,第一 类是一定有构造函数的,但是主构造(最多一个) 次级构造(随便),但是只有 一个类 有主构造 和 次级构造的 同时,次级构造 一定要想办法 调用一次 主构造,
主构造 和 次级构造 都是构造方法,都是构造方法的作用,不是无参有参的区别java 但是 都有的时候 次一定要调到 主

在继承的情况下,也是 子类 一定要 调 父类的构造函数 (这里就是,调 主 和 次都行) ,同时也要遵守,自己本类 次级构造 调 主构造的情况

所以就出现了一种,子类有主构造的情况下,必须主构造 去 super()父类,因为如果 次级构造 (前提有次级的情况下) 去 super父类,那么 主构造 就 没有被 次级构造调用到了

kotlin 继承中的 构造,子类 主构造,去调用父类 主构造方法,

在 kotlin 中 如果 一个类 没有 显示 primary构造方法,并且这个类 继承 父类,那么 这个类 必须初始化父类,只有定义次级构造方法,并显示 super调用 父类的 构造方法

kotlin 不管是 重写 父类 属性 还是 方法,都要加上 overide关键字

在 kotlin 中 var 和 val 都可能是 final的 虽然编译成 java var不是,val是 final的,但是在 kotlin中 例如 var a = xxx B类重写这个 a 会报错 a 是 final的 不能重写,只能 open var a = xxx

在 kotlin中 没有 static关键字 但是 有 final关键字的,和 java的一样的,有一种情况会用到
就是 继承 重写的方法的时候,新重写的方法 是 不用再 加 open的,是可以被重写的,例如
open A (){ open name{} } B可以重写 name的,B中的 name 不用加 open 已经是 open的了 (前提是 B类是 open的),此时如果想要 不让 B中的 name 被重写,可以为其加上 final

可以在 primary构造方法中 声明重写
class A(override val name:String) : B(name){}

var 可以 重写 val
val 不可以重写 var
原因是 var = 提供了 get set方法
val = 提供了 get方法

函数返回 赋值的 简便写法 ?? 重要

18.kotlin也是 单继承 多实现,如果 上级 类 出现了 重复的方法,kotlin可以通过 super<指明类名> 去确切的调用

19.接口的 类 和 方法 都不用加 open 也不能定义成 final,因为 接口本来是就来给其实现的,kotlin 默认是 open的

20.kotlin抽象方法,如果继承 一个普通类,可以将普通类的方法,重写成 抽象方法
例如 A fun f{()xxx} 抽象类B:A override abstruct fun f()

21.对象声明,很多语言都有,js 就没有类,只有对象,声明对象,直接使用对象,
例如:kotlin
object Axxxx Object 替换掉 class即可

半生对象:什么是伴生对象,就是 kotlin 因为没有 static ,没法定义静态变量 方法,采取伴生对象这种手段

当然 kotlin非常推荐 在 包级别 定义 变量 和 方法,会生成新的类,里面 有 静态 final 方法,和 static final 变量

Class A{
companion object {
		val devices = HashMap<Int/* position */, Device>()
	}
}

fun main(){
	A.devices
	A.Companion.devices
}

如果不提供 伴生对象的名字,那么 默认是 Companion , 本质上Companion是 A 的 内部类,
A.devices 和 A.Companion.devices 都是 调用的实例方法,只是是 A的内部类对象实例的 里面的
属性和方法,

这不算真正的,静态方法 和 静态变量,如果真想达到 java的效果,那么
Class A{
companion object {
		@JVMSTATIC
		val devices = HashMap<Int/* position */, Device>()
	}
}

这样编译后,devices就是 static final devices 并且是在 A下面的,调用时依旧是,
A.devices

观察发现,写法都是 A.devices 所以 我们 也不用加 @Jvmstatic ,只是底层走的代码不一样,一个是
真正的静态方法,一个是类的内部类实例对象的 实例方法

还有 一个类中 只能有一个 伴生对象Companion Object 目的是 避免多个 伴生对象 出现 同名方法,
A.同名方法  引发奇异

现在有的问题:
1.对象 初始值 到底 一定要 赋值吗? 赋值手段可以有哪些
2.get set
3. val a {} val a = {} 简化写法等,,,

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

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

相关文章

JVM调优方式

对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数。 1.Full GC 会对整个堆进行整理&#xff0c;包括Young、Tenured和Perm。Full GC因为需要对整个堆进行回收&#xff0c;所以比较慢&#xff0c;因此应该尽可能减少Full GC的次数。 2.导致Full GC的原因 1)年老…

消息中间件

为什么要使用消息中间件同步通信&#xff1a;耗时长&#xff0c;受网络波动影响&#xff0c;不能保证高成功率&#xff0c;耦合性高。1.同步方式&#xff08;耗时长&#xff09;&#xff1a;同步方式的问题&#xff1a;当一个用户提交订单到成功需要300ms300ms300ms20ms 920ms…

民锋国际期货:2023,既艰难又充满希望,既纷乱又有无数机会。

不管是官方还是民间&#xff0c;各种信号都表明&#xff0c;2023年是一个拼经济的年份。 通货膨胀带来的需求量的增加&#xff0c;与中国经济高速发展带来的供给量增加&#xff0c;二者共同构成了我们的物价。 做一个长期主义者&#xff0c;做一个坚定看好中国未来的人&#…

SpringBoot(powernode)(内含教学视频+源代码)

SpringBoot&#xff08;powernode&#xff09;&#xff08;内含教学视频源代码&#xff09; 教学视频源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87484637 目录SpringBoot&#xff08;powernode&#xff09;&#xff08;内含教学视频…

AcWing3490.小平方——学习笔记

目录 题目 代码 AC结果 思路 题目 3490. 小平方 - AcWing题库https://www.acwing.com/problem/content/3493/ 代码 import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input new Scanner(System.in);int target input.nextI…

Python 自动化测试必会技能板块—unittest框架

说到 Python 的单元测试框架&#xff0c;想必接触过 Python 的朋友脑袋里第一个想到的就是 unittest。的确&#xff0c;作为 Python 的标准库&#xff0c;它很优秀&#xff0c;并被广泛应用于各个项目。但其实在 Python 众多项目中&#xff0c;主流的单元测试框架远不止这一个。…

谷歌seo关键词怎么做?Google如何优化关键词

本文主要分享谷歌seo关键词怎么去操盘才能更好的提升排名&#xff0c;我们立刻来学习一下。 本文由光算创作&#xff0c;有可能会被剽窃和修改&#xff0c;我们佛系对待这种行为吧。 谷歌seo关键词如何优化&#xff1f;这里我们提供一个谷歌seo优化的公式 答案是&#xff1a…

Vue基础15之消息订阅与发布、TodoList消息订阅与发布、TodoList编辑功能

Vue基础15消息订阅与发布安装pubsub-js库使用main.jsSchool.vueStudent.vue总结&#xff1a;消息订阅与发布&#xff08;pubsub&#xff09;TodoList-消息的订阅与发布将Item的deleteTodo使用消息订阅与发布App.vueMyItem.vueMyList.vueTodoList-编辑App.vueMyItem.vue完善编辑…

【极海APM32替代笔记】HAL库ADC测量精度提高方案(利用内部参考电压VREFINT计算VDDA来提高精度)

【极海APM32替代笔记】HAL库ADC测量精度提高方案&#xff08;利用内部参考电压VREFINT计算VDDA来提高精度&#xff09; 多数STM32的MCU 都没有内部基准电压 如L496系列 但在外接VDDA时&#xff08;一般与VCC 3.3V连接&#xff09; 有可能VCC不稳定 导致参考电压不确定 从而使A…

【并发编程十八】线程局部存储(TLS)

【并发编程十八】线程局部存储(TLS&#xff09;一、定义二、线程局部存储的实现1、windows系统2、linux系统3、c11三、windows系统1、线程局部存储是分块的&#xff08;TLS_MINIMUM_AVAILABLE&#xff09;2、获得索引3、通过索引&#xff1a;存储数据、取出数据4、释放索引和内…

《计算机网络:自顶向下方法》实验1:协议分析软件的使用

实验1:协议分析软件的使用 实验步骤 启动主机上的web浏览器。 启动Ethereal(或WireShark)。你会看到如图2所示的窗口,只是窗口中没有任何分组列表。 开始分组捕获:选择“capture”下拉菜单中的“Start”命令,会出现如图所示的“Ethereal(或WireShark): Capture Options”…

(02)Cartographer源码无死角解析-(56) 2D后端优化→class MapById、MapById::lower_bound

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…

Flink04: Flink核心API之DataSet

DataSet API主要可以分为3块来分析&#xff1a;DataSource、Transformation、Sink。 DataSource是程序的数据源输入。Transformation是具体的操作&#xff0c;它对一个或多个输入数据源进行计算处理&#xff0c;例如map、flatMap、filter等操作。DataSink是程序的输出&#xf…

攻击者查看邮件就被溯源到家?

本文通过分享实际攻防演练中真实案例&#xff0c;防守方在未暴露任何敏感信息的情况下&#xff0c;仅通过邮件往来最终溯源到攻击方相关真实信息。 作为攻击溯源技术的引子&#xff0c;供各位从业和爱好者交流学习。 场景描述 攻击者伪造邮件&#xff0c;称其申请防守方靶标系…

洛谷P5736 【深基7.例2】质数筛 C语言/C++

【深基7.例2】质数筛 题目描述 输入 nnn 个不大于 10510^5105 的正整数。要求全部储存在数组中&#xff0c;去除掉不是质数的数字&#xff0c;依次输出剩余的质数。 输入格式 第一行输入一个正整数 nnn&#xff0c;表示整数个数。 第二行输入 nnn 个正整数 aia_iai​&…

基于 esp-idf SDK ,如何在 .cpp 工程中加入.c 的文件调用?

把外部 .c 文件放到 .cpp 工程下的 main 文件夹然后在 .cpp 工程下声明 .c 文件下的 hello_main 函数同时在 cpp 工程的 CmakeLists.txt 文件下加上 .c 文件最后在 .cpp 工程下调用 hello_main 函数即可 可基于 esp-idf/examples/storage/nvs_rw_value_cxx 例程来测试 &#x…

mysql 8.0.32安装 windows server 超详细

官网下载mysql包&#xff0c;官网地址(中文版)&#xff1a; http://mysql.p2hp.com/cloud/index.html 我是下载的这个(第一个) 内容解压后是这样的&#xff0c;其实windows版本无需安装&#xff0c;只需要配置后启动即可 同时&#xff0c;建议下载下这个Visual Studio&#xf…

Nebula测试

LDBC benchmark 这是官方文档 https://ldbcouncil.org/ldbc_snb_docs/ldbc-snb-specification.pdf 主要有几点 Scale Factors 是生成数据的一个大小&#xff0c;For both workloads, the SF1 data set is 1 GiB, the SF100 is 100 GiB, and the SF10 000 data set is 10 000 G…

关于CSS的简单知识

CSS是什么首先&#xff0c;在之前的html仅仅是写了一个框架&#xff0c;页面并不工整&#xff0c;美观。而CSS正是解决了这一问题。HTML仅仅只是表示页面的结构和内容&#xff0c;而CSS描述的是页面的样式&#xff08;包括大小/位置/字体/颜色/背景等&#xff09;基本语言规范选…

[element plus] 对话框组件再封装使用 - vue

学习关键语句: 饿了么组件dialog组件使用 dialog组件二次封装 vue3中封住的组件使用update触发更新 vue3中封装组件使用v-model:属性值来传值 写在前面 这是我遇到的一个页面需求 , 其中一个对话框的内容是很常用的 , 所以我将它封装出来才写的一篇文章 现在给出如下需求: 封…