Android Kotlin 基础详解

1,基础语法

1.1 可变变量与不可变变量

可以多次赋值的变量是可变变量,用关键字var表示:

var <标识符> : <类型> = <初始化值>  注意,在kotlin中成员变量不会赋默认值,不像java一样,必须手动添加默认值。
var name : String ="yuanzhen"
name ="yuanzhen1"
var age : Int =20
age =30
println("name:$name,age:$age")
输出:
name:yuanzhen1,age:30

只能赋值一次的变量,是不可变变量,用关键字val表示,类似于java里面的final:

val <标识符> : <类型> = <初始化值> 注意,在kotlin中成员变量不会赋默认值,不像java一样,必须手动添加默认值。

1.2类型推导

kotlin可以根据传入的值,自动推导出变量类型:

var name ="yuanzhen"  //类型推导
name ="yuanzhen1"
var age =20  //类型推导
age =30

1.3函数 方法

kotlin中的Unit相当于java中的void ,如果函数的返回值为Unit,可以不用写返回值

kotlin中使用fun关键字定义函数

定义一个有参数和返回值的函数:

fun test(name1:String ,name2:String):String{return name1+name2
}

   调用:

println(test("yuan","zhen"))
//输出 yuanzhen

   也可以根据类型推导,直接写成:

fun test(name1:String ,name2:String) =name1+name2

  可变参数用关键字vararg表示:

fun lenMethod(vararg value: Int) {for (i in value) {println(i)}
}

调用:

lenMethod(1, 2, 3, 4, 5, 6, 7)

1.4字符串

在kotlin中,$表示一个变量名或者变量值,$name 表示变量值,如果变量值有多个,可以写为:${name1+name2}

var name ="yuanzhen1"  //类型推导
var name1 ="yuanzhen"
println("${name+name1}")

输出:yuanzhen1yuanzhen

换行:""" """  自己不用关心换行:

val infoMesage = """AAAAAAAAAAABBBBBBBBBBBCCCCCCCCCCCDDDDDDDDDDDEEEEEEEEEEE
"""  // 前置空格
println(infoMesage)
val infoMesage2 = """AAAAAAAAAAABBBBBBBBBBBCCCCCCCCCCCDDDDDDDDDDDEEEEEEEEEEE
""".trimIndent()  // 没空格
println(infoMesage2)
val infoMesage3 = """?AAAAAAAAAAA?BBBBBBBBBBB?CCCCCCCCCCC?DDDDDDDDDDD?EEEEEEEEEEE
""".trimMargin("?")  // 没空格 控制?
println(infoMesage3)

输出:

AAAAAAAAAAABBBBBBBBBBBCCCCCCCCCCCDDDDDDDDDDDEEEEEEEEEEEAAAAAAAAAAA
BBBBBBBBBBB
CCCCCCCCCCC
DDDDDDDDDDD
EEEEEEEEEEE
AAAAAAAAAAA
BBBBBBBBBBB
CCCCCCCCCCC
DDDDDDDDDDD
EEEEEEEEEEE

1.5 null检查机制

在kotlin中,如果你这么定义一个变量,一定会报错的

因为这是kotlin特有的机制,不允许直接赋空值。那么要怎么做呢?

var age:Int?=null

加个?的意思就相当于 我发出了一个广播,告诉所有人这个值可能是空的,必须要有处理措施。

第一种处理措施:

var age:Int?=null
val i = age?.and(2)
println("$i")

输出:null

age?.and(2)的意思就是如果age是null,那就不执行?后面的内容了

第二种处理措施:

var age:Int?=null
age!!.and(2)

!!的意思就是我不管,我就强行执行and方法,出了事我负责。

第三种处理措施:

就跟java一样,自己判断处理

var age:Int?=null
if(age !=null){age.and(2)
}

1.6 区间

区间用..来表示

// 1 到 9
for (i in 1..9) {println(i)
}

输出 1 2 3 4 5 6 7 8 9

那如果这样写呢?

for (i in 9..1) {println(i)
}

注意:这样是不会输出的,因为没有9到1这种写法,那如果非要输出9到1呢?

for (i in 9 downTo 1) {println(i)
}

要用downTo

还可以指定步长:

for (i in 1..20 step 2) {println(i)
}

输出:1 3 5 7 9 11 13 15 17 19    每隔2输出一个值

排除最后一个元素:

for (i in 1 until 10) {println(i)
}

输出:1 2 3 4 5 6 7 8 9 

2, 比较与数组

2.1比较

在java中比较两个字符串,用equls来比较,但是在kotlin中,用==来比较字符串的值

val name1: String = "张三"
val name2: String = "张三"println(name1 == name2)

比较对象地址用===表示

// ---  比较对象地址
val test1:Int? =  10000
val test2:Int? =  10000
println(test1 === test2)

