Kotlin 基础语法

2023-05-16

Kotlin 文件以 .kt 为后缀。

包声明

代码文件的开头一般为包的声明:


package com.runoob.main

import java.util.*

fun test() {}
class Runoob {}  

kotlin源文件不需要相匹配的目录和包,源文件可以放在任何文件目录。

以上例中 test() 的全名是 com.runoob.main.test、Runoob 的全名是 com.runoob.main.Runoob。

如果没有指定包,默认为 default 包。

默认导入

有多个包会默认导入到每个 Kotlin 文件中:

  • kotlin.*
  • kotlin.annotation.*
  • kotlin.collections.*
  • kotlin.comparisons.*
  • kotlin.io.*
  • kotlin.ranges.*
  • kotlin.sequences.*
  • kotlin.text.*

函数定义

函数定义使用关键字 fun,参数格式为:参数 : 类型


fun sum(a: Int, b: Int): Int {   // Int 参数,返回值 Int
    return a + b
}  

表达式作为函数体,返回类型自动推断:


fun sum(a: Int, b: Int) = a + b

public fun sum(a: Int, b: Int): Int = a + b   // public 方法则必须明确写出返回类型  

无返回值的函数(类似Java中的void):


fun printSum(a: Int, b: Int): Unit { 
    print(a + b)
}


// 如果是返回 Unit类型,则可以省略(对于public方法也是这样):
public fun printSum(a: Int, b: Int) { 
    print(a + b)
}  

可变长参数函数

函数的变长参数可以用 vararg 关键字进行标识:


fun vars(vararg v:Int){
    for(vt in v){
        print(vt)
    }
}

// 测试
fun main(args: Array<String>) {
    vars(1,2,3,4,5)  // 输出12345
}  

lambda(匿名函数)

lambda表达式使用实例:


// 测试
fun main(args: Array<String>) {
    val sumLambda: (Int, Int) -> Int = {x,y -> x+y}
    println(sumLambda(1,2))  // 输出 3
}  

定义常量与变量

可变变量定义:var 关键字


var <标识符> : <类型> = <初始化值>  

不可变变量定义:val 关键字,只能赋值一次的变量(类似Java中final修饰的变量)


val <标识符> : <类型> = <初始化值>  

常量与变量都可以没有初始化值,但是在引用前必须初始化

编译器支持自动类型判断,即声明时可以不指定类型,由编译器判断。


val a: Int = 1
val b = 1       // 系统自动推断变量类型为Int
val c: Int      // 如果不在声明时初始化则必须提供变量类型
c = 1           // 明确赋值


var x = 5        // 系统自动推断变量类型为Int
x += 1           // 变量可修改  

注释

Kotlin 支持单行和多行注释,实例如下:


// 这是一个单行注释

/* 这是一个多行的
   块注释。 */  

与 Java 不同, Kotlin 中的块注释允许嵌套。


字符串模板

$ 表示一个变量名或者变量值

$varName 表示变量值

${varName.fun()} 表示变量的方法返回值:

 


var a = 1
// 模板中的简单名称:
val s1 = "a is $a" 

a = 2
// 模板中的任意表达式:
val s2 = "${s1.replace("is", "was")}, but now is $a"  

NULL检查机制

Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,有两种处理方式,字段后加!!像Java一样抛出空异常,另一种字段后加?可不做处理返回值为 null或配合?:做空判断处理


//类型后面加?表示可为空
var age: String? = "23" 
//抛出空指针异常
val ages = age!!.toInt()
//不做处理返回 null
val ages1 = age?.toInt()
//age为空返回-1
val ages2 = age?.toInt() ?: -1  

当一个引用可能为 null 值时, 对应的类型声明必须明确地标记为可为 null。

当 str 中的字符串内容不是一个整数时, 返回 null:


fun parseInt(str: String): Int? {
  // ...
}  

以下实例演示如何使用一个返回值可为 null 的函数:


fun main(args: Array<String>) {
  if (args.size < 2) {
    print("Two integers expected")
    return
  }
  val x = parseInt(args[0])
  val y = parseInt(args[1])
  // 直接使用 `x * y` 会导致错误, 因为它们可能为 null.
  if (x != null && y != null) {
    // 在进行过 null 值检查之后, x 和 y 的类型会被自动转换为非 null 变量
    print(x * y)
  }
}  

类型检测及自动类型转换

我们可以使用 is 运算符检测一个表达式是否某类型的一个实例(类似于Java中的instanceof关键字)。


fun getStringLength(obj: Any): Int? {
  if (obj is String) {
    // 做过类型判断以后,obj会被系统自动转换为String类型
    return obj.length 
  }

  //在这里还有一种方法,与Java中instanceof不同,使用!is
  // if (obj !is String){
  //   // XXX
  // }

  // 这里的obj仍然是Any类型的引用
  return null
}  

