Kotlin中的变量、常量以及注释多多少少和Java语言是有着不同之处的。不管是变量、常量的定义方式,还是注释的使用。下面详细的介绍Kotlin中的变量、常量、注释的使用。以及和Java的对比。

如果您还没有搭建环境和不了解Kotlin的,请看我的上一篇博文Kotlin——初级篇(一):开发环境搭建

目录

一、Kotlin之变量用法

kotlin变量的声明方式与Java中声明变量有很大的区别,而且必须使用varval关键字。其中:

  • var: 用此关键字声明的变量表示可变变量,即可读且可写。相当于Java中普通变量
  • val: 用此关键字声明的变量表示不可变变量,即可读且不可写。相当于Java中用final修饰的变量

1.1、基础用法

  • 定义格式: 关键字 变量名: 数据类型 = xxx

例:这是在顶层声明的时候

//立即初始化
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")

打印结果为:

var_a => 10 	 var_b => 5 	 var_a => 13.3
val_a => 100 val_b => 50 val_c => 1
  • 其中。varvalKotlin中定义变量必须使用的关键字。
  • 每一行代码的结束可以省略掉分号;,这一点是和Java不同的地方。当然,第一次写可能会有一点不习惯。
  • print()println()都是打印方法,后者打印完成之后会换一行。此两个方法和Java的打印方法是一模一样的。
  • $符号表示引用的意思。这里理解为字符串模板,在后续的数据类型章节下的字符串类型中会讲解到。

1.2、在类中声明以及声明可空变量

1.2.1、类中声明变量

上面的是演示变量的基础定义。而且只有在顶层声明的情况下是可以不用实例化的。但是在实际开发当中,一般都是在一个类中去定义变量,这种情况被称为声明类的属性。在后面Kotlin——中级篇(二):属性与字段详解章节会详细的讲解。这里讲解其声明的特点并实例分析。

其特点如下:必须初始化,如果不初始化,需使用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

其中:在上面的例子中,大家只要关心类中声明变量的用法就可以了。其他的不用关心,这里只是为了能看到程序运行结果。

1.2.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.3、后期初始化与延迟初始化

在1.2节中,当在类中定义一个变量(属性)的时候是必须初始化的。这在平时的实际开发中能满足大部分的需求。但是还是有一些特殊的场景中不能满足。比如说:Android开发中对组件变量的声明与赋值,以及在使用Dagger2注解变量等。这就需要Kotlin中特有的后期初始化属性来满足这个需求了。当然这里还为大家讲解延迟初始化,在实际的开发中也是很有用处的。

1.3.1、后期初始化属性

声明后期初始化属性的特点:

  • 使用lateinit关键字
  • 必须是可读且可写的变量,即用var声明的变量
  • 不能声明于可空变量。
  • 不能声明于基本数据类型变量。例:IntFloatDouble等,注意:String类型是可以的。
  • 声明后,在使用该变量前必须赋值,不然会抛出UninitializedPropertyAccessException异常。

实例讲解:举一个Android中常见的例子

// 声明组件
private lateinit var mTabLayout : TabLayout lateinit var a : Int // 会报错。因为不能用于基本数据类型。 // 赋值
mTabLayout = find(R.id.home_tab_layout) // 使用
mTabLayout.setupWithViewPager(mViewPager)

1.3.2、延迟初始化属性

所谓延迟初始化即:指当程序在第一次使用到这个变量(属性)的时候在初始化。

声明延迟初始化属性的特点:

  • 使用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之常量的用法

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

声明常量的三种正确方式

  1. 在顶层声明
  2. object修饰的类中声明,在kotlin中称为对象声明,它相当于Java中一种形式的单例类
  3. 在伴生对象中声明

举例说明:

// 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之注释

Kotlin中的注释几乎和Java没什么区别。唯一的区别在于Kotlin中的多行注释中可以嵌套多行注释,而Java中是不能的。

  • 单行注释