输出false

2.2 数组

在java中数组有三种创建方式:

int[] array  = {1,2,3};
int[] array1 = new int[3];
int[] array2 = new int[]{7,8,9};

在kotlin中 数组有两种方式:

第一种:

val numbers = arrayOf(1, 2, 3, 4, 5, 6, 7, 8)

第二种:

val numbers2 = Array(10,  {value: Int -> (value + 200) })
for (value in numbers2) {println(value)
}

输出:

200
201
202
203
204
205
206
207
208
209

为什么会这样呢? 因为value的默认值是0,之后会依次加一。

3,条件控制

比较大小值,可以这样写:

val number1: Int = 99
val number2: Int = 88
// 表达式 比 大小 最大值
val maxValue = if (number1 > number2) number1 else number2
println(maxValue)

输出99 

如果要执行多行代码,还可以这样写:

val max: Int = if (number1 > number2) {println("number1是最大的")number1
} else {println("number2是最大的")number2
}

注意:返回值不需要加return关键字

when相当于java中的switch case,只不过用法更加灵活

用于某个值:

val number5 = 5
when(number5) {1 -> println("一")2 -> println("二")3 -> println("三")4 -> println("四")5 -> println("五")else -> println("其他")
}

用于区间:

val number = 700
when(number) {in 1..100 -> println("1..100")in 200..500 -> println("200..500")else -> println("其他")
}

用于执行多行代码 并且有返回值:

val number = 3
val result = when (number) {1 -> {println("很开心")"今天是星期一"99}2 -> {println("很开心")"今天是星期二"88}3 -> {println("很开心")"今天是星期三"true100}else -> 99
}

4,循环与标签

4.1标签

自定义标签:在kotlin中,我们可以自定义一个标签,用来控制程序的执行流程等