或者


fun getStringLength(obj: Any): Int? {
  if (obj !is String)
    return null
  // 在这个分支中, `obj` 的类型会被自动转换为 `String`
  return obj.length
}  

甚至还可以


fun getStringLength(obj: Any): Int? {
  // 在 `&&` 运算符的右侧, `obj` 的类型会被自动转换为 `String`
  if (obj is String && obj.length > 0)
    return obj.length
  return null
}  

区间

区间表达式由具有操作符形式 .. 的 rangeTo 函数辅以 in 和 !in 形成。

区间是为任何可比较类型定义的,但对于整型原生类型,它有一个优化的实现。以下是使用区间的一些示例:


for (i in 1..4) print(i) // 输出“1234”

for (i in 4..1) print(i) // 什么都不输出

if (i in 1..10) { // 等同于 1 <= i && i <= 10
    println(i)
}

// 使用 step 指定步长
for (i in 1..4 step 2) print(i) // 输出“13”

for (i in 4 downTo 1 step 2) print(i) // 输出“42”


// 使用 until 函数排除结束元素
for (i in 1 until 10) {   // i in [1, 10) 排除了 10
     println(i)
}  

实例测试


fun main(args: Array<String>) {
    print("循环输出:")
    for (i in 1..4) print(i) // 输出“1234”
    println("\n----------------")
    print("设置步长:")
    for (i in 1..4 step 2) print(i) // 输出“13”
    println("\n----------------")
    print("使用 downTo:")
    for (i in 4 downTo 1 step 2) print(i) // 输出“42”
    println("\n----------------")
    print("使用 until:")
    // 使用 until 函数排除结束元素
    for (i in 1 until 4) {   // i in [1, 4) 排除了 4
        print(i)
    }
    println("\n----------------")
}  

输出结果:


