百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Kotlin快速上手,基础知识点总结

bigegpt 2024-08-28 12:14 3 浏览

作者:feintkotlin(Kotlin学习网)

说明:这篇文章讲述的是Kotlin的基础语法,可能有些比较高级的用法没有包含在里面

变量

var:定义变量

例如:

var name:String

name=“feint”

name="kotlin"

val:定义常量,类似C里面的const,在定义的时候初始化,之后只不能再被改变

例如:

val name=“feint”

varage:可变参数,和java中..语法的效果一样,只能在函数参数列表的最后一个位置上使用

运算符

.. : 范围运算符

例如:

val oneToNine=1..9 //表示1到9这一数字区间

val isTrue=2 in onToNine

相关方法:

downTo()、rangeTo()、step()、reversed()

等式:

===:比较两个变量的地址

==:根据类型的equals方法返回相应的结果

数据类型

Number

类型

数据

长度

Long

8

字节

Int

4

字节

Short

2

字节

Byte

1

字节

Double

8

字节

Float

4

字节

Boolean

Char:不像在Java中,char不会被默认为是一个数字(无法直接强制转换为Int类型)

String

字符串模版:

var name=“feint”

var info=“my name is $name”

Array

初始化数组:

  1. val arr=arrayOf(1,2,3)

  2. val arr=Array(21,{k->k+1})//Array(数组大小,初始化数组的lambda表达式)

  3. 创建一个二维数组

val level:10;

//创建一个二维数组

val arr= Array(level,{Array(level){0}});

Unit:表示无类型,类似java中的 void

Exception

try{

}catch(e:Exception){

}finally{

}

在Kotlin中异常捕获可以当作表达式使用:

val a=try{

5

}catch(e:Exception){

4

}

类型转换

val str:String ?=any as String

When表达式

可以使用该表达式来替换switch语句

val gStr=when((grade/10) as Int){

9->"Best"

8->"Grate"

7->"Usual"

6->"Not Bad"

else->"Bad”

}

面向对象

构造函数

