Kotlin:Kotlin语法练习与开发准备

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

很早以前就有阅读郭霖老师的《第一行代码》第三版中的Kotlin语法学习,但是迫于开发压力和任务的繁重,在后来的日常开发中
仍然采用Java语言进行开发,但在学习的过程中愈发感觉到Kotlin的普及和重要性,因此决定再向Kotlin转变

一、语法

变量

赋值后值更改问题

  • val初始变量,赋值后无法进行值的更改
  • var初始变量,赋值后可以进行值更改

变量类型声明

  • 初始赋值,自动推导变量类型
  • 初始不赋值,需要显式声明变量类型
val a=10//初始赋值,自动推导变量类型
val a: Int=10//初始不赋值,需要显式指定变量类型

函数

fun 函数名(变量名1:变量;变量名2:变量):返回值类型{
return 返回值
}

fun getLargerNumber(num1:Int,num2:Int) :Int{
	return max(num1,num2)
}

//语法糖写法
fun getLargerNumber(num1:Int,num2:Int) :Int=max(num1,num2)

逻辑控制

  • if写法,Kotlin的if写法相比较Java的if语句有额外的功能,便是具有返回值
fun getLargerNumber(num1:Int,num2:Int) :Int{
	val value=if(num1>num2){
		num1
	}else{
		num2
	}
	return value
}

//语法糖写法
fun getLargerNumber(num1:Int,num2:Int) =if(num1>num2){
		num1
	}else{
		num2
	}
  • when写法,Kotlin的when语句和Java中的switch语句类似,但又相比较switch语句简洁许多
//例
fun getScore(name : String)=if (name="Tom"){
	86
}else if (name=="Jim"){
	77
}else if (name=="Jack"){
	99
}

//when写法
fun getScore(name:String)=when(name){
	"Tom"->86
	"Jim"->77
	"Jack"->99
}

//进行类型匹配
fun checkNumber(num: Number){
	when(num){
		is Int->...
		is Double ->...
		else ->...
	}
}
  • 循环语句

Kotlin的while语句和Java中的while语句没有任何区别;但for语句和Java语句有相当大的区别

Java中的for-i循环在Kotlin中被废弃,但是for-each在Kotlin中得到了加强

Kotlin中表示区间的写法:
val range=0…10,表示一个从0到10的区间,且0到10这两个端点被完全包含
0 until 10,表示创建一个从0到10左开右闭的区间,也可通过step对每轮的步长进行控制

fun main(){
	for (i in 0 until 10 step 2){
		println(i)
	} 
}

表示降序的写法:

fun main(){
	for (i in 10 downTo 1){
		println(i)
	} 
}

创建了一个[10,1]的降序空间

二、Kotlin面向对象编程

Kotlin中类的定义和Java类似,但在实例化时,去除了Java中的new关键字

class Person {
	var name=""
	var age =0
	
	fun eat(){
		println(name +"is eating")
	} 
}

//实例化类
val p=Person()

继承与构造函数

要在Kotlin中使用继承类关系,首先要做的第一步应是使得父类能够继承
因为Kotlin任何一个非抽象类默认是不可以被继承的,相当于给Java类声明了一个final关键字

要使得一个类能够被继承,那么便要给其加上open关键字

open class Person{
	...
}

而后我们让某个类继承Person类

class Student:Person(){
	var sno=""
	var grade=""
	...
}

这对括号涉及Kotlin中的主构造函数和次构造函数

主构造函数

主构造函数是最常用的构造函数,每个类都默认有一个不带参数的主构造函数,当然也可以在这里显式地指明参数。主构造函数的特点是没有函数体,直接定义在类名后面

class Student(val sno:String, val grade:Int):Person(){
}

val student=Student("a123",5);

//在主构造函数中执行一些逻辑,需要使用到init方法

class Student(val sno:String, val grade:Int):Person(){
	init {
		println("...")
	}
}

通常情况下,Kotlin中主构造函数必须会被调用到,且主构造函数通过后方的父类的括号,指定调用父类的哪个具体的构造函数

如果要在子类的主构造函数中传入参数调用父类的构造函数,那么就要在子类的主构造函数的参数列表中书写要使用到的参数,但是需要注意的是,传入的父类构造所需要使用到的参数不能使用val和var关键字进行修饰,因为如果用以上的关键字进行修饰,那么相关变量便会变成子类的字段,容易与父类的同名字段产生冲突

具体如下

class Student(val sno:String, val grade:Int,name:String,age:Int):Person(name,age){
	init {
		println("...")
	}
}
次构造函数

次构造函数通过constructor关键字进行修饰,通过this关键字调用主构造函数,主要作用在于初始默认值和统一入口

如果只是设置默认初始值,次构造函数可以通过默认传参进行

具体如下

class Student(val sno:String, val grade:Int,name:String,age:Int):Person(name,age){
	constructor() : this("",0){}
	constructor(name:String, age:Int) : this("",0,name,age){} 
}
接口和函数

Kotlin中定义接口和Java类似

定义接口

