Kotlin学习笔记1

数组

/*** 何时使用数组*/
fun useDemo() {// Kotlin 中最常见的数组类型是对象类型数组,由 Array 类表示。// 如果在对象类型数组中使用原生类型,那么会对性能产生影响,因为原生值都装箱成了对象。 为了避免装箱开销,请改用原生类型数组。var strArray = arrayOf("At", "Brod", "Cak")// 使用 += 赋值操作创建了一个新的 riversArray,复制了原始元素并添加新元素strArray += "Dart"println(strArray.joinToString("-"))
}/*** 创建数组* arrayOf()  arrayOfNulls()  emptyArray() and Array constructor.*/
fun arrayDemo() {val arr1 = arrayOf(1, 2, 3, 4, 5, 6)println(arr1.joinToString())val nullArray: Array<Int?> = arrayOfNulls(3)println(nullArray.joinToString())var exampleArray = emptyArray<String>()var exampleArray2: Array<String> = emptyArray()
}fun arrayDemo2() {// Creates a two-dimensional arrayval twoDArray = Array(2) { Array<Int>(2) { 0 } }println(twoDArray.contentDeepToString())// [[0, 0], [0, 0]]// Creates a three-dimensional arrayval threeDArray = Array(3) { Array(3) { Array<Int>(3) { 0 } } }println(threeDArray.contentDeepToString())
}/*** 访问与修改元素*/
fun operatorDemo() {val intArray = arrayOf(1, 2, 3)intArray[0] = 10println(intArray.joinToString())
}fun printAllStrings(vararg strings: String) {for (string in strings) {print(string)}
}fun varargDemo() {val lettersArray = arrayOf("c", "d")printAllStrings("a", "b", *lettersArray)println()
}/*** 将数组转换为集合*/fun toListDemo() {val simpleArray = arrayOf("a", "b", "c", "c")println(simpleArray.toSet())println(simpleArray.toList())val pairArray = arrayOf("apple" to 120, "banana" to 150, "cherry" to 90, "apple" to 140)println(pairArray.joinToString())println(pairArray.toMap())}/*** BooleanArray	boolean[]* ByteArray	byte[]* CharArray	char[]* DoubleArray	double[]* FloatArray	float[]* IntArray	    int[]* LongArray	long[]* ShortArray	short[]*/
fun arrayDemo3() {val exampleArray = IntArray(5)println(exampleArray.joinToString())
}fun main() {
//    useDemo()
//    arrayDemo()arrayDemo2()operatorDemo()varargDemo()toListDemo()
}

类型检测和类型转换