yuanzhen@ for (i in 1..20) {for (j in 1..20) {println("i:$i, j:$j")if (i == 5) {// break // j循环 给breakbreak@yuanzhen // i循环 给break}}
}

一个类中自带的标签:

class Yuan {val I = "aa"fun show() {println(I)println(this.I)println(this@Yuan.I)}}

4.2循环

在kotlin中,要遍历一个list,通常有三种方式:

var items  = listOf<String>("aaa", "bbb", "ccc")

方式一:

for (item in items) {println(item)
}

方式二:

items.forEach {println(it)
}

方式三:

for (index in items.indices) {println("下标:$index,  对应的值:${items[index]}")
}

5,类与对象

5.1类的创建

在kotlin中,创建一个类,如果前面不写修饰符,默认就是public final 

// 默认就是public final
class Empty

这样是不能被继承的,要想被继承,就必须加上open

open class Person{}

5.2构造函数

在java中,会有一个默认的构造函数,并且可以重载无数个构造函数。

但是在kotlin中,它会有一个默认的主构造函数,其余的都是次构造。

上面的Person类,相当于有一个默认的主构造:

open class Person() // 主构造
{}

那如果我们要给主构造增加一个参数呢?

open class Person(id: Int) // 主构造
{
}

那如果还要增加好几个次构造呢?

open class Person(id: Int) // 主构造
{// 次构造constructor(id: Int, name: String) : this(id) {}// 次构造constructor(id: Int, sex: Char) : this(id) {}// 次构造constructor() : this(222) {}}

次构造必须继承主构造,同时把参数传给主构造

在使用时,可以这么用:

val person = Person() // 次构造
val person2 = Person(23456) // 主构造
Person(234, "yy") // 次构造
Person(234, 'M') // 次构造

5.3类的继承

继承父类用:表示

class Student(id: Int) : Person(id) // 主构造
{// 再Kotlin 全部都是没有默认值的// 再Java 成员有默认值,但是方法内部没有默认值// lateinit 懒加载 不用立马赋值,在使用的时候赋值, 没有赋值 就不能使用,否则报错lateinit var name : Stringvar age: Int = 0
}

5.4接口

在kotlin中,接口和抽象类默认都是open的

interface Callback {fun callbackMethod() : Boolean}
interface Callback2 {fun callbackMethod() : Boolean}
abstract class Person : Callback , Callback2 {abstract fun getLayoutID() : Intabstract fun initView()}
class Student : Person() {override fun getLayoutID(): Int = 888override fun initView() { }override fun callbackMethod(): Boolean  = false
}

与java差别不大

5.5data数据类

数据类是kotlin中独有的,在java中,我们要写数据类,通常会手写很多属性和方法等。

在kotlin中,我们只需要用数据类定义属性就可以,不用关心get,set等方法,内部会自动帮我们生成。

// 会自动生成get set 构造 equals hashCode toString copy
data class User(val id: Int, val name: String, val sex: Char)
val user = User(99, "lisi", 'M')
//copy 函数
val(myID, myName, mySex) = user.copy()
println("myID:$myID, myName:$myName, mySex:$mySex")

5.6单例

在kotlin中,object只实例一次,相当于单例

object MyEngine {fun m() {println("M run")}fun show() {println("我就只有一个实例")}
}

companion :意思是同伴对象。相当于java的static.

下面来看一下kotlin中的单例模式怎么写:

方式一:

class NetManager {// 只有一个实例object Holder {val instance = NetManager()}// 看不到 static  可以 派生操作companion object {// 全部都是  相当于 Java staticfun getInstance() : NetManager = Holder.instance}fun show(name: String) {println("show:$name");}}

方式二:

class NetManager2 {companion object {private var instance: NetManager2? = null// 返回值:允许你返回nullfun getInstance(): NetManager2? {if (instance == null) {instance = NetManager2()}// 如果是null,也返回回去了return instance// 第二种补救: 我来负责 instance 肯定不为null// return instance!!}}fun show(name: String) {println("show:$name");}}

5.7嵌套类

嵌套类,就是在类的内部又写了一个类,但是它不是内部类,拿不到外部类的成员。

class Sub {fun show() {println()}class A {class B {class C {}}}
}

5.8内部类

在kotlin中,内部类用关键字inner来表示。

class Sub {fun show() {println()}class A {class B {class C {}}}}// 这个才是内部类inner class Sub2 {fun show() {println(I)}}
}

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

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

相关文章

Mybatis-MyBatis的缓存

Mybatis-MyBatis的缓存 一、MyBatis的一级缓存二、MyBatis的二级缓存二级缓存的相关配置 三、MyBatis缓存查询的顺序 一、MyBatis的一级缓存 一级缓存是SqlSession级别的&#xff0c;通过同一个SqlSession查询的数据会被缓存&#xff0c;下次查询相同的数据&#xff0c;就 会从…

【已解决】qt死活不响应鼠标移动到按钮事件

本博文源于笔者正在研究的内容&#xff0c;这个问题大概捣鼓了一个下午&#xff0c;问题是这样子&#xff1a;我有一个按钮&#xff0c;我应用程序运行时&#xff0c;我鼠标放到按钮上&#xff0c;按钮就会被填充图标。怀揣着这样一个想法&#xff0c;我搜啊搜&#xff0c;整啊…

[JAVAee]SpringBoot日志文件

目录 日志的作用 SpringBoot中的日志 框架说明 日志对象的获取 日志的分类 日志的级别设置 日志的打印 日志的持久化 日志的作用 日志可以帮助我们发现程序的问题并进行定位.日志还可以记录用户的登录信息,分析用户的意图.日志能记录程序执行的时间,记录数据.为日后的程…

mysql 备份和还原 mysqldump

因window系统为例 在mysql安装目录中的bin目录下 cmd 备份 备份一个数据库 mysqldump -uroot -h hostname -p 数据库名 > 备份的文件名.sql 备份部分表 mysqldump -uroot -h hostname -p 数据库名 [表 [表2…]] > 备份的文件名.sql ## 多个表 空格隔开&#xff0c;中间…

网络协议学习地图分享

最近在回顾网络知识点的时候&#xff0c;发现华为数通有关报文格式及网络协议地图神仙网站&#xff0c;这里涵盖了各个协议层及每个协议层对应的协议内容&#xff0c;最人性的化的一点是点击每个单独的协议可以跳转到该协议详细报文格式页面&#xff0c;有对应的说明和解释&…

ARM64汇编基础

ARM64汇编基础 主要内容 到目前为止&#xff0c;大部分的移动设备都是64位的arm架构&#xff0c;一直想抽个时间系统学习下&#xff0c;这个周末就专门来学习下。毕竟两天的时间&#xff0c;也只是简单的入门了解下&#xff0c;为后续工作和学习打下基础。 本次学习的主要内容…

Spring学习笔记4 Bean的作用域

Spring学习笔记3 Spring对IOC的实现_biubiubiu0706的博客-CSDN博客 新建模块 spring-004 引入依赖 <dependencies><!--Spring依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId>&…

多维时序 | MATLAB实现WOA-CNN-BiLSTM-Attention多变量时间序列预测(SE注意力机制)

多维时序 | MATLAB实现WOA-CNN-BiLSTM-Attention多变量时间序列预测&#xff08;SE注意力机制&#xff09; 目录 多维时序 | MATLAB实现WOA-CNN-BiLSTM-Attention多变量时间序列预测&#xff08;SE注意力机制&#xff09;预测效果基本描述模型描述程序设计参考资料 预测效果 基…

uniapp实现表格冻结

效果图如下&#xff1a; 思路&#xff1a; 1.由于APP项目需要&#xff0c;起初想去插件市场直接找现成的&#xff0c;结果找了很久没找到合适的&#xff08;有的不支持vue2有的不能都支持APP和小程序&#xff09; 2.后来&#xff0c;就只能去改uni-table源码了&#xff0c;因…

ORB-SLAM2实时稠密地图,解决运行报段错误(核心已转储)运行数据集时出现段错误,出现可视化界面后闪退(添加实时彩色点云地图+保存点云地图)

高翔的稠密建图仓库 1. git clone https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map.git 2. 去ORB SLAM2里拷贝Vocabulary到/home/cgm/ORBSLAM2_with_pointcloud_map/ORB_SLAM2_modified文件夹下 3. 删除一些build文件夹 删除ORB_SLAM2_modified/Thirdparty/DB…

【Acwing1027】方格取数(动态规划)题解

题目描述 思路分析 错误思路&#xff1a; 贪心法&#xff0c;先走一次求出最大值&#xff0c;把走过的路上面的数值清零&#xff0c;然后用同样的方法再走一遍求最大值&#xff0c;然后让这两个最大值相加就是最后的结果。 很多人在看到这个题目的时候会有上面的思路&#x…

常见限流算法学习

文章目录 常见限流算法学习前言限流算法基本介绍固定窗口计数器限流算法计数器限流算法相关介绍计数器限流算法的实现&#xff08;基于共享变量&#xff09;计数器限流算法的实现&#xff08;基于Redis&#xff09; 滑动窗口计数器算法滑动时间窗口算法相关介绍介绍滑动时间窗口…

【Python】Pycharm中设置使用conda的虚拟环境(保姆级图文)

目录 添加新的环境添加conda环境等待库加载加载成功总结 欢迎关注 『Python』 系列&#xff0c;持续更新中 添加新的环境 添加conda环境 虚拟环境路径 G:\anaconda3\envs\paddle_env\python.execonda路径 G:\anaconda3\Scripts\conda.exe等待库加载 第一次这个库加载可能要…

确知波束形成matlab仿真

阵列信号处理中的导向矢量 假设一均匀线性阵列&#xff0c;有N个阵元组成&#xff0c;满足&#xff1a;远场、窄带假设。 图1. 均匀线性阵模型 假设信源发射信号&#xff0c;来波方向为 θ \theta θ&#xff0c;第一个阵元接收到的信号为 x ( t ) x(t) x(t)&#xff0c;则第…

【解决】Unity3D中无法在MQTT事件中执行Animator

问题原因&#xff1a; 解决方法&#xff1a; 解决过程 1、在 Unity 中创建一个名为 MainThreadDispatcher 的脚本&#xff0c;用于处理主线程操作。 using System.Collections.Generic; using UnityEngine;public class MainThreadDispatcher : MonoBehaviour {private stati…

MySQL常见面试题(一)

&#x1f600;前言 在数据库管理系统中&#xff0c;存储引擎起着核心的角色&#xff0c;它决定了数据管理和存储的方式。MySQL作为一个领先的开源关系型数据库管理系统&#xff0c;提供了多种存储引擎来满足不同的需求和优化不同的应用。除了选择合适的存储引擎&#xff0c;数据…

类和对象(详)

类对象【本节目标】&#xff1a; 1.掌握类的定义方式以及对象的实例化 2.掌握类中的成员变量和成员方法的使用 3.掌握对象的整个初始化过程 4.掌握封装特性 5.掌握代码块 6.掌握内部类 类和对象 1.面向对象的初步认知 1.1 什么是面向对象 Java是一门纯面向对象的语言…

Android 滑动事件消费监控,Debug 环境下通用思路

Android Debug 环境下滑动事件消费监控通用思路 背景 Android 开发中&#xff0c;经常会遇到滑动事件冲突。在一些简单的场景下&#xff0c;我们如果能够知道是那个 View 拦截了事件&#xff0c;那我们能够很容易得解决。解决方法通常就是内部拦截法或者外部拦截法。ViewPage…

【计算机网络 - 自顶向下方法】计算机网络和因特网

目录 1. What is the Internet? 1.1 因特网的具体构成 1.2 因特网的功能 2. Network core 2.1 基本介绍 2.2 分组交换 2.2.1 序列化时延 2.2.2 排队延迟和丢包 2.2.3 分组交换的优缺点 2.3 电路交换 2.3.1 基本概念 2.3.2 电路交换网络中的复用 2.3.3 电路交换文件…

npm发布vue3自定义组件库--方法二

npm发布vue3自定义组件库 创建项目 vue create test-ui自定义组件 创建自定义组件&#xff0c;组件名称根据你的需求来&#xff0c;最好一个组件一个文件夹&#xff0c;下图是我的示例。 src/components 组件和你写页面一样&#xff0c;所谓组件就是方便实用&#xff0c;不…