分享好友 最新动态首页 最新动态分类 切换频道
Android kotlin 搜索框实现 kotlin关键字
2024-12-26 12:58


Android kotlin 搜索框实现 kotlin关键字

文章目录

  • 1、关键字:
  • ?的含义
  • ?:的含义
  • :(冒号)
  • ::(双冒号)
  • ::class
  • !!(双叹号)
  • abstract :
  • any:
  • by
  • companion object 伴生对象:
  • const:
  • constructor 用于标识构造函数
  • data class:
  • indices:
  • inline:
  • inner:
  • internal:
  • is:
  • lateinit var 延迟初始化属性:
  • by lazy 懒属性(延迟加载)
  • object(用于创建单例模式):
  • open 说明可以被继承 :
  • override :
  • reified:
  • sealed 密封类:
  • tailrec(尾递归):
  • Unit 类型:
  • var和val:
  • typealias:
  • vararg :
  • when 用于判断 相当于java中的switch()语句
  • 2、注解:
  • @JvmField
  • @JVMStatic
  • 3、作用域函数
  • let
  • apply:
  • run:
  • with:
  • also
  • 4、定义类
  • 4.1、属性修饰符
  • 4.2、访问权限修饰符


Kotlin关键字一览表

关键字与操作符 (官)

?的含义

在kotlin中单独使用?表示可为空;

kotlin代码书写格式:

java代码书写格式:

有人疑问加“?”和不加的根本区别在哪?就在于程序运行过程中对变量的赋值,如果给没有加“?”的变量赋值了null,程序就会异常。

?:的含义

在kotlin中表示三元操作符(即三目运算符)

:(冒号)

类型和超类型之间的冒号前要有一个空格,而实例和类型之间的冒号前不要有空格:

Kotlin 可以有包级函数,因此我们并不需要声明一个类来包装 main 函数:

::(双冒号)

双冒号操作符 表示把一个方法当做一个参数,传递到另一个方法中进行使用,通俗的来讲就是引用一个方法。

::class

如何获得 class 的实例

Java 当中:

Kotlin当中:

同样效果的 Kotlin 代码看上去确实很奇怪,实际上 Hello::class 拿到的是 Kotlin 的 KClass,这个是 Kotlin 的类型;
如果想要拿到 Java 的 Class 实例,那么就需要Hello::class.java。

!!(双叹号)

意味着「有一个潜在未处理的 KotlinNullPointerException 在这里」

在kotlin中表示一定不能为空;

abstract :

抽象类 一个类或一些成员可能被声明成 abstract 。一个抽象方法在它的类中没有实现方法。
记住我们不用给一个抽象类或函数添加 open 注解,它默认是带着的。

any:

相当于Java中的Object。

by

类委托、属性委托

companion object 伴生对象:

类似static。

在 kotlin 中,不像 java 或者 C# ,它没有静态方法。在大多数情形下,我们建议只用包级别的函数。

如果你要写一个没有实例类就可以调用的方法,但需要访问到类内部(比如说一个工厂方法),你可以把它写成它所在类的一个成员(you can write it as a member of an object declaration inside that class)更高效的方法是,你可以在你的类中声明一个伴随对象,这样你就可以像 java/c# 那样把它当做静态方法调用,只需要它的类名做一个识别就好了。

实例:获取全局的Application实例

const:

使用 const 修饰符标记为 编译期常量

constructor 用于标识构造函数

二级构造函数

3.1、注:kotlin中的类定义同时也是构造函数,这个时候是不能进行操作的,所以kotlin增加了一个新的关键字init用来处理类的初始化问题,init模块中的内容可以直接使用构造函数的参数。

3.2、java中加入final为不可继承,而kotlin中定义类默认前面带有修饰符final,所以,如果想继承该类,在最前面加上open或者abstract即可。即:

3.3、如果init中没有操作,则可以省略

3.4、如果连参数也没有,甚至可以这么写