循环输出:1234
----------------
设置步长:13
----------------
使用 downTo:42
----------------
使用 until:123
----------------  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin 基础语法 的相关文章

  • C#调用C++函数来与串口通信

    前些日子帮朋友写个小软件 xff0c 要求用C 来实现主程序 xff0c 主要的功能是与一些通信设备打交道 xff0c 当然就是通过串口了 xff0c 以十进制发送和读取串口 的数据 xff0c 考虑到C 调用API并没有C 43 43 来
  • c++获取系统错误提示!getLastError()

    void showError LPVOID lpMsgBuf FormatMessage FORMAT MESSAGE ALLOCATE BUFFER FORMAT MESSAGE FROM SYSTEM FORMAT MESSAGE IG
  • c++串口操作

    0 前言 做串口方面的程序 xff0c 使用CreateFile打开串口通信端口 在对串口操作之前 xff0c 需要首先打开串口 使用C 43 43 进行串口编程 xff0c 如果采用VS开发 xff0c 则可以直接借助于串口通信控件来操作
  • vs环境下C++dll生成和使用(基础篇)

    动态库和静态库 xff1a 动态库 xff1a 全名动态链接库 xff0c 用于将你的函数封装 xff0c 让别人只能调用 xff0c 不能看你的实现代码 由引入库和dll组成 xff1a 引入库包含导出的函数和变量名 xff0c dll包
  • #ifndef.#define, #endif 的用法

    文件中的 ifndef define endif 很关键 xff0c 是为了避免多重包含 xff0c 比如如果两个C文件同时包含同一头文件 xff0c 那么就会出现问题 xff0c 所以使用这种方法可以有效避免这种情况 一般用法 xff1a
  • 关于.NET编译的目标平台(AnyCPU,x86,x64)

    在VisualStudio中项目平台属性包含x86 x64 AnyCPU三个选项 xff0c 之前的项目中并没有特别去关注这一点 xff0c 最近的项目中涉及到了在不同平台运行的问题 xff0c 所以专门了解并整理了这方面的知识 x86 x
  • IP地址不是唯一的吗?为什么路由器的IP地址都是这样的呢?

    路由器同时连接外部网络和内部网络 xff0c 外部网络的IP是都不一样 xff0c 但内部网络的IP xff0c 就没有问题 xff0c 但内部网络所有设备的IP也不能相同 域名是对你的网站存放主机的ip的解析 xff0c 可以理解为你的别
  • HTTP简介

    HTTP协议是Hyper Text Transfer Protocol xff08 超文本传输协议 xff09 的缩写 是用于从万维网 xff08 WWW World Wide Web xff09 服务器传输超文本到本地浏览器的传送协议 H
  • OMF和flash_recovery_area的关系!

    在OMF出现之前 9i R1 oracle db的文件 xff0c 主要指dbf xff0c redo xff0c ctl是通过os管理的 xff0c 为了简化对数据库文件的管理 xff0c oracle引入了OMF 通过omf创建的dbf
  • asp.net发布网站的详细步骤

    1 用VS2013打开解决方案 2 选中解决方案 xff0c 点击鼠标 右键 gt 从弹出对话框中 xff0c 选择 清理解决方案 3 待第2步 清理解决方案 结束后 xff0c 选中 解决方案 gt 点击鼠标 右键 gt 在弹出对话框中
  • 域名和IP地址是一回事吗?建网站要买域名还要买IP地址吗?

    去年我在网通花了150元买了一个域名 xff0c 他们在登记单上的域名费一栏填了150元 xff0c 登记单上还有IP使用费一栏他们什么也没有填写 xff0c 如果域名与IP地址是同一个项目 xff0c 是一回事 xff0c 他们不是在重复
  • IIS服务器绑定域名问题

    不能将内网的IP地址和互联网的域名绑定 xff0c 如果这样做 xff0c 那么只有内网可以通过域名访问网站 xff0c 外网无法通过域名访问网站 域名ip地址绑定 xff0c 必须是固定ip地址 xff0c 还必须是公网ip地址 需要公网
  • asp网站配置错误解决汇总_1

    由于扩展配置问题而无法提供您请求的页面 如果该页面是脚本 请添加处理程序 错误 xff1a HTTP 错误 404 3 Not Found 由于扩展配置问题而无法提供您请求的页面 如果该页面是脚本 xff0c 请添加处理程序 如果应下载文件
  • 如何在本地服务器绑定域名及host文件的使用说明

    在本地服务器绑定域名 xff1a 打开C WINDOWS system32 drivers etc 目录下面的hosts文件 xff0c 把127 0 0 1 localhost复制 xff0c 粘贴到文件的最后 xff0c 然后把loca
  • 内网访问不到内网网站问题和不用端口号访问网站问题

    windows防火墙 xff0d 高级 xff0d 网络连接设置 xff0d 设置 xff0d 服务 xff0d web服务器 xff0c 在这个位置可以打开80端口 怎样让自建网站在内外网访问时不用加端口名 怎样让自建网站在内外网访问时不
  • vs2010本地调试打不开网页

    在C WINDOWS system32 drivers etc这个文件夹下 找到Hosts文件 用记事本打开 localhost设为127 0 0 1
  • asp文件上传和下载

    ASP NET实现上传文件 前端 界面十分简单 xff0c 只是放一个file类型的 lt input gt 和一个按钮 xff0c 并且为这个按钮添加点击事件 xff08 btnUpLoad Click xff09 xff0c 如下图 x
  • 安装包,创建快捷方式,开机启动项,配置文件参数覆盖窗体类库

    using IWshRuntimeLibrary using System using System Collections Generic using System ComponentModel using System Data usi
  • C#程序以管理员权限运行

    C 程序以管理员权限运行 在Vista 和 Windows 7 及更新版本的操作系统 xff0c 增加了 UAC 用户账户控制 的安全机制 xff0c 如果 UAC 被打开 xff0c 用户即使以管理员权限登录 xff0c 其应用程序默认情
  • C#修改文件或文件夹的权限,为指定用户、用户组添加完全控制权限

    写在前面 在windows系统中 xff0c c盘中的目录权限比较高 xff0c 有时制作安装包的时候 xff0c 默认的安装路径就是在c盘 xff0c 但对运行可执行文件 xff0c 有时候需要为其添加完全控制权限 xff0c 或者读写权