两个斜杠开头表示单行注释(//

举例:

// 1. 单行注释
  • 多行注释(块注释)

以斜杠加星号开头(/*),同时以星号加斜杠结尾(*/),中间这是要注释的代码块!

举例:

 /*
2. 多行注释(块注释)
我是多行注释
*/
  • 多行注释嵌套

kotlin中块注释的级联使用,其实个人觉得块注释的嵌套使用的意义不大,不过从视觉上确实能给人一种层次感

举例:

  /*
第一层块注释
/*
第二层块注释
/*
第三层快注释
这种注释方式在java中是不支持的,但是在kotlin中是支持的。算是一个亮点吧(貌似意义不大)。
*/
*/
*/

注:在Java中使用上面的注释代码直接报错。

  • 类注释、方法注释

和Java是一样的

举例:

/**
* 3. 方法的注释(同java一样)
*/
fun testMethodNote(){ }

四、尾语

对于Kotlin中的变量、常量及注释就讲解到这里。对于Kotlin的数据类型、控制语句等基础语法会在后面的章节中更新。并提供源码。

源代码

如果各位大佬看了之后感觉还阔以,就请各位大佬随便star一下,您的关注是我最大的动力。

我的个人博客Jetictors

掘金Jetictors

GithubJteictors

欢迎各位大佬进群共同研究、探索

QQ群号:497071402

Kotlin——最详细的常量、变量、注释的使用的更多相关文章

  1. Kotlin——初级篇(二):变量、常量、注释

    在Kotlin中的变量.常量以及注释多多少少和Java语言是有着不同之处的.不管是变量.常量的定义方式,还是注释的使用.下面详细的介绍Kotlin中的变量.常量.注释的使用.以及和Java的对比. 如 ...

  2. Python之变量、常量以及注释

    Python之变量.常量以及注释 一.什么是变量 变量,是用于在内存中存放程序数据的容器,怎么理解呢? 计算机的最核心的功能j就是"计算",计算需要数据源,数据源存在在内存里,比如 ...

  3. Kotlin——最详细的接口使用、介绍

    在Kotlin中,接口(Interface)的使用和Java中的使用方式是有很大的区别.不管是接口中的属性定义,方法等.但是定义方式还是相同的. 目录 一.接口的声明 1.接口的声明 关键字:inte ...

  4. c#利用反射实现对类中的常量进行取值和对应常量的注释

    C#利用反射实现对类中的常量进行取值和对应常量的注释 项目示例:https://gitee.com/dhclly/IceDog.GenerateErrorCode 因为业务需要,项目中有大量的错误码, ...

  5. Swift入门学习之一常量,变量和声明

    版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/6059421.html Swift入门学习之一常量,变量和 ...

  6. 速战速决 (1) - PHP: 概述, 常量, 变量, 运算符, 表达式, 控制语句

    [源码下载] 速战速决 (1) - PHP: 概述, 常量, 变量, 运算符, 表达式, 控制语句 作者:webabcd 介绍速战速决 之 PHP 概述 常量 变量 运算符 表达式 控制语句 示例1. ...

  7. Swift学习(四)常量&变量&基础数据类型

    常量和变量 常量: 使用let关键词来声明一个常量 所指向的是一个特定类型的值,如数字10或者字符”hello”,常量的值是不能够被二次修改的 编程时使用常量能够让代码看起来更加安全和简洁! let ...

  8. C#1 输入输出 常量变量

    C#  输入输出  常量变量 //输出 Console.WriteLine("这是一行文字"); 自动回车的. Console.Write("Hello world&qu ...

  9. Linux多线程编程详细解析----条件变量 pthread_cond_t

    Linux操作系统下的多线程编程详细解析----条件变量 1.初始化条件变量pthread_cond_init #include <pthread.h> int pthread_cond_ ...

随机推荐

  1. 《java.util.concurrent 包源码阅读》20 DelayQueue

    DelayQueue有序存储Delayed类型或者子类型的对象,没当从队列中取走元素时,需要等待延迟耗完才会返回该对象. 所谓Delayed类型,因为需要比较,所以继承了Comparable接口: p ...

  2. 分布式缓存之Ehcache与terracotta - Terracotta服务器概念篇

    1.介绍 Terracotta服务器为Terracotta产品提供分布式数据平台.Terracotta服务器集群被称为Terracotta服务器阵列(TSA).Terracotta服务器阵列可以从单个 ...

  3. C#Winform窗体 DataGridView全选按钮的实现方式

    最近,在做CS程序遇到一个头疼的问题,datagridview列表的全选按钮遇到各种问题,做的是自适应窗体大小,当窗体最大化导致全选按钮出现与列表数据不一致,特别不搭配,试了很久,网上也找了好多资料各 ...

  4. Servlet中web.xml 以及 <url-pattern>总结

    web.xml中添加Servlet配置信息 使用Eclipse创建Servlet,会自动的在WEB-INF下的web.xml中声明,但是有的时候需要我们手动的写入配置信息,以下就是Servlet在we ...

  5. React 页面间传值的个人总结

    react 组件之间传值的方案有很多,下面是我个人经验的总结 props 来传递值 传值方式: 通过props 获取值 通过props 提供的func去修改值 优点: 不需要任何第三方的组件,纯rea ...

  6. hdoj 4325 Flowers 线段树+离散化

    hdoj 4325 Flowers 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4325 思路: 直接线段树,按照花的开放区间的大小建树,要注意虽然 ...

  7. 虚拟DOM详解

    虚拟DOM简介 Virtual Dom可以看做一棵模拟了DOM树的JavaScript对象树,其主要是通过vnode,实现一个无状态的组件,当组件状态发生更新时,然后触发Virtual Dom数据的变 ...

  8. 》》HTML5 移动页面自适应手机屏幕四类方法

    1.使用meta标签:viewport H5移动端页面自适应普遍使用的方法,理论上讲使用这个标签是可以适应所有尺寸的屏幕的,但是各设备对该标签的解释方式及支持程度不同造成了不能兼容所有浏览器或系统. ...

  9. webStorm和Sublime使用列编辑命令

    webStorm可以像Sublime一样使用列编辑,只是区别在于webStorm只可以编辑连续列表. 按住alt键鼠标选择一列,然后输入文字就会编辑多行,这个功能很赞,比较实用(按住ALT键选中之后, ...

  10. vim 命令整理(自己经常使用)

    vimm(vimsual)是Linux/UNIX系列OS中通用的全屏编辑器. vimm分为两种状态,即命令状态和编辑状态.在命令状态下.所键入的字符系统均作命令来处理.如:q代表退出,而编辑状态则是用 ...