3.5、但是当构造参数中的参数、类型变化时可能需要不只是一个构造函数,需要多组构造函数来处理不同view上的数据时,使用constructor加上参数,后面用this加上主构造函数的参数。
次级构造函数

data class:

kotlin中的data class

data class就是一个类中只包含一些数据字段。

编译器在背后默默给我们生成了如下的东西

  • equals()/hashCode()
  • toString()方法
  • componentN()方法《实现解构申明》
  • copy()方法

如何申明一个简单的数据类? 有一下几点要求:

  • 主构造函数必须要至少有一个参数(就代表了必须要有一个数据字段,hashCode,equals,toString都是要依据主构造函数来生成的)
  • 主构造函数中的所有参数必须被标记为val或者var(相当于表明了数据字段的访问权限,这就达到了Java中我们手动生成set get的目的)
  • 数据类不能有以下修饰符:abstract,inner,open,sealed
  • data class只能实现接口(Kotlin1.1以前的规则),现在也可以继承其它类
    data class User(var id: Int, var name: String)
indices:
inline:

作用:修饰内联函数。

如果被调用的Lambda表达式或函数包含大量的执行代码,那么就不应该使用内联函数;
如果被调用的Lambda表达式或函数只包含非常简单的执行代码,就使用内联函数;

inner:

嵌套类:

如果想让类 B 能访问类 A 的成员,可以加 inner 标记:

访问:

internal:

在Kotlin编程中有四种修饰词:private,protected,internal,public,默认的修饰词是public。

  • internal 声明,在同一模块中的任何地方可见。
is:

相当于Java中的 instanceof

lateinit var 延迟初始化属性:

通常,那些被定义为拥有非空类型的属性,都需要在构造器中初始化.但有时候这并没有那么方便.

例如在单元测试中,属性应该通过依赖注入进行初始化, 或者通过一个 setup 方法进行初始化.在这种条件下,你不能在构造器中提供一个非空的初始化语句,但是你仍然希望在访问这个属性的时候,避免非空检查.

为了处理这种情况,你可以为这个属性加上 lateinit 修饰符

注意:lateinit修饰的变量/属性 不能 是原始数据类型。

这个修饰符只能够被用在类的 var 类型的可变属性定义中,不能用在构造方法中.并且属性不能有自定义的 getter 和 setter访问器.这个属性的类型必须是非空的,同样也不能为一个基本类型.
在一个延迟初始化的属性初始化前访问他,会导致一个特定异常,告诉你访问的时候值还没有初始化.

初始化前访问一个 lateinit 属性会抛出一个特定异常,该异常明确标识该属性被访问及它没有初始化的事实。

by lazy 懒属性(延迟加载)

Kotlin的延迟初始化: lateinit var 和 by lazy

  • lateinit 只用于 var,而 lazy 只用于 val
  • lateinit var只是让编译期忽略对属性未初始化的检查,后续在哪里以及何时初始化还需要开发者自己决定。
  • by lazy真正做到了声明的同时也指定了延迟初始化时的行为,在属性被第一次被使用的时候能自动初始化。
object(用于创建单例模式):
open 说明可以被继承 :

open 注解与java 中的 final相反:它允许别的类继承这个类。

默认情形下,kotlin 中所有的类都是 final ,用来表示他可以被继承。

所以,父类使用open声明类,不然默认final,无法继承。

修饰类: 说明可以被继承

修饰成员 : 在 kotlin 中坚持做明确的事。不像 java ,kotlin 需要把可以复写的成员都明确注解出来,并且重写它们

override :
reified:
sealed 密封类:

密封类用于代表严格的类结构,值只能是有限集合中的某中类型,不可以是任何其它类型。这就相当于一个枚举类的扩展:枚举值集合的类型是严格限制的,但每个枚举常量只有一个实例,而密封类的子类可以有包含不同状态的多个实例。
声明密封类需要在 class 前加一个 sealed 修饰符。密封类可以有子类但必须全部嵌套在密封类声明内部.

