当前位置: 首页 > news >正文

Kotlin:变量声明,null安全,条件语句,函数,类与对象

目录

一,变量声明

1.1 var和val

1.2 类型推断

1.3 Null安全

1.3.1 处理可为null性

二,条件语句

2.1条件语句与条件表达式

2.2 智能类型转换

三,函数

3.1 简化函数声明

3.2 匿名函数

3.3 高阶函数

四,类与对象

4.1 构造函数

4.1.1 主构造函数

4.1.2 次构造函数


一,变量声明

1.1 var和val

Kotlin使用两种关键字varval来修饰变量

  • val用于修饰无法被修改的变量,类似于java中的final;
  • var用于修饰可变的变量;
//var可变
var a : Int = 1
a = 2//val不可变
val str : String = "Kotlin"

Kotlin中声明变量时,是先声明变量名称,再声明变量类型。Kotlin的基本数据类型包括Boolean IntFloatLongDouble等,均为大写开头,与java不同,CharString不属于数值类型,属于一个独立的数据类型;

1.2 类型推断

在Kotlin中,为某个变量赋初值后,Kotlin编译器可根据初始的类型推断变量的类型;

//根据“Kotlin”推断str类型为String
val str = "Kotlin"//String类型方法正常调用
str.toUpperCase()//其他类型方法不可调用
str.inc()

这里编译器根据“Kotlin”推断变量str类型为String,于是str可以调用String类型的方法,而不可调用Int类型的方法inc;

1.3 Null安全

Kotlin提供了严格的可为null性规则,与java不同,默认情况下,Kotlin变量不可为null值;

val str : String = null//不可这样声明,默认情况下不可为null

如果想要使变量可为null,需要在声明变量时在数据类型末尾加上?

val str : String? = null

在java中,默认情况下变量是可以为null的,方法的调用者为null时,就会出现空指针异常:NullPointerException

而在Kotlin中,对于这些可为null值的变量,Kotlin提供了多种机制来安全地处理它们;

1.3.1 处理可为null性

(1)使用 ?. 安全调用方法,调用者为null时,返回null,而不是空指针异常;

var str3 : String? = null;//3.1 ?.安全调用方法,调用者为null时,返回null
println(str3?.length); //输出null

(2)使用 !!. 非null断言运算符,表示告诉编译器方法的调用者绝不为空,但是如果方法的调用者为null,就会报空指针异常,所以这种方法要谨慎使用;

var str3 : String? = null//3.1 !! 非null断言运算符 str3为null时报空指针异常
str3 = "str3非null"
println(str3!!.length) //输出str3非nullstr3 = null
println(str3!!.length) //空指针异常

(3)使用 ?: Elvis运算符,提供一个默认值,在方法调用者为null时,返回默认值;

var str3 : String? = null//3.2 ?: Elvis运算符
val str3Length : Int = str3?.length ?: 0;
println(str3Length) //输出0

二,条件语句

2.1条件语句与条件表达式

Kotlin中同样可以使用if-else语句来处理条件逻辑;

if (count == 42) {println("I have the answer.")
} else if (count > 35) {println("The answer is close.")
} else {println("The answer eludes me.")
}

条件表达式:Kotlin条件语句的结果可作为表达式结果返回;

var count : Int = 1;var str4 : String = if(count == 1){"hello"
}else if(count == 2){"world"
}else{"hello world"
};println(str4); //输出hello

如果你在Kotlin中使用if-else条件表达式,Kotlin会建议你替换为when表达式,当条件语句复杂时,明显when表达式更简洁;

count = 3;
str4 = when{count == 1 -> "hello"count > 2 -> "world"else -> "hello world"
};
println(str4); //输出hello world

2.2 智能类型转换

Kotlin的条件语句还可以用来安全处理变量的可为null性,当条件语句判定变量不为null时,我们就不必使用安全调用运算符或非null断言运算符来调用方法;

//4.1 智能类型转换
var str6 : String? = "xdyd";
//str6可能为null
println(str6?.length)
//str6一定不会为null
if(str6 != null){println(str6.length)
}