interface Study{
	fun readBooks()
	fun doHomeWork(
}

实现接口

class Student(name: String, age: Int) : Person(name, age), Study{
	override fun readBooks(){
		println(name + " is reading")
	}

	override fun doHomeWork(){
		println(name + " is doing Homework")
	}
}

进行接口调用

class Student(name: String, age: Int) : Person(name, age), Study{
	override fun readBooks(){
		println(name + " is reading")
	}

	override fun doHomeWork(){
		println(name + " is doing Homework")
	}
}

在Kotlin中继承类和实现接口统一使用冒号进行管理,同时接口后不需要使用括号,因为接口没有构造函数去提供给他进行调用

class Student(name: String, age: Int) : Person(name, age), Study{
	override fun readBooks(){
		println(name + " is reading")
	}

	override fun doHomeWork(){
		println(name + " is doing Homework")
	}
}

在Kotlin中,可以对接口中的函数进行默认实现,实现接口类在进行实现时,可以不实现已经默认实现的接口函数,但没有进行接口函数默认实现的函数,则必须在实现类中进行实现

函数可见性修饰符

Java和Kotlin中的函数可见性修饰符略有差异,这里直接使用表格对其中的差异进行呈现
在这里插入图片描述

Kotlin中的数据类

在Java类的开发中,我们使用数据类将数据从网络和数据库中映射到内存中时,通过需要重写equal、hashcode、和toString方法,需要编写大量的代码,而在kotlin中,我们可以使用data类,直接完成数据类基础代码的编写
在这里插入图片描述
而在其他类中,我们可以直接使用原Java类中编写基础数据类的代码
在这里插入图片描述

Kotlin中的单例类

在Java中,我们通常需要使用Synchronized、Static关键字等方式实现一个单例模式,但在Kotlin中,我们可以直接使用Object方法进行单例模式的实现

单例类

object Singleton{
}
object Singleton{
	fun singletonTest(){
		println("singletonTest is called")
	}
}

如此,我们便实现了一个单例类的创建,而调用单例模式方法如下

object Singleton{
	fun singletonTest(){
		println("singletonTest is called")
	}
}

Kotlin中Lambda编程

提到Kotlin中的Lambda,我们不得不了解Lambda语法的定义,Lambda就是一小段可以作为参数传递的代码;具体来说,就是可以将代码作为参数传入给到函数。

Lambda 表达式的语法结构具体如下:

{参数名1:参数类型,参数名2:参数类型->函数体}

最完整的Lambda表达式具体如上,最外层为一对大括号,同时要声明参数列表,参数列表的结尾使用一个->符号,表示参数列表的结束和函数体的开始,最后一行代码自动作为Lambda表达式的返回值

举例,我们要求拿到列表中长度最长的字符串水果,我们使用Lambda表达式可以表示如下:
在这里插入图片描述
我们对其进入一步步优化

第一步,将Lambda直接传入
在这里插入图片描述
此时,Kotlin规定,Lambda参数如果是函数唯一一个参数时,可以将参数移动到括号之后,还可以将函数的括号省略
在这里插入图片描述
同时,由于Kotlin拥有出色的类型推导机制,所以Lambda表达式中的参数列表在大多数情况下不必声明参数类型,所以我们对其进行进一步的优化
在这里插入图片描述
当Lambda表达式的参数列表中只有一个参数时,也不必声明参数名,而是可以使用it关键字进行代替
在这里插入图片描述

Java函数式API的使用

要使用Kotlin代码中函数式API对Java方法进行调用,有如下限制,Kotlin代码中调用一个Java方法,并且该方法接收一个Java单抽象方法接口参数,就可以使用函数式API

举例,在Java原生API中有一个最为常用的单抽象方法接口-Runnable接口,其中只有一个待实现的run()方法,定义如下

在这里插入图片描述

Thread类的构造方法中接收了一个Runnable参数,我们可以使用如下Java代码创建并执行一个子线程:
在这里插入图片描述
下面我们直接将该代码翻译成Kotlin,具体如下:
在这里插入图片描述
Kotlin中完全舍弃掉了new关键字,因此创建匿名类的时候改用object关键字,写法如上,这种写法虽然算不上复杂,但是相比较Java的匿名类写法,并没有简化之处

同时,Thread类的构造方法是符合Java函数式API的使用条件,下面我们对代码进行精简。

在这里插入图片描述
这段代码简化的动力在于,Runnable类中只有一个待实现的方法

同时,一个Java方法的参数列表中有且仅有一个Java单抽象方法接口函数时,我们可以对接口名进行省略,具体如下
在这里插入图片描述
同时,因为这里面Lambda表达式是方法对唯一参数,我们将括号进行省略
在这里插入图片描述
根据以上提及,我们对Java中对按钮注册点击事件的方法进行简化
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Kotlin的判空机制

Kotlin的空安全检查机制十分强大,且篇幅很长,笔者的文章在此就不进行赘述了,相关学习的小朋友可以单独搜索相关博客进行阅读

总结

我们以上对Kotlin的语法进行了初步的学习,下一步我们就要练习基于Kotlin的安卓代码开发啦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值