在Kotlin
中的变量、常量以及注释多多少少和Java
语言是有着不一样之处的。不论是变量、常量的定义方式,仍是注释的使用。下面详细的介绍Kotlin
中的变量、常量、注释的使用。以及和Java
的对比。
若是您尚未搭建环境和不了解Kotlin
的,请看个人上一篇博文Kotlin——初级篇(一):开发环境搭建html
kotlin
变量的声明方式与Java
中声明变量有很大的区别,并且必须使用var
或val
关键字。其中:java
var
: 用此关键字声明的变量表示可变变量,便可读且可写。至关于Java
中普通变量val
: 用此关键字声明的变量表示不可变变量,便可读且不可写。至关于Java
中用final
修饰的变量
例:这是在顶层声明的时候android
//当即初始化 var var_a: Int = 10 //推导出类型 var var_b = 5 //没有初始化的时候,必须声明类型 var var_c: Float var_c = 12.3f var_c += 1 println("var_a => $var_a \t var_b => $var_b \t var_a => $var_c") //当即初始化 val val_a: Int = 100 //推导出类型 val val_b = 50 //没有初始化的时候,必须声明类型 val val_c: Int val_c = 1 // val_c += 1 由于c是常量,因此这句代码是会报错的 println("val_a => $val_a \t val_b => $val_b \t val_c => $val_c")
打印结果为:ios
var_a => 10 var_b => 5 var_a => 13.3 val_a => 100 val_b => 50 val_c => 1
- 其中。
var
和val
是Kotlin
中定义变量必须使用的关键字。- 每一行代码的结束能够省略掉分号
;
,这一点是和Java
不一样的地方。固然,第一次写可能会有一点不习惯。print()
与println()
都是打印方法,后者打印完成以后会换一行。此两个方法和Java
的打印方法是如出一辙的。$
符号表示引用的意思。这里理解为字符串模板,在后续的数据类型章节下的字符串类型中会讲解到。
1.2.一、类中声明变量git
上面的是演示变量的基础定义。并且只有在顶层声明的状况下是能够不用实例化的。可是在实际开发当中,通常都是在一个类中去定义变量,这种状况被称为声明类的属性。在后面Kotlin——中级篇(二):属性与字段详解章节会详细的讲解。这里讲解其声明的特色并实例分析。github
其特色以下:必须初始化,若是不初始化,需使用lateinit
关键字。参见1.3节。数组
例:安全
class Test1{ // 定义属性 var var_a : Int = 0 val val_a : Int = 0 // 初始化 init { var_a = 10 // val_a = 0 为val类型不能更改。 println("var_a => $var_a \t val_a => $val_a") } } Test1()
输出结果为:函数
var_a => 10 val_a => 0
其中:在上面的例子中,你们只要关心类中声明变量的用法就能够了。其余的不用关心,这里只是为了能看到程序运行结果。post
1.2.二、声明可空变量
在Java
中,当咱们声明一个变量没必要关心这个变量是否为空,在使用这个变量的时候几乎上都会判断其是否为空增长程序的安全性。这样的习惯是极好的。可是无形中也增长了必定的代码量。有时候这样的代码还极有多是无用的废代码。然而在Kotlin
中当咱们能够肯定这个属性或变量必定不为空时,咱们就用上面讲解到的去定义变量。不然就把它声明为可空变量。
可空变量的特色:
- 在声明的时候必定用标准的声明格式定义。不能用可推断类型的简写。
- 变量类型后面的
?
符号不能省略。否则就和普通的变量没区别了。- 其初始化的值能够为
null
或肯定的变量值。
定义:
var/val 变量名 : 类型? = null/肯定的值
例:
class Test2{ // 声明可空变量 var var_a : Int? = 0 val val_a : Int? = null init { var_a = 10 // val_a = 0 为val类型不能更改。 println("var_a => $var_a \t val_a => $val_a") } } Test2()
输出结果为:
var_a => 10 val_a => null
关于可空变量的定义就上面那么多。可是在使用可空变量的时候就没有Java
中那么复杂了。关于可空变量的使用请参见个人Kotlin——初级篇(六): 可空类型、空安全、非空断言、类型转换等特性总结这篇文章。
在1.2节中,当在类中定义一个变量(属性)的时候是必须初始化的。这在平时的实际开发中能知足大部分的需求。可是仍是有一些特殊的场景中不能知足。好比说:Android
开发中对组件变量的声明与赋值,以及在使用Dagger2
注解变量等。这就须要Kotlin
中特有的后期初始化属性来知足这个需求了。固然这里还为你们讲解延迟初始化,在实际的开发中也是颇有用处的。
1.3.一、后期初始化属性
声明后期初始化属性的特色:
- 使用
lateinit
关键字- 必须是可读且可写的变量,即用
var
声明的变量- 不能声明于可空变量。
- 不能声明于基本数据类型变量。例:
Int
、Float
、Double
等,注意:String
类型是能够的。- 声明后,在使用该变量前必须赋值,否则会抛出
UninitializedPropertyAccessException
异常。
实例讲解:举一个Android
中常见的例子
// 声明组件 private lateinit var mTabLayout : TabLayout lateinit var a : Int // 会报错。由于不能用于基本数据类型。 // 赋值 mTabLayout = find(R.id.home_tab_layout) // 使用 mTabLayout.setupWithViewPager(mViewPager)
1.3.二、延迟初始化属性
所谓延迟初始化即:指当程序在第一次使用到这个变量(属性)的时候在初始化。
声明延迟初始化属性的特色:
- 使用
lazy{}
高阶函数,不能用于类型推断。且该函数在变量的数据类型后面,用by
连接。- 必须是只读变量,即用
val
声明的变量。
实例讲解:一样是Android
中常见的例子
// 声明一个延迟初始化的字符串数组变量 private val mTitles : Array<String> by lazy { arrayOf( ctx.getString(R.string.tab_title_android), ctx.getString(R.string.tab_title_ios), ctx.getString(R.string.tab_title_h5) ) } // 声明一个延迟初始化的字符串 private val mStr : String by lazy{ "我是延迟初始化字符串变量" }
Kotlin
中声明常量的方式和在Java
中声明常量的方式有很大的区别。这里举例说明:
Kotlin
中使用val
时候对应的Java
代码:
Kotlin中的 val numA = 6 等价于 Java中的:public final int numA = 6
很显然,Kotlin
中只用val
修饰还不是常量,它只能是一个不能修改的变量。那么常量怎么定义呢?其实很简单,在val
关键字前面加上const
关键字。
即:
const val NUM_A = 6
其特色:const
只能修饰val
,不能修饰var
声明常量的三种正确方式
- 在顶层声明
- 在
object
修饰的类中声明,在kotlin
中称为对象声明,它至关于Java
中一种形式的单例类- 在伴生对象中声明
举例说明:
// 1. 顶层声明 const val NUM_A : String = "顶层声明" // 2. 在object修饰的类中 object TestConst{ const val NUM_B = "object修饰的类中" } // 3. 伴生对象中 class TestClass{ companion object { const val NUM_C = "伴生对象中声明" } } fun main(args: Array<String>) { println("NUM_A => $NUM_A") println("NUM_B => ${TestConst.NUM_B}") println("NUM_C => ${TestClass.NUM_C}") }
输出结果为:
NUM_A => 顶层声明 NUM_B => object修饰的类中 NUM_C => 伴生对象中声明
Kotlin
中的注释几乎和Java
没什么区别。惟一的区别在于Kotlin
中的多行注释中能够嵌套多行注释,而Java
中是不能的。
单行注释
两个斜杠开头表示单行注释(
//
)
举例:
// 1. 单行注释
多行注释(块注释)
以斜杠加星号开头(
/*
),同时以星号加斜杠结尾(*/
),中间这是要注释的代码块!
举例:
/* 2. 多行注释(块注释) 我是多行注释 */
kotlin中块注释的级联使用,其实我的以为块注释的嵌套使用的意义不大,不过从视觉上确实能给人一种层次感
举例:
/* 第一层块注释 /* 第二层块注释 /* 第三层快注释 这种注释方式在java中是不支持的,可是在kotlin中是支持的。算是一个亮点吧(貌似意义不大)。 */ */ */
注:在Java中使用上面的注释代码直接报错。
类注释、方法注释
和Java是同样的
举例:
/** * 3. 方法的注释(同java同样) */ fun testMethodNote(){ }
对于Kotlin
中的变量、常量及注释就讲解到这里。对于Kotlin
的数据类型、控制语句等基础语法会在后面的章节中更新。并提供源码。
源代码
若是各位大佬看了以后感受还阔以,就请各位大佬随便star
一下,您的关注是我最大的动力。
个人我的博客:Jetictors
掘金 : Jetictors
Github:Jteictors