注意密封类子类的扩展可以在任何地方,不必在密封类声明内部进行。
使用密封类的最主要的的好处体现在你使用 when 表达式。可以确保声明可以覆盖到所有的情形,不需要再使用 else 情形。

tailrec(尾递归):

作用:修身尾递归函数。与普通递归相比,编译器会对尾递归进行修改,将其优化成一个快速而高效的基于循环的版本,这样减少内存消耗。

Unit 类型:

如果函数返回 Unit 类型,该返回类型应该省略:

var和val:

var是一个可变变量,这是一个可以通过重新分配来更改为另一个值的变量。这种声明变量的方式和java中声明变量的方式一样。
val是一个只读变量,这种声明变量的方式相当于java中的final变量。一个val创建的时候必须初始化,因为以后不能被改变。

typealias:

定义类型别名。

vararg :

功能:可变参数。一个函数最多只能有一个可变参数。

标记后,允许给函数传递可变长度的参数:

when 用于判断 相当于java中的switch()语句

when分支:

  • 不再需要case关键字
  • case值后的冒号改为使用箭头(->)
  • default改为更有意义、更明确的else
  • when分支可以匹配多个值
  • when分支可以是任意表达式
  • when分支对条件表达式的类型没有任何要求

when分支作为表达式:

处理范围(in…),处理类型(is Int,is Double…):

@JvmField

静态字段:
在命名对象或伴生对象中声明的 Kotlin 属性会在该命名对象或包含伴生对象的类中具有静态幕后字段。

通常这些字段是私有的,但可以通过以下方式之一暴露出来:

  • @JvmField 注解;( public static final 字段)
  • lateinit 修饰符;( public static 非-final 字段)
  • const 修饰符。(static 字段)

@JVMStatic

静态方法:
在 “companion object” 中的公共函数必须用使用 @JvmStatic 注解才能暴露为静态方法。

如果使用 @JvmStatic 注解,编译器既会在相应对象的类中生成静态方法,也会在对象自身中生成实例方法。
如果没有这个注解,这些函数仅可用作静态 Companion 字段上的实例方法。

作用域函数(官)

Kotlin之let,apply,with,run函数区别

Kotlin之let,apply,run,with等函数区别2

Kotlin 标准库包含几个函数,它们的唯一目的是在对象的上下文中执行代码块。当对一个对象调用这样的函数并提供一个 lambda 表达式时,它会形成一个临时作用域。在此作用域中,可以访问该对象而无需其名称。这些函数称为作用域函数。共有以下五种:let、run、with、apply 以及 also。

每个作用域函数之间有两个主要区别:

  • 引用上下文对象的方式
  • 返回值

let

默认当前这个对象作为闭包的it参数,返回值是函数里面最后一行,或者指定return

apply:

apply函数是这样的,调用某对象的apply函数,在函数范围内,可以任意调用该对象的任意方法,并返回该对象.

apply函数和run函数很像,唯一不同点就是它们各自返回的值不一样,run函数是以闭包形式返回最后一行代码的值,而apply函数的返回的是传入对象的本身。

run:

run函数和apply函数很像,只不过run函数是使用最后一行的返回,apply返回当前自己的对象。

run函数是let,with两个函数结合体,准确来说它弥补了let函数在函数体内必须使用it参数替代对象,在run函数中可以像with函数一样可以省略,直接访问实例的公有属性和方法,另一方面它弥补了with函数传入对象判空问题,在run函数中可以像let函数一样做判空处理。

with:

with函数是一个单独的函数,并不是Kotlin中的extension,所以调用方式有点不一样,返回是最后一行,然后可以直接调用对象的方法,感觉像是let和apply的结合。

also

上下文对象作为 lambda 表达式的参数(it)来访问。 返回值是上下文对面本身。

4.1、属性修饰符

  • annotation //注解类
  • abstract //抽象类
  • final //类不可继承,默认属性
  • enum //枚举类
  • open //类可继承,类默认是final的