三,函数

Kotlin中可以使用函数来封装功能,可以接收参数,声明函数时同样是类型后置;

fun getAnswerString(count : Int) : String{val ans: String = when{count == 1 -> "hello world"count < 1 -> "xxx"else -> "yyy"};return ans
}

3.1 简化函数声明

当函数返回单个表达式的值时,可以直接返回条件表达式;

fun getAnswerString(count : Int) : String{return when{count == 1 -> "hello world"count < 1 -> "xxx"else -> "yyy"};
}

也可以将 return 关键字替换为赋值运算符;

fun getAnswerString(count : Int) : String = when{count == 1 -> "hello world"count < 1 -> "xxx"else -> "yyy"
}

3.2 匿名函数

在Kotlin中,函数可以没有名称,只通过输入输出来表示,我们称之为匿名函数;

val getStringLength = fun (str : String) : Int{return str.length
}

匿名函数既可以看作是函数,也可以看作是一个对象,或者说是在把函数当作对象来使用,就像上边我们将匿名函数赋值给了getStringLength变量;

匿名函数也可以通过lambda表达式的方式表示,我们也可以这样理解:getStringLength是一个函数类型的变量,(String)-> Int 就是函数类型,表示接收一个String类型的参数,返回Int类型的值;

val getStringLength : (String) -> Int = {//参数名称可以自定义,这里为input,就是上面String类型的参数input -> input.length
}

匿名函数通常作为高阶函数的参数来使用;

3.3 高阶函数

一个函数可以将另一个函数作为参数来使用,我们称之为高阶函数

//5.3 高阶函数 将其他函数作为参数的函数 下面这个函数需要接收一个字符串和一个函数
fun stringMapper(str : String, mapper : (String) -> Int) : Int {return mapper(str);
}//高阶函数的调用,传入了一个字符串和一个(String) -> Int类型的匿名函数
stringMapper("android nb", getStringLength)val getStringLength : (String) -> Int = {input -> input.length
}

当高阶函数的最后一个参数为匿名函数时,匿名函数可以写在圆括号之外;

stringMapper("android nb") { input -> input.length }

除了匿名函数之外,高阶函数也可以使用命名函数来作为参数,使用命名函数作为参数时,需使用 :: 来创建函数类型对象,也就是说被 :: 修饰的函数可以作为对象来使用;

stringMapper("android nb", ::getMapper)fun getMapper(str : String) : Int{return str.length
}

四,类与对象

Kotlin中同样使用 class 来定义类,类中可以包括成员变量,成员方法,构造函数,代码块,内部类等,这些与java都相同,与java不同的是,实例化类时不需要new关键字;

//6. 类 构造方法
class Person(){//成员变量private var name : String = ""//成员方法fun getName() : Int{return name.length}fun setName(name : String){this.name = name}//内部类class man(){}
}//类的实例化
val person : Person = Person()

需要注意的是:在Kotlin中,变量的声明和初始化必须同时进行,如果想要推迟变量的初始化,可以使用 lateinit 关键字修饰;

例如:在使用Android的fragment时;

class HomeFragment() : Fragment() {//Kotlin必须在声明变量时初始化,使用lateinit可以推迟初始化private lateinit var btn_add : Buttonoverride fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {var view = inflater.inflate(R.layout.item_mine, container, false)//初始化btn_add = view.findViewById(R.id.btn_mine)return view}
}

4.1 构造函数

4.1.1 主构造函数

Kotlin中类的主构造函数可以写在类的头部;

class Person(var name : String, private var age : Int){}

等同于java代码中这种写法;

public class Person {String name;private int age;public Person(String name, int age){this.name = name;this.age = age;}
}

由于主构造函数不能包含任何代码块,所以我们可以使用初始化程序块来进行一些除初始化之外的操作,初始化程序块使用 init 关键字来修饰;

class Person(name : String, age : Int){var myName : Stringvar myAge : Intinit{myName = namemyAge = ageprintln(myName)println(myAge)}
}

4.1.2 次构造函数