package com.mcc.myapplicationfun getNum(): Number {return 100F
}/*** is 与 !is 操作符*/
fun isDemo() {val obj = "hello"if (obj is String) {println("string length:${obj.length}")}val value = 1if (value is Int) {println("$value is Int")}val num = getNum()if (num !is Int) {println("$num not is Int")}
}/***  智能转换*/
fun transferDemo(x: Any) {if (x is String) {println("this param is string, and length:${x.length}") // x 自动转换为字符串}
}fun transferDemo2(x: Any) {if (x !is String) return// 如果反向检测导致返回那么该转换是安全的println("this param is string, and length:${x.length}")
}fun transferDemo3(x: Any) {// `||` 右侧的 x 自动转换为 Stringif (x !is String || x.length == 0) return// `&&` 右侧的 x 自动转换为 Stringif (x is String && x.length > 0) {println("this param is string, and length:${x.length}")}
}fun transferDemo4(x: Any) {when (x) {is Int -> print(x + 1)is String -> print(x.length + 1)is IntArray -> print(x.sum())}
}fun transferDemo5(x: Any) {// “不安全的”转换操作符val y: String? = x as String?if (y != null) {println("this param is string, and length:${x.length}")}
}fun transferDemo6(x: Any) {// “安全的”(可空)转换操作符val y: String? = x as? Stringif (y != null) {println("this param is string, and length:${x.length}")}
}fun main() {isDemo()transferDemo("world")transferDemo2("gogogo")transferDemo3("pythonX")transferDemo4(intArrayOf(1, 2, 3, 4, 5))transferDemo4(arrayOf(1, 2, 3, 4, 5, 6))
//    transferDemo5(111)transferDemo6(111)
}

If 表达式


fun main() {val a = 2val b = 3var max: Int? = nullif (a > b) {max = a} else {max = b}// 作为表达式max = if (a > b) a else bprintln("max is $max")val c = 10val maxOrLimit = if (c > a) c else if (a > b) a else bprintln("maxOrLimit is $maxOrLimit")// if 表达式的分支可以是代码块,这种情况最后的表达式作为该块的值val max2 = if (a > b) {print("Choose a,")a} else {print("Choose b,")b}println("max2 is $max2")
}

When 表达式

fun whenDemo1(x: Int) {when (x) {1 -> print("x == 1")2 -> print("x == 2")else -> {print("x=$x is neither 1 nor 2")}}println()
}enum class Bit {ZERO, ONE, TWO
}fun getRandomBit(): Bit {return Bit.ZERO
}fun whenDemo2() {val numericValue = when (getRandomBit()) {Bit.ZERO -> 0Bit.ONE -> 1Bit.TWO -> 2// 'else' is not required because all cases are covered}println(numericValue)
}fun whenDemo3(x: Int, s: String) {when (x) {0, 1 -> print("x == 0 or x == 1")else -> print("otherwise")}when (x) {s.toInt() -> print("s encodes x")else -> print("s does not encode x")}val validNumbers = listOf(3, 4, 5)when (x) {in 1..10 -> print("x is in the range")in validNumbers -> print("x is valid")!in 10..20 -> print("x is outside the range")else -> print("none of the above")}
}fun main() {whenDemo1(3)whenDemo2()
}

For 循环

fun main() {// for 循环可以对任何提供迭代器(iterator)的对象进行遍历val ints = listOf(2, 3, 4, 5, 6)for (item: Int in ints) {print(item)}println()for (i in 1..3) {print(i)}println()for (i in 6 downTo 0 step 2) {print(i)}println()val array = arrayOf("a", "b", "c")for (i in array.indices) {print(array[i])}println()for ((index, value) in array.withIndex()) {println("the element at $index is $value")}
}

while 循环

while (x > 0) {x--
}do {val y = retrieveData()
} while (y != null) // y 在此处可见

返回与跳转


/*** 在 Kotlin 中任何表达式都可以用标签来标记。 标签的格式为标识符后跟 @ 符号*/
fun demo1() {loop@ for (i in 1..100) {for (j in 1..100) {if (j > 1) break@loopprintln(j)}}
}/*** 返回到标签*/
fun demo2() {listOf(1, 2, 3, 4, 5).forEach {if (it == 3) return // 非局部直接返回到 demo2() 的调用者print(it)}println("this point is unreachable")
}fun demo3() {listOf(1, 2, 3, 4, 5).forEach lit@{if (it == 3) return@lit // 局部返回到该 lambda 表达式的调用者——forEach 循环print(it)}print(" done with explicit label")
}fun demo4() {listOf(1, 2, 3, 4, 5).forEach {if (it == 3) return@forEach // 局部返回到该 lambda 表达式的调用者——forEach 循环print(it)}print(" done with implicit label")
}fun demo5() {listOf(1, 2, 3, 4, 5).forEach(fun(value: Int) {if (value == 3) return  // 局部返回到匿名函数的调用者——forEach 循环print(value)})print(" done with anonymous function")
}fun main() {demo5()
}

异常

/*** try {*     // 一些代码* } catch (e: SomeException) {*     // 处理程序* } finally {*     // 可选的 finally 块* }*/fun fail(message: String): Nothing {throw IllegalArgumentException(message)
}fun main(){val input = "2"val a: Int? = try { input.toInt() } catch (e: NumberFormatException) { null }
}

包与导入

package com.mcc.myapplicationfun printMessage() { /*……*/
}class Message { /*……*/ }/*** 源文件所有内容(无论是类还是函数)都包含在该包内。* 所以上例中 printMessage() 的全名是 org.example.printMessage,* 而 Message 的全名是 org.example.Message*//*** 默认导入* 有多个包会默认导入到每个 Kotlin 文件中:* kotlin.** kotlin.annotation.** kotlin.collections.** kotlin.comparisons.** kotlin.io.** kotlin.ranges.** kotlin.sequences.** kotlin.text.*** JVM:* java.lang.** kotlin.jvm.*** 如果出现名字冲突,可以使用 as 关键字在本地重命名冲突项来消歧义:* import org.example.Message // Message 可访问* import org.test.Message as TestMessage // TestMessage 代表“org.test.Message”** 关键字 import 并不仅限于导入类;也可用它来导入其他声明:* 顶层函数及属性* 在对象声明中声明的函数和属性* 枚举常量*/fun main() {}

类与构造函数

package com.mcc.myapplicationimport javax.inject.Injectclass Person { /*……*/ }class Emptyclass Student constructor(firstName: String) { /*……*/ }
// 如果主构造函数没有任何注解或者可见性修饰符,可以省略这个 constructor 关键字
// class Student(firstName: String) { /*……*/ }class Customer public @Inject constructor(name: String) { /*……*/ }
// 如果构造函数有注解或可见性修饰符,这个 constructor 关键字是必需的class InitOrderDemo(name: String) {val firstProperty = "First property: $name".also(::println)init {println("First initializer block that prints $name")}val secondProperty = "Second property: ${name.length}".also(::println)init {println("Second initializer block that prints ${name.length}")}
}class Person2(val firstName: String, val lastName: String, var age: Int)class Person3(val firstName: String, val lastName: String, var isEmployed: Boolean = true)// 次构造函数
class Person4(val pets: MutableList<Pet> = mutableListOf())class Pet {constructor(owner: Person4) {owner.pets.add(this) // adds this pet to the list of its owner's pets}
}class Person5(val name: String) {val children: MutableList<Person5> = mutableListOf()// 如果类有一个主构造函数,每个次构造函数需要委托给主构造函数,// 可以直接委托或者通过别的次构造函数间接委托// 委托到同一个类的另一个构造函数用 this 关键字即可constructor(name: String, parent: Person5) : this(name) {parent.children.add(this)}
}class Constructors {init {println("Init block")}constructor(i: Int) {println("Constructor i=$i")}constructor(i: Int, ss: String) : this(i) {println("Constructor ss=$ss")}}// 如果一个非抽象类没有声明任何(主或次)构造函数,它会有一个生成的不带参数的主构造函数。构造函数的可见性是 public。
class DoCreateMe private constructor() { /*……*/ }// 如果你不希望你的类有一个公有构造函数,那么声明一个带有非默认可见性的空的主构造函数
class DonotCreateMe private constructor() { /*……*/ }// 如果主构造函数的所有的参数都有默认值,编译器会生成一个额外的无参构造函数
class Customer2(val name: String = "", val age: Int = 18)fun main() {val p = Person()val e = Empty()val s = Student("SnZ")InitOrderDemo("YourName")Person2("morning", "cat", 30)Person3("morning", "cat")val p4 = Person4()Pet(p4)Pet(p4)p4.pets.toList().joinToString().also(::println)val p5 = Person5("ZhangSan")Person5("ZhangXiao", p5)Constructors(33, "mcc")Customer2()
}

抽象类

// 类以及其中的某些或全部成员可以声明为 abstract
abstract class Polygon {abstract fun draw()
}class Rectangle : Polygon() {override fun draw() {// draw the rectangle}
}// 可以用一个抽象成员覆盖一个非抽象的开放成员
open class Polygon2 {open fun draw() {// some default polygon drawing method}
}abstract class WildShape : Polygon2() {// Classes that inherit WildShape need to provide their own// draw method instead of using the default on Polygonabstract override fun draw()
}

类的继承

package com.mcc.myapplication// 在 Kotlin 中所有类都有一个共同的超类 Any,对于没有超类型声明的类它是默认超类
class Example : Any() // 从 Any 隐式继承// 默认情况下,Kotlin 类是最终(final)的——它们不能被继承。 要使一个类可继承,请用 open 关键字
open class Base(p: Int) // 该类开放继承class Derived(p: Int) : Base(p)// 如果派生类没有主构造函数,那么每个次构造函数必须使用super 关键字初始化其基类型
class MyClass : Base {constructor(ctx: Int) : super(ctx)constructor(ctx: Int, name: String) : super(ctx)
}// Kotlin 对于可覆盖的成员以及覆盖后的成员需要显式修饰符
open class Shape {open val vertexCount: Int = 0open fun draw() { /*……*/}// 如果函数没有标注 open 如 Shape.fill(),那么子类中不允许定义相同签名的函数fun fill() { /*……*/}
}class Circle() : Shape() {override fun draw() { /*……*/}
}// 将 open 修饰符添加到 final 类(即没有 open 的类) 的成员上不起作用// 标记为 override 的成员本身是开放的,因此可以在子类中覆盖。如果你想禁止再次覆盖, 使用 final 关键字
open class Rectangle() : Shape() {// 属性与方法的覆盖机制相同。在超类中声明然后在派生类中重新声明的属性必须以 override 开头,并且它们必须具有兼容的类型。override val vertexCount = 4final override fun draw() { /*……*/}
}interface Shape2 {val vertexCount: Int
}class Rectangle2(override val vertexCount: Int = 4) : Shape2 // 总是有 4 个顶点class Polygon2 : Shape2 {override var vertexCount: Int = 0  // 以后可以设置为任何数
}// 派生类初始化顺序// 调用超类实现// 覆盖规则fun main() {}

类的属性


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

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

相关文章

Llama2-Chinese-7b-Chat安装部署

文章目录 前言一、文件介绍 &#x1f4c1;二、环境配置 ♟三、Llama2-Chinese-7b-Chat下载 ⏬总结 前言 本文主要介绍如何使用Llama2-Chinese-7b-Chat&#xff0c;最后的效果如图所示&#xff1a; 一、文件介绍 &#x1f4c1; ⬇️ 下载地址&#xff1a;https://pan.baidu.…

如何实现nacos的配置的热更新

我们在使用nacos进行修改配置后&#xff0c;需要微服务无需重启即可让配置生效&#xff0c;也就是使配置进行热更新我们可以采用下面的两种方式进行配置的热更新操作 方式一&#xff1a;在Value所注入的变量的类上添加注解RefreshScope RestController RequestMapping("/o…

Linux基本操作指令

哈喽小伙伴们&#xff0c;从这篇文章开始&#xff0c;在学习数据结构的同时&#xff0c;我们开启一个新的篇章——Linux操作系统的学习&#xff0c;这将会是又一个新的开始&#xff0c;希望小伙伴们能够认真细心&#xff0c;不要掉队哦。 目录 一.什么是Linux 二.为什么要学习…

git 相关操作说明

1.先下载git相关软件 下载地址&#xff1a; https://git-scm.com/download/win下载其中一个安装 2.打开gitee网站&#xff0c;注册账号 3.打开个人中心&#xff0c;选择ssh公钥&#xff0c;查看如何生成公钥 4.生成公钥后&#xff0c;添加相应的公钥 具体仓库操作 1.第一…

【Android】完美解决Cannot resolve method ‘subscribe(Observer<T>)‘

问题截图&#xff1a; 解决方法&#xff1a; 如上图&#xff0c;看我标123的三个地方&#xff0c;2标注的地方提示我们我方法实际返回的值是Observer<Res_GetCellCode>,而我想要返回的结果是&#xff1a;3标记的结果&#xff1a;Observer<Res_QueryCTInfo>&#xf…

Vue mixins详解

文章目录 前言Vue中的mixins详解什么是mixins简单例子mixins的特点mixins与vuex的区别mixins与公共组件的区别前言 在Vue中,mixins是一种可重用的代码片段,可以在多个组件中共享。它可以包含组件的选项,如data、methods、computed等,以及生命周期钩子函数。 本文将详细介…

git拉取代码冲突处理

参考文章&#xff1a;https://www.jianshu.com/p/b74ee1f4135f 问题&#xff1a; 因为git commit前没有git pull同步远程分支的代码&#xff0c;所以push会发生错误 解决办法&#xff1a; 1、可以使用git reset --hard HEAD^来回退到上一次commit的状态。此命令可以用来回退到…

智能优化算法应用:基于引力搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于引力搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于引力搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.引力搜索算法4.实验参数设定5.算法结果6.…

《C++新经典设计模式》之第4章 策略模式

《C新经典设计模式》之第4章 策略模式 策略模式.cpp 策略模式.cpp #include <iostream> #include <memory> using namespace std;// if或switch分支不稳定&#xff0c;经常改动时&#xff0c;考虑引入算法独立到策略类中去实现// 依赖倒置原则 // 高层组件不应该依…

AI日报:苹果为使用Mac的人工智能开发者推出开源工具

文章目录 总览主要介绍开发理念开发细节MLX功能用途 MLX可以用于商业软件吗&#xff1f; 总览 苹果正在为开发人员提供新的工具&#xff0c;用于在其硬件上训练和运行大型语言模型。 主要介绍 开发理念 苹果公司通过发布一系列新的开源人工智能工具&#xff0c;向开源人工智能…

关于“Python”的核心知识点整理大全17

目录 ​编辑 8.3.4 结合使用函数和 while 循环 greeter.py 8.4 传递列表 greet_users.py 8.4.1 在函数中修改列表 printing_models.py 8.4.2 禁止函数修改列表 要将列表的副本传递给函数&#xff0c;可以像下面这样做&#xff1a; 往期快速传送门&#x1f446;&#x…

扫盲运动—字节序

1 大端、小端字节序 术语“大端”和“小端”表示多个字节值的哪一端&#xff08;小端或大端&#xff09;存储在该值的起始地址。 大端&#xff1a;将高序字节存储在起始地址&#xff0c;这称为大端&#xff08;big-endian&#xff09;字节序小端&#xff1a;将低序字节存储在…

GC6609,GC6610超静音的两相步进电机驱动芯片的性能分析

两相步进电机驱动芯片GC6609&#xff0c;GC6610它们是一款超静音的两相步进电机驱动芯片&#xff0c;内置最大 256 细分的步进驱动模式&#xff0c; 超静音&#xff0c;低振动。芯片可以工作在 4~36V 的宽工作电压范围内&#xff0c;平均工作电流可以达到 2A和2.5A &#xff0c…

08 计算相机运动

文章目录 08 计算相机运动8.1 提取特征点8.2 对极几何8.2.1 几个矩阵8.2.2 相机坐标系与归一化坐标系8.2.3 三角测量 8.3 PnP: 3D-2D8.4 ICP&#xff1a;3D-3D8.5 总结 08 计算相机运动 8.1 提取特征点 读取图像 --> 提取角点 --> 计算各角点的描述子 --> 匹配描述子…

RHEL防火墙配置

目录 1.了解firewalld 2.firewalld的基本配置 3.配置firewalld的规则 4.icmp-blocks 5.Services 6.ports 1.了解firewalld 在RHEL8中用的防火墙是firewalld&#xff0c;在 firewalld中又涉及zone的概念。首先来了解一下什么是zone 如在进地铁或高铁时需要安检&#xf…

JavaEE07 定时器的使用和模拟实现

前言 前面我们聊了很多关于阻塞队列,单例模式等的应用,今天我们就来聊聊定时器的功能和模拟实现,其实定时器的实现在我们的日常生活中也很常见,比如说平常创建一些定时任务,定时开关机,定时去发表一篇qq空间等等,今天我们就来简单实现一个定时器. 1.JVM提供的定时器的使用 在自…

现代雷达车载应用——第2章 汽车雷达系统原理 2.3节

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.3 信号模型 雷达的发射机通常发出精心设计和定义明确的信号。然而&#xff0c;接收到的返回信号是多个分量的叠加&#xff0c;包括目标的反射、杂波…

usr/bin/env: ‘bash\r‘: No such file or directory

执行docker报错 这种错误是由于windows下执行linux的shell文件&#xff0c;格式不对导致 去ubuntu下安装dos2unix sudo apt-get install dos2unix 切换到对应的目录下&#xff0c;对shell文件进行格式化 dos2unix xxx.sh

数字化转型对企业有什么好处?

引言 数字化转型已经成为当今商业领域中的一股强大力量&#xff0c;它不仅仅是简单的技术更新&#xff0c;更是企业发展的重要战略转变。随着科技的迅猛发展和全球化竞争的加剧&#xff0c;企业们正在积极探索如何将数字化的力量融入到他们的运营和战略中。 数字化转型不仅是传…

9:00面试,9:05就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到12月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40…