随机推荐

  • ASP.NET简易教程-页面布局

    页面布局 网上有太多介绍 xff0c 个人觉得不错的有 Div 43 CSS布局大全 xff0c 有PDF版本 xff0c 可下载离线观看 xff0c 别人总结的一个文档 xff0c 简洁易懂 xff0c 学起来不费劲 xff0c 花时间不
  • File.Create创建文件后,需要释放…

    if File Exists SavePath File Create SavePath Close
  • 最全CSS各种布局详解

    一 单列布局的实现 1 单列布局中最常用的水平居中的四种方法 同时设置父元素和子元素的样式 xff1a 父元素使用text align实现 xff0c 子元素使用inline block 这里宽高背景只是为了展示 parent text a
  • Android开发的之基本控件和详解四种布局方式

    Android中的控件的使用方式和iOS中控件的使用方式基本相同 xff0c 都是事件驱动 给控件添加事件也有接口回调和委托代理的方式 今天这篇博客就总结一下Android中常用的基本控件以及布局方式 说到布局方式Android和iOS还是
  • 为Android Studio中的SettingsActivity定制任务栏 (Setting Activity其实本质上是从PreferenceActivity中继承过来的)

    Android Studio为开发者提供了很多内建的Activity 其中Settings Activity是非常有用且功能强大的一种内建Activity Setting Activity其实本质上是从PreferenceActivity中
  • Android设置页面PreferenceFragment使用详细+代码分析

    Android设置页面PreferenceFragment使用详细 文章目录Android设置页面PreferenceFragment使用详细一 设置页面核心代码二 设置页面布局核心代码三SettingFragment核心代码四 setti
  • Android Studio 上Activity的互相切换

    Activity上有两个按钮 xff0c 切换到其他两个Activity 1 先创建两个Button xff0c 一个Textview 2 给两个Button添加监听器 xff0c 实现如下代码 public class MainActiv
  • Android中的Intent和Intent-filter总结

    一 xff0e 相关概念 xff08 一 xff09 基本概念 Intent中文意思指 意图 按照Android的设计理念 Android使用Intent来封装程序的 调用意图 不管启动Activity Service BroadcastR
  • C#接口中为什么不能像java那样使用static?

    我印象中java里面的接口使用static final修饰的常量 xff0c 不是成员方法 xff0c 使用static修饰的method放在接口中是无意义的 xff0c 接口是用来抽象的 与Java不同 xff0c C 中的接口不能包含域
  • JVM(2)九个部分 p4

    文章目录 1 九大部分1 1 类加载子系统1 2 方法区1 3 堆1 4 直接内存1 5 jvm栈1 6 本地方法栈1 7 垃圾回收系统1 8 PC寄存器1 9 执行引擎 2 堆 栈 方法区的联系3 Java堆的不同结构4 对象已经死了吗4
  • 通过点击事件监听 setOnClickListener 彻底理解回调-Android

    前言 老司机们对于回调肯定熟悉得不能再熟悉了 但是新司机可能还是一脸懵逼的 xff0c 我比较笨 xff0c 当年懵逼了好久 xff0c 看夏安明的这一篇博客地址 xff0c 虽然下边的留言都是 xff0c 写得好 xff01 懂了懂了 x
  • Java 接口和抽象类可以被new么?——顺便总结内部类

    转载 xff1a https blog csdn net hackersaillen article details 47281549 背景 xff1a 最近有同事跟我说了他面试时遇到的问题 xff0c 考官问 xff1a 接口和抽象类可以
  • java之方法的重写

    方法的重写 xff1a 1 在子类中可以根据需要对从基类中继承来的方法进行重写 2 重写的方法和被重写的方法必须具有相同方法名称 参数列表和返回类型 3 重写方法不能使用比被重写的方法更严格的访问权限 程序code class Person
  • Android中传递对象的三种方法

    Android中 xff0c Activity和Fragment之间传递对象 xff0c 可以通过将对象序列化并存入Bundle或者Intent中进行传递 xff0c 也可以将对象转化为JSON字符串 xff0c 进行传递 序列化对象可以使
  • Android中BroadCastReceiver使用(整理)

    BroadcastReceiver 在Android中 xff0c Broadcast是一种广泛运用的在应用程序之间传输信息的机制 而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件 下面将详
  • Android的联通性---USB主机模式(三)

    获取跟设备通信的权限 在跟USB设备进行通信之前 xff0c 你的应用程序必须要获取用户的许可 注意 xff1a 如果你的应用程序使用Intent过滤器来发现接入的USB设备 xff0c 而且用户允许你的应用程序处理该Intent xff0
  • android USB

    google 在推出API 3 0后 就增加啦USB通讯这块 同时为API 2 3提供啦一个USB通讯吧 xff0c 这样也让2 3有啦USB通讯功能 不过只支持USBAccessory模式 USB通讯分为两种模式 xff1a xff08
  • 入门 Kotlin 和 Java 混合开发

    一 前沿 如果你学习过其他的编程语言 xff0c 你就会发现 Java 的语法很是哆嗦 xff0c 可是我们为什么没有放弃 Java 这门编程语言呢 xff1f 因为 JVM 是一个非常好的平台 xff0c 而且 Java 程序员目前在中国
  • kotlin 和java 混编

    如果你之前使用 Java 语言而没有 Kotlin 开发经验 xff0c 不用担心 xff0c Intellij IDEA 会帮你一键转换 xff0c 将 Java 代码转换成 Kotlin 代码 但是反过来就不行了 在 Mac 上 xff
  • Kotlin 基础语法

    Kotlin 文件以 kt 为后缀 包声明 代码文件的开头一般为包的声明 xff1a package com runoob main import java util fun test class Runoob kotlin源文件不需要相匹