Kotlin基本的语法学习

news2025/1/21 15:31:35

1.变量

在Kotlin中定义变量的方式和Java区别很大,在Java中如果想要定义一个变量,需要在变量前面声明这个变量的类型,比如说int a表示a是一个整型变量,String b表示b是一个字符串变量。而Kotlin中定义一个变量,只允许在变量前声明两种关键字:val和var。

val(value的简写)用来声明一个不可变的变量,这种变量在初始赋值之后就再也不能重新赋值,对应Java中的final变量。

var(variable的简写)用来声明一个可变的变量,这种变量在初始赋值之后仍然可以再被重新赋值,对应Java中的非final变量。

fun main() {
    val a = 10
    var b = "hello"
    b = "Kotlin"
    println("a---$a")
    println("b---$b")
}

注意:Kotlin每一行代码的结尾是不用加分号的,如果你写惯了Java的话,在这里得先熟悉一下。

在上述代码中,我们使用val关键字定义了一个变量a,并将它赋值为10,这里a就会被自动推导成整型变量。因为既然你要把一个整数赋值给a,那么a就只能是整型变量,而如果你要把一个字符串赋值给a的话,那么a就会被自动推导成字符串变量,这就是Kotlin的类型推导机制。

2:函数

函数和方法就是同一个概念,这两种叫法都是从英文翻译过来的,函数翻译自function,方法翻
译自method,它们并没有什么区别,只是不同语言的叫法习惯不一样而已。

fun getName(param1: String,param2: String):String{
    return param1
}

首先fun(function的简写)是定义函数的关键字,无论你定义什么函数,都一定要使用fun来声明。

3.条件语句 if 和 when

3.1 if条件语句

Kotlin中的if语句和Java中的if语句几乎没有任何区别,因此这里我就简单举个例子带你快速了解一下。

fun getNumber(num1: Int, num2: Int): Int {
    var value = 0                         
    if (num1 > num2) {                    
        value = num1                      
    } else {                              
        value = num2                      
    }                                     
    return value                          
}  

可以简化一下,如下

fun getNumber(num1: Int, num2: Int): Int {
    return if (num1 > num2) {
        num1
    } else {
        num2
    }
}

3.2 when条件语句

Kotlin中的when语句有点类似于Java中的switch语句,但它又远比switch语句强大得多。它可以Java替代if和switch。

示例:查询考试成绩的功能,输入一个学生的姓名,返回该学生考试的分数。

fun getScore(name: String) = when (name) {
    "Tom" -> 80
    "Jim" -> 70
    else -> 0
}

when语句允许传入一个任意类型的参数,然后可以在when的结构体中定义一系列的条件,格式
是:

匹配值-> {执行逻辑}

当你的执行逻辑只有一行代码时,{ }可以省略。

除了精确匹配之外,when语句还允许进行类型匹配。

fun checkNumber(num: Number) {
    when (num) {
        is Int -> println(" number is Int")
        is Double -> println(" number is Double")
        else -> println(" number not support")
    }
}

上述代码中,is关键字就是类型匹配的核心,它相当于Java中的instanceof关键字。
Number是Kotlin内置的一个抽象类,像Int、Long、Float、Double等与数字相关的类都是它的子类,所以这里就可以使用类型匹配来判断

4.循环语句

Java中主要有两种循环语句:while循环和for循环。而Kotlin也提供了while循环和for循环,其中while循环不管是在语法还是使用技巧上都和Java中的while循环没有任何区别,因此我们就直接跳过不进行讲解了。

Kotlin在for循环方面做了很大幅度的修改,Java中最常用的for-i循环在Kotlin中直接被舍弃了,而Java中另一种for-each循环则被Kotlin进行了大幅度的加强,变成了for-in循环,所以我们只需要学习for-in循环的用法就可以了。

Kotlin中for循环用法如下示例:

fun main() {

    for (i in 1 .. 10){ //闭区间 包含首尾数字 相当于[1,10]  1 2 3 4 5 6 7 8 9 10
        println("i=$i")
    }

    for (x in 1 until 10) { //前闭后开区间 包含首位但不包含最后一位 相当于[1,10) 1 2 3 4 5 6 7 8 9
        println("x=$x")
    }

    for (y in 1 .. 10 step 2){//在闭区间内按给定步长(step)输出数据 1 3 5 7 9
        println("y=$y")
    }
    
    for (a in 10 downTo 1) { //使用标准库中定义的downTo()函数倒序输出数据10 9 8 7 6 5 4 3 2 1 
        println("a=$a")
    }
}