次构造函数使用 constructor 关键字定义,用于提供多个构造方式。如果需要定义多个构造函数,或者需要一些额外的初始化逻辑,可以使用次构造函数;

如果此构造函数中没有接收全部的成员变量参数,必须给成员变量赋初值;

class Person {val myName: Stringvar myAge: Intconstructor(name : String){myName = namemyAge = 18}constructor(name : String, age : Int){myName = namemyAge = age}
}

如果类已经定义了主构造函数,那么次构造函数必须显示调用主构造函数;

class Person(val name: String, var age: Int) {constructor(name: String) : this(name, 0) {// 构造逻辑}
}

如果你需要定义一个无参构造函数,必须要给给主构造函数的参数提供默认值:

class Person(val name: String = "Unknown", var age: Int = 0)val person = Person() // 使用默认值

可以看出,Kotlin似乎一直在避免一件事:声明的变量没有初始值,或者说声明的变量为null。这也是Kotlin null安全的一角啊;

相关文章:

Kotlin:变量声明,null安全,条件语句,函数,类与对象

目录 一&#xff0c;变量声明 1.1 var和val 1.2 类型推断 1.3 Null安全 1.3.1 处理可为null性 二&#xff0c;条件语句 2.1条件语句与条件表达式 2.2 智能类型转换 三&#xff0c;函数 3.1 简化函数声明 3.2 匿名函数 3.3 高阶函数 四&#xff0c;类与对象 4.1 构…...

C--结构体和位段的使用方法

各位看官如果您觉得这篇文章对您有帮助的话 欢迎您分享给更多人哦 感谢大家的点赞收藏评论&#xff0c;感谢您的支持&#xff01;&#xff01;&#xff01; 一&#xff1a;结构体 首先结构体我们有一个非常重要的规则 非常重要&#xff1a; 我们允许在初始化时自动将字符串字面…...

卷积神经网络-迁移学习

文章目录 一、迁移学习1.定义与性质2.步骤 二、Batch Normalization&#xff08;批次归一化&#xff09;三、ResNet网络1.核心思想2.残差结构&#xff08;1&#xff09;残差块&#xff08;2&#xff09;残差结构类型 四、总结 一、迁移学习 迁移学习&#xff08;Transfer Lear…...

数据库:PL/SQL

变量 变量 建议使用V开头 作用: 用来保存一个数据 普通变量 declare --定义一个变量&#xff08;保存一个数据&#xff09; v_email varchar2(20); --定义变量并且赋值 v_ename varchar2(20) :张三; beginv_email :553215qq.com;dbms_output.put_line(v_email);dbms_output…...

迅雷笔试 最长相等子段数列长度 滑动窗口

&#x1f468;‍&#x1f3eb; 牛马Code&#xff1a;最长相等子段数列长度 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Arrays; import java.util.HashMap;public class Main {// 创建一个输入流读取器&#xff0c;用于读取控制台输…...

MMD模型一键完美导入UE5-VRM4U插件方案(一)

1、下载pmx模型 1、去模之屋官网下载MMD模型,模之屋 2、下载完成得到pmx和Texture文件 2、下载并启用VRM4U插件 1、下载VRM4U插件, VRM4U,点击Latest下载对应引擎版本 2、将插件放到Plugins目录,然后...

bench.sh:一行命令测试Linux服务器基准测试

简介 bench.sh 是一个 Linux 系统性能基准测试工具。它的测试结果如下图&#xff1a;给出服务器的整体配置信息&#xff0c;IO 性能&#xff0c;网络性能。很多人使用它测试 vps 性能。 ​​ 一键运行 服务器在国外可以使用以下命令运行测试 wget -qO- bench.sh | bash复制…...

广播IP与共享IP的关系

什么是广播IP&#xff1f; 广播IP是指一种特殊的IP地址&#xff0c;用于在网络中向所有设备发送信息。广播地址通常是某个网络段的最后一个地址&#xff0c;例如&#xff0c;在一个子网掩码为255.255.255.0的网络中&#xff08;即/24子网&#xff09;&#xff0c;其网络地址可…...

正则表达式和re模块

正则表达式&#xff08;Regular Expression&#xff0c;简称Regex或RegExp&#xff09;是计算机科学中的一个重要概念&#xff0c;它通常被用来检索、替换那些符合某个模式&#xff08;规则&#xff09;的文本。正则表达式是对字符串操作的一种逻辑公式&#xff0c;通过事先定义…...

不同的浏览器、服务器和规范对 URL 长度的限制

不同的浏览器、服务器和规范对 URL 长度的限制有所不同。通常的限制如下&#xff1a; 1. 浏览器限制&#xff1a; 常见浏览器对 URL 长度的限制在 2,000 到 8,000 个字符之间。例如&#xff1a; Internet Explorer: 大约 2,083 个字符。Google Chrome: 理论上支持超过 32,00…...

NASA:ATLAS/ICESat-2 L3 A沿线内陆地表水数据V006数据集

目录 简介 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ATLAS/ICESat-2 L3A Along Track Inland Surface Water Data V006 简介 ATLAS/ICESat-2 L3 A沿线内陆地表水数据V006 ATLAS/ICESat-2 L3 A沿线内陆地表水数据V006是指由ATLAS/ICESat-2卫星获取的针对陆地…...

数据结构之链表(1),单链表

目录 前言 一、什么是链表 二、链表的分类 三、单链表 四、单链表的实现 五、SList.c文件完整代码 六、使用演示 总结 前言 本文讲述了什么是链表&#xff0c;以及实现了完整的单链表。 ❤️感谢支持&#xff0c;点赞关注不迷路❤️ 一、什么是链表 1.概念 概念&#xff1a;链…...

如何构建鲁棒高性能 Prompt 的方法?

你好&#xff0c;我是三桥君 在当今时代&#xff0c;利用大型语言模型如ChatGPT进行文本生成和交互已成为一种趋势。然而&#xff0c;要充分发挥这些模型的能力&#xff0c;尤其是在生产环境中&#xff0c;我们需要精心设计和优化我们的提示词&#xff08;prompt&#xff09;。…...

基于Springboot+微信小程序 的高校社团管理小程序(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…...

Vue 响应式监听 Watch 最佳实践

一. 前言 上一篇文章我们学习了 watch 的基础知识&#xff0c;了解了它的基本使用方法及注意事项&#xff0c;本篇文章我们继续了解在Vue 中 响应式监听 watch 的妙用。了解 watch 的基础使用请参考上一篇文章&#xff1a; 详解 Vue 中 Watch 的使用方法及注意事项https://bl…...

md编辑器语法

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…...

RabbitMQ常用管理命令及管理后台

RabbitMQ管理命令 1、用户管理1.1、新增一个用户1.2、查看当前用户列表1.3、设置用户角色1.4、设置用户权限1.5、查看用户权限 2、RabbitMQ的web管理后台2.1、查看rabbitmq 的插件列表2.2、启用插件2.3、禁用插件2.4、访问RabbitMQ的web后台2.4、通过web页面新建虚拟主机 ./rab…...

从准备面试八股文,感悟到技术的本质

工作前几年听说过&#xff0c;大学最重要的几门课其实是数据结构和算法、操作系统、计算机组成原理、计算机网络。 初听时不以为然&#xff0c;感觉没什么用。 近期准备面试八股文得到了一些感悟。这句话随着工作年限和对程序的理解越来越深入&#xff0c;含金量越来越高。 最…...

云手机的默认ip地址是什么

云手机&#xff08;Cloud Phone&#xff09;是一种基于云计算技术的虚拟手机&#xff0c;它可以在云端运行&#xff0c;使用户能够通过互联网访问手机应用和服务。云手机的IP地址通常取决于以下几个因素&#xff1a; 1. 云服务提供商 不同的云服务提供商&#xff08;如AWS、G…...

对接阿里asr和Azure asr

1&#xff1a;对接阿里asr 1.1&#xff1a;pom <dependency><groupId>com.alibaba.nls</groupId><artifactId>nls-sdk-recognizer</artifactId><version>2.2.1</version> </dependency>1.2&#xff1a;生成token package c…...

未来数字世界相关技术、应用:AR/VR/MR;数字人、元宇宙、全息显示

一、AR/VR/MR 增强现实(AR)、虚拟现实(VR)和混合现实(MR)是三种不同的技术,它们都旨在增强用户对现实世界的感知和交互体验。以下是它们的详细介绍: 增强现实(AR) 增强现实(Augmented Reality, AR) 是一种将虚拟信息叠加到现实世界中的技术。通过AR技术,用户可…...

在 Java 中提供接口方法而不是实现接口

问题 我正在阅读有关Java中的接口的文章。其中提到我们必须实现compareTo方法才能在ArrayList容器上调用sort&#xff0c;例如Employee类应该实现 Comparable接口。 后面解释了为什么Employee类不能简单地提供compareTo方法而不实现Comparable接口&#xff1f;之所以需要接口…...

伪类选择器

一、基本概念 伪类选择器以冒号&#xff08;:&#xff09;开头&#xff0c;后面跟着伪类名。它不直接对应DOM中的任何元素&#xff0c;而是用于描述元素的特殊状态或位置。通过使用伪类选择器&#xff0c;可以在不修改HTML文档结构的情况下&#xff0c;为元素添加或修改样式。…...

亚信安全天穹5分钟勒索体检 免费试用今起上线

对于勒索攻击的认知 你是否还停留在“2.0时代”&#xff1f; 勒索攻击无疑是企业面临的最大威胁&#xff0c;2024年上半年&#xff0c;勒索组织数量同步增长超过50%&#xff0c;勒索攻击数量也持续攀升&#xff0c;平均勒索赎金突破520万美元。 当前&#xff0c;勒索攻击治理…...

高校竞赛管理系统的设计与实现

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统高校竞赛管理系统信息管理难度大&#xff0c;容错率低&am…...

物联网行业中通信断线重连现象介绍以及如何实现

01 概述 断线重连是指在计算机网络中&#xff0c;当网络连接遇到异常中断或者断开时&#xff0c;系统会自动尝试重新建立连接&#xff0c;以保证网络通信的连续性和稳定性。这是一种常见的网络通信技术&#xff0c;广泛应用于各种计算机网络场景&#xff0c;包括互联网、局域…...

新手上路:Anaconda虚拟环境创建和配置以使用PyTorch和DGL

文章目录 前言步骤 1: 安装 Anaconda步骤 2: 创建新的 Anaconda 环境步骤 3: 安装最新版本的 PyTorch步骤 4: 安装特定版本的 PyTorch步骤 5: 安装最新版本的 DGL步骤 6: 安装特定版本的 DGL步骤 7: Pycharm中使用虚拟环境解释器第一种情况&#xff1a;创建新项目第二种情况&am…...

centos7系统安装宝塔面板

1、开始安装 适用系统 Centos/OpenCloud/Alibaba 稳定版9.0.0 urlhttps://download.bt.cn/install/install_lts.sh;if [ -f /usr/bin/curl ];then curl -sSO $url;else wget -O install_lts.sh $url;fi;bash install_lts.sh ed8484bec等待命令执行&#xff0c;安装完成&#…...

汽车总线之----J1939总线

instruction SAE J1939 是由美国汽车工程协会制定的一种总线通信协议标准&#xff0c;广泛应用于商用车&#xff0c;船舶&#xff0c;农林机械领域中&#xff0c;J1939协议是基于CAN的高层协议&#xff0c;我们来看一下两者之间的关系。在J1939 中&#xff0c;物理层和数据链路…...

基于skopt的贝叶斯优化基础实例学习实践

贝叶斯方法是非常基础且重要的方法&#xff0c;在前文中断断续续也有所介绍&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《数学之美番外篇&#xff1a;平凡而又神奇的贝叶斯方法》 《贝叶斯深度学习——基于PyMC3的变分推理》 《模型优化调参利器贝叶斯优化bay…...