4.2、访问权限修饰符

  • private //仅在同一个文件中可见
  • protected //同一个文件中或子类可见
  • public //所有调用的地方都可见
  • internal //同一个模块中可见
最新文章
新奥精准资料免费大全|精选解释解析落实
  在这个信息爆炸的时代,获取高质量的资料变得越来越重要。本文旨在提供一个全面的资料库,涵盖了各个领域的精选资源,从科技、人文到社会科学等,无需付费即可享有。我们将对每个领域的资料进行精选解释和深度解析,确保读者能够真正理
活动回顾 | “心航向”职业生涯规划工作坊
“心航向”职业生涯规划工作坊— 活 动 回 顾 —在职业道路的选择上,明确的方向和明智的规划是成功的关键。2024年12月7日,浙江大学心理与行为科学系在海纳苑3幢417室举办了一场意义深远的“心航向”职业生涯规划工作坊,旨在为心理系学子
看过《被困百万年:弟子遍布诸天万界》的人还看过
感谢您对我方的信任,我们将按照法律法规要求,采取严格的安全保护措施,保护您的个人隐私信息。在此,我们郑重的提醒您:1.在您使用我方提供的服务时,建议您详细阅读本用户隐私政策,详细了解我方收集,存储,使用,披露和保护您的个人信
美甲培训如何助力你在教育行业中脱颖而出?
作为一位教育行业从业者,我们都希望自己能够在竞争激烈的市场中脱颖而出。而美甲培训正是一个能够帮助我们实现这一目标的利器。在本文中,我们将从多个角度来阐述美甲培训如何助力我们在教育行业中取得成功。美甲培训不仅仅是教授学员如何
群辉包管理工具 synopkg
因为想安装docker,使用apt-get发现apt-get: command not found,这个的出现是因为系统的原因。Linux系统分为三种:1.RedHat系列:Redhat、Centos、Fedora等2.Debian系列:Debian、Ubuntu等3.其它。RedHat系列的包管理工具是yumDebian系列
网站迁移主机位置,会影响谷歌SEO吗?
在网站运营的广阔天地里,每一次细微的变动都可能牵动SEO的敏感神经。特别是当我们面临网站迁移主机位置这一重大决策时,其对于谷歌SEO的影响无疑是每位站长都关心的问题。基于我多年的实战经验和对行业动态的敏锐洞察,今天,我们就来深入
揭秘:排队免单模式如何快速吸引并留住用户?
揭秘:排队免单模式如何快速吸引并留住用户? 系统源码+商业模式设计+平台运营方案,微三云麦超解读前文引言:微三云温馨提醒:因为市场模式是经常变化的,不可能一个模式长期不变地玩如果系 统没有预留多种多样丰富的奖励模式,一旦满足不
阿里巴巴国际站排名怎么靠前?排名规则介绍
阿里巴巴是一个大型的批发网站,国内很多商家都是在这里进货的,除此之外,阿里巴巴还有一个国际站,面向全球各个国家。若是在阿里巴巴国际站开店,怎么提升排名呢?一、国际站排名怎么靠前?1. 首先是产品的类目要选择正确,怎样确定正确类
这里告诉你视频号广告投放推广怎么做
2022年08月26日陈建贵100资深效果广告开户代运营公司,小红书、B站信息流广告,达人探店种草,抖音千川,腾讯视频号等广告开户代运营日用百货销售;化妆品批发;食品销售(仅销售预包装食品);化妆品零售;新鲜水果零售;互联网销售(除销售需
骗人的!《uuopAPP》是诈骗软件,说我操作失误数据乱了要充钱修复漏洞才给提现怎么办
〖→被骗请点击进入帮助平台提现追款〗〖→被骗请点击进入帮助平台提现追款〗希望阅读此文的读者能够及时采取措施以减少损失;请及时与团队联系提供解决方案(文章上方点击添加技术员咨询快速追回)若想追回损失资产,务必仔细阅读以下内容
相关文章
推荐文章
发表评论
0评