until关键字要求的是区间升序,也就是左边必须小于右边,如果想创建降序区间,可以使用downTo关键字:

操作数组的用法:

fun main() {
    val array = arrayOf("a", "b", "c")

    for ((index,e) in array.withIndex()) {
        println("下标:$index->元素:$e")
    }
    for (index in array.indices) println("下标:" + index)

    for (Str in array) println("元素有:$Str")
}

5.相等语句 ==

Kotlin中判断字符串或对象是否相等可以直接使用 == 关键字,而不用像Java那样调用equals()方法。
==语句一般用在带参数when语句无法实现的时候
示例:假设所有名字以Jack开头的人,他的分数都是86分,这种场景如果用带参数的when语句来写就无法实现,而使用不带参数的when语句就可以这样写:

fun getScore(name: String) = when {
    name.startsWith("Jack") -> 90
    name == "Tom" -> 80
    name == "Jim" -> 70
    else -> 0
}

6.实例化一个类的方式

Kotlin中实例化一个类的方式和Java是基本类似的,只是去掉了new关键字而已。示例如下StudentBean()

fun main() {
    val bean = StudentBean()
    bean.name = "赵云"
    bean.age = 20
    bean.test()
//  输出结果: 赵云 is eating. He is 20 years old.
}

class StudentBean {
    var age = 0
    var name = ""

    fun test(){
        println("$name is eating. He is $age years old.")
    }
}

7.继承与构造函数

7.1 继承

在Kotlin中想要一个类可以被继承,方法很简单,只要在这个类的前面加上open关键字就可以了,加上open关键字之后,我们就是在主动告诉Kotlin编译器,这个类是专门为继承而设计的,这样类就允许被继承了。

open class StudentBean {
}

继承类的写法在Java中继承的关键字是extends,而在Kotlin中变成了一个冒号,写法如下:

class Person:StudentBean(){
    var sno = ""
    var grade = 0
}

7.2 构造函数

任何一个面向对象的编程语言都会有构造函数的概念,Kotlin中也有,但是Kotlin将构造函数分成了两种:主构造函数和次构造函数。

主构造函数将会是你最常用的构造函数,每个类默认都会有一个不带参数的主构造函数,当然你也可以显式地给它指明参数。主构造函数的特点是没有函数体,直接定义在类名的后面即可。比如下面这种写法:

class Person : StudentBean() {
    
}

StudentBean类后面的一对空括号表示Person类的主构造函数在初始化的时候会调用StudentBean类的无参数构造函数,即使在无参数的情况下,这对括号也不能省略。

任何一个类只能有一个主构造函数,但是可以有多个次构造函数。次构造函数也可以用于实例化一个类,这一点和主构造函数没有什么不同,只不过它是有函数体的。示例如下

class Person(val sno: String, val grade: Int, name: String, age: Int) : StudentBean(name, age) {

    constructor(name: String, age: Int):this("",0,name,age){
    }
    
    constructor() : this("",0) {
    }
}

open class StudentBean(val name: String, val age: Int) {
}

上述代码也是将this关键字换成了super关键字

8.接口

Kotlin中的接口部分和Java几乎是完全一致的。

interface ClickListener {
    fun getName()
}

实现如下

class Test :ClickListener {
    override fun getName() {
        TODO("Not yet implemented")
    }
}

Java中继承使用的关键字是extends,实现接口使用的关键字是implements,而Kotlin中统一使用冒号,中间用逗号进行分隔。

9.Java和Kotlin中函数可见性修饰符之间的区别。

1.jpg

10.数据类

在Kotlin中,当在一个类前面声明了data关键字时,就表明你希望这个类是一个数据类, Kotlin会根据主构造函数中的参数帮你将equals()、 hashCode()、 toString()等固定且无实际逻辑意义的方法自动生成,从而大大减少了开发的工作量。示例如下:

data class Test(var name: String?, var phone: String?){
}

11.单例类

在Kotlin中创建一个单例类的方式极其简单,只需要将class关键字改成object关键字即可。示例如下:

object Test{
}

12.空指针检测

12.1 参数可为空

让一个参数可以为空,只要在后面加上?就可以了,示例如下:

fun test(name: String?) {
}

12.2 判空辅助工具

首先学习最常用的?.操作符。这个操作符的作用非常好理解,就是当对象不为空时正常调用相
应的方法,当对象为空时则什么都不做。比如以下的判空处理代码

if (person!=null){
    person.getName()
}

直接可以简化:

person?.getName()

?.操作符就是将if判断语句去掉了。另外一个非常常用的?:操作符,这个操作符的左右两边都接收一个表达式, 如果左边表达式的结果不为空就返回左边表达式的结果,否则就返回右边表达式的结果。示例如下:

val c = if (a!=null){
    a
}else{
    b
}

可以简化成:

val c = a ?: b

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

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

相关文章

操作系统:用C语言模拟先进先出的算法(FIFO)、最久未使用算法(LRU)、改进的Clock置换算法的命中率。

2.1 实验目的 通过请求页面式存储管理中页面置换算法设计,了解存储技术的特点,掌握请求页式存储管理的页面置换算法。 2.2 实验内容 用程序实现生产者——消费者问题,将指令序列转换为用户虚存中的请求调用页面流。 具体要求: …

以太坊的ecrecover预编译合约

1. 引言 前序博客: ECDSA VS Schnorr signature VS BLS signature ECDSA,全称为Elliptic curve Digital Signature Algorithm,采用Elliptic curve cryptography来实现的数字签名算法。 公私钥对(pk,P)(pk,P)(pk,P),其中公钥Pp…

阿里云-数据仓库-全链路大数据开发治理平台-DataWorks的数字世界

一、前言 上文我讲到 阿里云-数据仓库-数据分析开发神器-ODPS ,今天我带领大家一起走进神器的成长环境及它的数据世界。 二、 DataWorks是什么 DataWorks基于MaxCompute、Hologres、EMR、AnalyticDB、CDP等大数据引擎,为数据仓库、数据湖、湖仓一体等…

大数据-压缩与打包

一、gzip命令 1、选项参数 参数作用-c(compress)将压缩的数据输出到标准输出(stdout)上-d(decompress)解压缩-t(test)可以用来检验一个压缩文件的一致性,看看文件有无错…

艾美捷甘油比色测定试剂盒-简单,敏感,高效

艾美捷甘油比色测定试剂盒,利用双酶联反应系统来检测血清和血浆中的甘油的含量.最后用酶标仪在540nm处测吸光度值即可. 甘油是甘油三酯的骨架,是参与氧化和合成过程的能量代谢的重要中间体。甘油和游离脂肪酸循环水平的测量被认为反映了脂肪分解&#xf…

快应用的优势与劣势对比

2018年,“快应用”标准正式推出。快应用是九大手机厂商基于硬件平台共同推出的新型应用生态。用户无需下载安装,即点即用,享受原生应用的性能体验。 快应用框架深度集成进各厂商手机系统中,可以在操作系统层面实现用户需求与应用…

艾美捷甘油比色测定试剂盒基本参数和相关文献说明

背景: 哺乳动物中,甘油三脂主要储存在脂肪组织中,作为主要的能量储存仓库.当禁食阶段,存储在肝脏和脂肪组织中的甘油三酯被脂肪酶分解形成脂肪酸和甘油. 艾美捷甘油比色测定试剂盒基本参数: 中文名称:甘油…

dpdk中的librte_malloc库

dpdk中的librte_malloc库提供了能够分配任意大小内存的API。 该库的目标是提供类似malloc的函数从hugepage中分配内存,以及帮助应用程序移植。 通常情况下,这种类型的分配不应该在数据平面处理,因为其比基于内存池的分配更慢, …

网站被反诈中心DNS劫持解决教程

如果你的网站部分地区用户访问反馈访问不了,测试域名DNS被劫持到了127.0.0.1 或 0.0.0.0 可能是域名被墙了,或则被反诈中心拦截了,如果遇到该问题,需要检测单单被运营商拦截还是也有被反诈中心拦截。 排查过程: 可以把问题域名通过…

