Kotlin开发基础从0开始(一)

为什么学习kotlin

kotlin在今年的Google IO 上正式被确认为Android的官方开发语言,想必原因大家也能猜到一二,一是Google与oracle关于Java相关的版权相关的问题,二是kotlin语言很简洁,不罗嗦,支持很多的新特性。

由于Google都已经官方支持了,语法简洁高效,和IOS的 swift 很是相似,发展趋势不可小觑,还有个大新闻就是我们的大神 Jake Wharton 从square 辞职加入了Google,且其在最近的github中国fork了kotlin 仓库,想必是为kotlin在Android的发展做贡献,就从这可以断定kotlin的未来不会太差, 当然作为技术人就需要不断的学习,不段的挑战。如果想在Android上继续深造kotlin肯定是要学习的。

怎么学习

我的想法是,大家都是学过基本的语言的,比如C,C++,做Android的肯定学过Java,所以我的想法是对照Java的基础与kotlin基础做对比着学习, 这样印象会深刻点,差异化学习。

Kotlin基础

Kotlin 数据类型

在kotlin语言中,所有的类型都是都是对象,kotlin中没有了基础数据类型(int,boolean,char,byte)等。全部换为对象类型。类型如下: 
Int,Boolean,String,Byte,Float,Char,Double,Short,这些没有了Java中隐式拓宽转换,例如不能把Int类型直接赋值给Long类型了,如要要这样做这些书类型可以调用如下方法进行转换:

toByte():   Byte
toShort():  Short
toInt():    Int
toLong():   Long
toFloat():  Float
toDouble(): Double
toChar():   Char
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

kotlin 中各数字类型所占位数如下:

Type bit
Double 64
Long 64
Float 32
Int 32
Short 16
Byte 8

数值常量和Java中基本无区别,十进制:123,十六进制:0x1F。

主要是以下几种字面值常量:

  • 十进制数值: 123
  • 长整型要加大写 L : 123L
  • 16进制:0x0f
  • 二进制:0b00001011
  • 默认双精度浮点数(Double) : 123.5 , 123.5e10
  • 单精度浮点数(Float)要添加 f 或 F :123.5f

注意: kotlin不支持八进制

黑魔法: 在我们写Int或者Long类型数据时,常常一写一长串,不便于识别,现在kotlin支持在数字常量中可以添加_了,便于阅读,不影响数据类型和值,例如电话号码可以这样写了。val phone : Long = 186_****_0814便于我们阅读。不得不说kotlin语言的灵活性。

kotlin中不会在末尾写分号啦!!!!!

== 与 ===的区别

在kotlin中多了一种判断符===三个等号,这个特点呢就是判断两个对象是否指向同一个对象,也就是引用相等,而==则表示的数据的结构相等,也就是调用equals方法的返回值。例如:

var a : Int = 3
println(a===a)  // true
var b : Int  = a
var c : Int = a
println(b===c) // false 因为指向的对象不是同一个
println(b==c)  // true 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

字符串