class Man{

private var name:String;

private var age:Int;

constructor(name: String,age:Int){

this.name=name;

this.age=age;

}

class Man(name: String,age:Int){

private var name:String;

private var age:Int;

init {

this.name=name;

this.age=age;

}

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

类的嵌套

添加了inner关键字,该类只能在其外部类中被调用

inner class Line(val x1:Int,val x2:Int)

使用this@label可以使用外部类中的私有变量

class BasicGraph(val name:String){

private val test:String="Hello";

//

inner class Line(val x1:Int,val x2:Int){

private val test:String="World";

//this@outer_class_name

fun draw():Unit= println("DrawLine ${this@BasicGraph.test} (${x1},${x2})")

}

fun draw():Unit= println("Draw the Graph ${name}");

}

数据类(Data class)

枚举类

enum class Day{

MonDay,TuesDay,WednesDay,ThursDay,Friday,SaturDay,Sunday

}

interface Callable{

fun call():Unit;

}

enum class Animal:Callable{

Dog{

override fun call():Unit= println("I am a dag");

},

Cat{

override fun call():Unit=println("I am a cat");

};

}

定义单例(Singleton)

关键字:object

可以用来存放静态方法和静态变量

object Singleton {

private var count=0;

public val tag="Singleton";

fun doSome():Unit= println("count is ${count++}");

}

//伴生对象,在某个类的内部定义。相当于在类的内部定义一些静态变量

companion object{

}

继承

关键字:open

被该关键字修饰的类能够被继承

关键字:abstract/sealed

修饰抽象类

open abstract class Payment(name:String,bank:String){

abstract fun pay();

}

sealed classes(封装类):类似于枚举类,不同之处在于封装类中能包含多个不同类型的实例。和普通的类继承的不同之处在于其子类的数量是有限的。

sealed class Animal

class Cat():Animal()

class Dog():Animal()

fun whatAnimal(animal: Animal)=when(animal){

is Cat->"I am a Cat"

is Dog->"I am a Dog"

}

关键字:final

被final修饰的方法不能被子类重写

在Kotlin中方法默认是final的,要想继承,得加上 open 关键字

open fun myPay()="Hello";

可见范围

public:在任何地方可见

private:仅限类内部使用

protected:仅限该类和其子类使用

internal:仅限和该类在同一个包下的类使用

委托

关键字:by

interface Base{

fun say():String;

}

class BaseImp(val name: String):Base{

override fun say(): String ="myname is ${name}"

}

class BaseDele(b:Base):Base by b;

val bd=BaseDele(BaseImp("Green"))

println(bd.say());

函数

命名参数

println("min num is ${min(first = 34,second = 232)}")

扩展函数(Extension function)

为某个添加新的函数

class Hello(val name: String,val country:String){

fun hello():String{

return "hello";

}

}

//Extension function

fun Hello.say(){

println("${hello()}: ${name} -- ${country}")

}

infix function

把类对象默认当作函数的第一个参数使用,此类函数只接收传入一个对象。相当于把函数当作一个二元运算符使用

class Calc(number:Float){

var number:Float

init {

this.number=number;

}

infix fun addPrice(increase:Float){

this.number+=increase;

}

}

val calc=Calc(100f);

cals addPrice 200f;

函数式编程

higher order functions

将一个函数当作另一个函数的参数使用

fun <E> List<E>.min(fn:(E,E)->Boolean):E?{

fun pint(pre:(it:Int)->String){

println(pre(100));

}

pint { return@pint "this number is ${it}" }

将函数作为返回值

fun bar():(String)->String={str:String->str.reversed()}

//{str1,str2->"${str1}:${str2} ->左侧是输入参数,->右侧是函数体

fun concat():(String,String)->String={str1,str2->"${str1}:${str2}"}

println(bar()("hello"));

println(concat()("hello","world"));

将函数声明为变量

fun concat(country:String):(String)->String={str1->"${str1}:${country}"}

var world:(String)->String= concat("China");

println(world("Hello"));

函数引用

在函数名称前添加 ::

println("min is:${minlist.min(::min)}");

fun min(a:Int,b:Int):Boolean{

return a>b;

}

属性

lateinit:延迟初始化

属性扩展

在kotlin中属性扩展,相当于添加了一个getter和一个setter,因此无法对扩展属性进行初始化,也无法获取到幕后字段field

数据类

定义

构造函数中至少要有一个参数,必须要有主构造器(紧接着类名的后面)

data class Student(var name:String,var age:Int);

若要使用无参构造,则需要为每个成员变量赋予一个默认值

data class Student(var name:String="feint",var age:Int=32);

copy

data class默认实现了一个copy方法,类似java中的clone。

val stu=Student("feint",23);

stu.age=14;

val oldStu=stu.copy(age=33);

toString

data class还默认实现了一个toString()方法。输出的样式是这样子的:

User(name=feint, age=20)

语法糖

单行函数:fun plusOne(x:Int)=x+1

字符串模版

var name=“feint”

var info=“my name is $name”

等式:

===:比较两个变量的地址

==:根据类型的equals方法返回相应的结果

Nullable语法

使用 ?= 为变量赋予空值

智能类型转换

if(any is String){

//any is smart cast to type of String

}

带标签的while语句

label@while (true){

break@label

}

相关推荐

得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践

一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...

warm-flow新春版:网关直连和流程图重构

本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...

扣子空间体验报告

在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...

spider-flow:开源的可视化方式定义爬虫方案

spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...

solon-flow 你好世界!

solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...

新一代开源爬虫平台:SpiderFlow

SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...

通过 SQL 训练机器学习模型的引擎

关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...

鼠须管输入法rime for Mac

鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...

Go语言 1.20 版本正式发布:新版详细介绍

Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...

iOS 10平台SpriteKit新特性之Tile Maps(上)

简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...

程序员简历例句—范例Java、Python、C++模板

个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...

Telerik UI for iOS Q3 2015正式发布

近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...

ios使用ijkplayer+nginx进行视频直播

上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...

IOS技术分享|iOS快速生成开发文档(一)

前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...

macOS下配置VS Code C++开发环境

本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...