H5 雪碧图 移动的机器猫

精灵图(英语:Sprite),又被称为雪碧图或拼合图。在计算机图形学中,当一张二维图像 集成进场景中,成为整个显示图像的一部分时,这张图就称为精灵图。 本文中用的就是这张,来自爱给网。…

Python:Flask简介与实践

文章目录简介一、简单使用二、调试模式三、路由四、路径变量五、构造URL六、HTTP方法七、静态文件八、模板生成九、日志输出十、处理请求1. Request 对象十一、文件上传十二、Cookies十三、重定向和错误十四、响应处理十五、Sessions十六、模板简介1. 模板标签2. 继承3. 控制流…

超高精度PID控制器的特殊功能(2)——远程操作软件及其安装使用

摘要:远程控制软件是高级PID调节器随机配备的一种计算机软件,可在计算机上远程进行调节器的所有操作,并还具有过程曲线显示和存储功能。本文主要针对VPC 2021系列超高精度PID控制器,介绍了随机配备的控制软件的安装和一些最基本的…

2022-12-21 Buildroot创建自己的软件包,把一个c应用编译到系统里面去运行

一、Buildroot 编译完成后&#xff0c;会在 /buildroot/output/xxxx/host/ 目录下&#xff0c;生成交叉编译工具&#xff0c;我们可以用来编译目标程序。 1、比如我现在要编译下面的c文件 #include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[…

分布式是大数据处理的万能药?

前言&#xff1a;分布式是大数据处理的万能药&#xff1f;今天叶秋学长跟大家一起探讨这个问题~ 使用分布式集群来处理大数据是当前的主流&#xff0c;将一个大任务拆分成多个子任务分布到多个节点进行处理通常能获得显著的性能提升。因此&#xff0c;只要发现处理能力不足就可…

人数超员识别系统 yolov5

人数超员识别系统基于计算机视觉分析技术yolov5网络架构对现场画面实时分析&#xff0c;如监测到区域超员时&#xff0c;立刻抓拍存档并告警提示。YOLOv5是一种单阶段目标检测算法&#xff0c;该算法在YOLOv4的基础上添加了一些新的改进思路&#xff0c;使其速度与精度都得到了…

Java日志技术是什么

文章目录日志技术日志技术介绍日志技术体系日志技术 日志技术介绍 想清楚的知道一个系统运行的过程和详情就需要日志记录 日志介绍: 生活中的日志&#xff1a; 生活中的日志就好比日记&#xff0c;可以记录你生活的点点滴滴。 程序中的日志&#xff1a; 程序中的日志可以用来记…

04---springboot实现增删改查

1、配置文件 application.yml server:port: 8081 spring:mvc:path match:matching-strategy: ant_path_matcherdatasource:driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456url: jdbc:mysql://localhost:3306/management?useUnicodetrue&use…

C++ STL 之关联容器 map 详解

文章目录Part.I AttentionChap.I 注意事项Chap.II 操作技巧Part.II FuncitonPart.III CodeChap.I mapChap.II unordered_mapChap.III multimapPart.I Attention C 中 map 提供的是一种键值对容器&#xff0c;里面的数据都是成对出现的&#xff0c;每一对中的第一个值称之为关键…

博苑股份冲刺创业板上市:上半年净利润约1亿元,李成林为董事长

近日&#xff0c;山东博苑医药化学股份有限公司&#xff08;下称“博苑股份”或“博苑医药”&#xff09;在深圳证券交易所创业板更新招股书。据贝多财经了解&#xff0c;博苑股份于2022年6月17日递交招股书&#xff0c;准备在创业板上市。 本次冲刺创业板上市&#xff0c;博苑…

服务的消费方式和服务熔断

目录 1. 服务消费方式 1.1 RestTemplate 1.2 feign 2. 服务熔断&#xff08;降级&#xff09; 2.1 在微服务架构中服务熔断的必要性 健康的微服务集群&#xff1a; ​编辑 出现故障&#xff1a; ​编辑 系统雪崩&#xff1a; ​编辑 2.2 hystrix 2.3 hystrix的使用…