字符串有两种表达方式,一种是可以带转义符的,另外一种是可以包含任意字符的。例如下面有转义的val s = "hello world \n" ,但如果真正的字符串就是上面带有转义字符\n的,那么要怎么表示呢,kotlin中使用三引号 """来表示,例如:val s = """hello world \n""" 这样\n就不会被转义为回车,而是原封原样的字符串了。

字符串还有了很好的模板特性,会极大的方便字符串拼接,操作等。下面就直接看例子:

val a = 1
var str : String = "this num is $a"
a = 2
val s2 = "${str.replace("is", "was")}, but now is $a"
  • 1
  • 2
  • 3
  • 4

可以看到这极大的方便字符串的操作,使用$即可直接取到变量的值,如果在字符串中操作则使用表达式${}直接对字符串进行操作。

控制流

控制流基本与java中常用的保持一致,有for,while,但switch在kotlin中换为when,学过其他语言的应该都能很容易的掌握。

for 循环

for循环使用 in 关键字进行遍历,普通的如下:

val array = 1..100
for (value in array) {
    print("value = $value")
}
  • 1
  • 2
  • 3
  • 4

对于之前for循环的步长使用step来表示

for (i in 1..100 step 2) {
    print("i = $i")
}
// 1..100  表示是闭区间 ,[1,100]
  • 1
  • 2
  • 3
  • 4

为了表示开闭区间,可以使用until 来表示。如下:1 until 100 表示 [1,100)

倒序的话将..替换为downTo

while循环

while 循环与java 一样,不在多说,以及do while

when

when 的功能与java switch 功能类似,但是其便捷性不仅仅能case 一些基本数据类型,它可以支持表达式,这样会更加的灵活便捷。下面看个例子吧:

fun describe(obj: Any): String =
    when (obj) {
        1,‘1‘ -> "One"
        "Hello","Good" -> "Greeting"
        is Long -> "Long"
        !is String -> "Not a string"
        else -> "Unknown"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

看到上面的是不是很灵活? 可以对不同的类型在同一个分支中进行判断,极大的提高了灵活性。

集合

  • 数组:

在Kotlin中使用Array来表示数组,它本身定义了set,get,size等属性,可以使用arrayOf来创建数组,例如:var test = arrayof(1,2,3),数组中的数据类型可以是任何类型,但是使用时需要注意类型,访问可以用get(index) 或者[index]来访问,

for (ar in array) {
    print("array value = $ar")
}

for (i in array.indices) {
    print("array value = $array[i]")
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • List

list的创建也很简便,使用listOf创建,使用val list = listOf(1,2,3,"string"), 当然遍历也提供了多种方式,如下:

for (it in list) {
    print("list value = $it")
}
// 带下标,以及值的遍历方式
for ((index,value) in list.withIndex()) {
    print("index = $index value = $value " )
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • Map

map的创建val map = mapOf("a" to 1, "b" to 2, "c" to 3),访问也是很简单,比java中访问简单太多,方式如下:

for ((key, value) in map) {
    print("key = $key  value = $value")
}
  • 1
  • 2
  • 3

看到上面常见集合的类型套路都是一样使用类型Of()来创建,访问遍历也是很方便。

空安全

在kotlin是空类型安全的,所以如果要给一个变量赋值为null,则必须在其定义后面加上?,否则无法编译器会报错。

var str : String ? = null
var  size =  str.length   //此时会编译报错,提示可能为空
  • 1
  • 2

那么怎么获取呢,在kotlin中提供两种方法来访问,第一种为?.的访问形式,此种表示如果为空则不执行,非空再继续,则上面则可以写成这样val size = str?.length,第二种就是可能在执行前给变量赋值了,我们肯定它不为空,那么可以用!!.来获取,如下:val size = str!!.length,当然第二种你必须为运行时控制住做好心理准备。

变量

在Java中变量有普通的变量,静态常量(final),静态编量(static),但在kotlin中没有static关键字了,需要使用静态变量有另外的一种表示,后续在将这部分,那在kotlin中的变量的表示方式为var,常量的表达方式为val, 具体表达方式如下:

val a :Float = 1fval a = "Aaron", var c :Int = 2, c += 2 
kotlin中定义的类型是放在变量后面的,且类型有时可省略。

var a : Int = 2var a = 2 这两个表达的是一样的,后面的表达式会进行自动类型推倒。

kotlin是空类型安全的,所以在赋值时也有些差别,如果想要空类型的则在赋值后面需要加

延迟属性

延迟属性或者延初始化可以帮助我们在需要用到时在初始化,不需要时不初始化,帮助程序节省内存空间及启动速度。

在kotlin中使用lazy关键字来表示。直接看下面的例子:

val answer by lazy {
    println("Calculating the answer...")
    42
}
if (needAnswer()) { // 返回随机值
    println("The answer is $answer.") // 此时计算出答案
}else {
    println("Sometimes no answer is the answer...")
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

只有执行到上面needAnswer()为true时,answer才会被初始化。 
想想是不是我们写的很多初始化的代码,都可以用lazy来延迟初始化了。

  • 注意by lazy所赋值的变量必须为val类型

函数

函数在kotlin中使用 fun 来表示,函数参数与定义变量一样放在变量后面,参数的类型不可省略,返回值也是在放在参数括号后面,当没有返回值的时候使用Unit代替 java中的void关键字,当然Unit也是可以省略的。下面我们看几个例子:

fun sum(a: Int, b: Int): Int {
    return a + b
}
// 等同于下面语句,简称函数式表达式
fun sum(a:Int, b:Int) = a + b

val sum = {x:Int ,y:Int -> x + y}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

上面就是一个简单的函数,有参数又返回值。

fun printSum(a: Int, b: Int): Unit {
  println("sum of $a and $b is ${a + b}")
}
// 等同于下面
fun printSum(a: Int, b: Int) {
  println("sum of $a and $b is ${a + b}")
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

上面则为没有返回值,其可以将函数后面的Unit省略掉。

函数默认参数

在java中我们如果对同一个方法名,但是有不同的参数个数,需要写多个方法出来,看起来很臃肿,对于少参数的来说,可能就是某个参数为固定或者默认值,那么在kotlin中有了默认参数的表示方式。例如:

fun sum(a :Int , b : Int = 3) : Int {
    return a +b
}

//调用 sum(1,2) // 代表 1 + 2
//调用 sum (2)  // 代表2 + 3 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
函数具名参数

具名参数是对上面的一种特殊情况的考虑,比如我们将上面的代码改为如下:

fun sum(a :Int = 3, b : Int) : Int {
    return a +b
}
//调用 sum (2)   此时对于此调用,编译器认为2 是为a赋值,而b没有赋值,无法编译通过。那么要调用则采用具名参数来指明参数。
// 改为 sum(b = 2) 这样既可指定将2赋值给b,则a使用默认的值。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
扩展函数

在Android可能很常见的是有一个Utils包,专门放置一些常用的公共方法,比如String,Toast,File 操作等等,然而现在kotlin可以直接对系统类,进行扩展。

fun Context.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) {
    Toast.makeText(this, message, duration).show()
}
//在Activity,Context实例中就可以直接调用了。
toast("我是Toast")
  • 1
  • 2
  • 3
  • 4
  • 5

总结

上面讲述了kotlin 很基础的知识,讲解了些kotlin的特性,当然还有很多的特性,以及在Android上开发的便捷性等等,本篇就先说这么多,下一篇将会说到kotlin更多的特性,比如:自定义类的getter和setter 方法,inline 函数,高阶函数,数据类,单例类等。敬请期待!

时间: 2024-11-05 13:36:55

Kotlin开发基础从0开始(一)的相关文章

安卓开发基础知识0(五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程)

需求说明:安卓开发 内容       :安卓开发所需的环境搭建 来自       :时间的诗 原文:http://www.cnblogs.com/zoupeiyang/p/4034517.html 参考:http://jingyan.baidu.com/article/bea41d437a41b6b4c51be6c1.html 引言 在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想在自己Windows上建立Android开发环境投入Android浪潮的朋友们,为

ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map

原文地址: ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/arcgis_mobile/article/details/8124005 通过上面章节,我们已经了解如何配置一个ArcGIS Runtime for Android开发环境,下面我们将介绍如何使用Eclipse创建一个ArcGIS移动项目Hello W

ArcGIS Runtime for Android开发教程V2.0(4)基础篇---MapView

原文地址: ArcGIS Runtime for Android开发教程V2.0(4)基础篇---MapView - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/arcgis_mobile/article/details/8147328 MapView是ArcGIS Runtime SDK forAndroid的核心组件,通过MapView可以呈现地图服务的数据,并且在MapView中定义了丰富的属性.方法和事件,用户通过Map

ArcGIS Runtime for Android开发教程V2.0(8)基础篇-----地图事件

转自:http://blog.csdn.net/arcgis_mobile/article/details/8263283 ArcGIS Runtime sdk for Android为我们提供了丰富的事件监听器,本节将主要介绍我们经常使用的监听器,并且介绍通过这些监听器可以实现哪些功能,在下面的监听器中只有MapOnTouchListener是类,其他皆为接口类型,如图所示: 1.1 MapOnTouchListener MapOnTouchListener是MapView最为重要的监听器之一

深入理解iPhone数据持久化(手把手教你iphone开发 – 基础篇)

在所有的移动开发平台数据持久化都是很重要的部分:在j2me中是rms或保存在应用程序的目录中,在symbian中可以保存在相应的磁盘目录中和数据库中.symbian中因为权限认证的原因,在3rd上大多数只能访问应用程序的private目录或其它系统共享目录.在iphone中,apple博采众长,提供了多种数据持久化的方法,下面笔者会逐个进行详细的讲解. iphone提供的数据持久化的方法,从数据保存的方式上讲可以分为三大部分:属性列表.对象归档.嵌入式数据库(SQLite3).其他方法. 一.属

使用Kotlin开发Android

查看我的全部开源项目[开源实验室] 欢迎加入我的QQ群:[201055521],本博客客户端源码下载[请点击] 摘要 我首先声明我并没有使用Kotlin很长时间,我几乎是在学习的同时写了这些文章的.我并没有尝试任何其它的替 代语言,例如Go和Scala,所以如果你是真的考虑换一种开发语言的话,我建议你去搜索一下其他人对这些 语言的评价. 本文原创,转载请注明地址:http://blog.kymjs.com/ 正文 最近,新了解了一门编程语言,叫做Kotlin.Kotlin是Jetbrains公司

KOTLIN开发语言文档(官方文档) -- 入门

1.   入门 1.1.  基本语法 1.1.1.   定义包 包说明应该在源文件的顶部: 1 package my.demo 2 import java.util.* 3 // … 并不要求包与目录匹配:源文件可以在文件系统中的任意地方. 查看:包(2.2) 1.1.2.   定义函数 函数带有Int类型参数,并返回Int类型值: 1 fun sum(a: Int, b: Int): Int { 2 return a+b 3 } 函数体可以是表达式,并可从中推断出返回值类型: 1 fun su

一起学Google Daydream VR开发,快速入门开发基础教程一:Android端开发环境配置一

原文因涉及翻墙信息,被强制删除,此文为补发! 准备工作 进入Google Daydream开发者官网,开启准备工作,官网地址:https://vr.google.com/daydream/developers/ -------------------------------------------------------------------------------------------------------------------- Google Daydream开发者网址: https

20145239 杜文超 实验四 Android开发基础

20145239实验四 Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试 了解Android组件.布局管理器的使用 掌握Android中事件处理机制 Android Studio安装 实验步骤 安装 JDK 并配置 JDK 环境变量 依次使用计算机->系统属性->高级系统设置->高级->环境变量,然后新建一个JAVA_HOME变量,令它为计算机中安装JDK的位置: 安装Andriod Studio并配置 1.双击运行Andri