Kotlin——最详细的常量、变量、注释的使用

在Kotlin中的变量、常量以及注释多多少少和Java语言是有着不同之处的。不管是变量、常量的定义方式,还是注释的使用。下面详细的介绍Kotlin中的变量、常量、注释的使用。以及和Java的对比。
如果您还没有搭建环境和不了解Kotlin的,请看我的上一篇博文Kotlin——初级篇(一):开发环境搭建
目录

一、Kotlin之变量用法
kotlin变量的声明方式与Java中声明变量有很大的区别,而且必须使用var或val关键字。其中:
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
- 其中。
var和val是Kotlin中定义变量必须使用的关键字。- 每一行代码的结束可以省略掉分号
;,这一点是和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声明的变量- 不能声明于可空变量。
- 不能声明于基本数据类型变量。例:
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.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
声明常量的三种正确方式
- 在顶层声明
- 在
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之注释
Kotlin中的注释几乎和Java没什么区别。唯一的区别在于Kotlin中的多行注释中可以嵌套多行注释,而Java中是不能的。
- 单行注释
两个斜杠开头表示单行注释(
//)
举例:
// 1. 单行注释
- 多行注释(块注释)
以斜杠加星号开头(
/*),同时以星号加斜杠结尾(*/),中间这是要注释的代码块!
举例:
/*
2. 多行注释(块注释)
我是多行注释
*/
- 多行注释嵌套
kotlin中块注释的级联使用,其实个人觉得块注释的嵌套使用的意义不大,不过从视觉上确实能给人一种层次感
举例:
/*
第一层块注释
/*
第二层块注释
/*
第三层快注释
这种注释方式在java中是不支持的,但是在kotlin中是支持的。算是一个亮点吧(貌似意义不大)。
*/
*/
*/
注:在Java中使用上面的注释代码直接报错。
- 类注释、方法注释
和Java是一样的
举例:
/**
* 3. 方法的注释(同java一样)
*/
fun testMethodNote(){
}
四、尾语
对于Kotlin中的变量、常量及注释就讲解到这里。对于Kotlin的数据类型、控制语句等基础语法会在后面的章节中更新。并提供源码。
源代码
如果各位大佬看了之后感觉还阔以,就请各位大佬随便star一下,您的关注是我最大的动力。
我的个人博客:Jetictors
掘金 : Jetictors
Github:Jteictors
欢迎各位大佬进群共同研究、探索
QQ群号:497071402
Kotlin——最详细的常量、变量、注释的使用的更多相关文章
- Kotlin——初级篇(二):变量、常量、注释
在Kotlin中的变量.常量以及注释多多少少和Java语言是有着不同之处的.不管是变量.常量的定义方式,还是注释的使用.下面详细的介绍Kotlin中的变量.常量.注释的使用.以及和Java的对比. 如 ...
- Python之变量、常量以及注释
Python之变量.常量以及注释 一.什么是变量 变量,是用于在内存中存放程序数据的容器,怎么理解呢? 计算机的最核心的功能j就是"计算",计算需要数据源,数据源存在在内存里,比如 ...
- Kotlin——最详细的接口使用、介绍
在Kotlin中,接口(Interface)的使用和Java中的使用方式是有很大的区别.不管是接口中的属性定义,方法等.但是定义方式还是相同的. 目录 一.接口的声明 1.接口的声明 关键字:inte ...
- c#利用反射实现对类中的常量进行取值和对应常量的注释
C#利用反射实现对类中的常量进行取值和对应常量的注释 项目示例:https://gitee.com/dhclly/IceDog.GenerateErrorCode 因为业务需要,项目中有大量的错误码, ...
- Swift入门学习之一常量,变量和声明
版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/6059421.html Swift入门学习之一常量,变量和 ...
- 速战速决 (1) - PHP: 概述, 常量, 变量, 运算符, 表达式, 控制语句
[源码下载] 速战速决 (1) - PHP: 概述, 常量, 变量, 运算符, 表达式, 控制语句 作者:webabcd 介绍速战速决 之 PHP 概述 常量 变量 运算符 表达式 控制语句 示例1. ...
- Swift学习(四)常量&变量&基础数据类型
常量和变量 常量: 使用let关键词来声明一个常量 所指向的是一个特定类型的值,如数字10或者字符”hello”,常量的值是不能够被二次修改的 编程时使用常量能够让代码看起来更加安全和简洁! let ...
- C#1 输入输出 常量变量
C# 输入输出 常量变量 //输出 Console.WriteLine("这是一行文字"); 自动回车的. Console.Write("Hello world&qu ...
- Linux多线程编程详细解析----条件变量 pthread_cond_t
Linux操作系统下的多线程编程详细解析----条件变量 1.初始化条件变量pthread_cond_init #include <pthread.h> int pthread_cond_ ...
随机推荐
- DP 网易内推:合唱团
链接:https://www.nowcoder.com/questionTerminal/661c49118ca241909add3a11c96408c8来源:牛客网 [编程题]合唱团 热度指数:18 ...
- [搜索]ElasticSearch Java Api(一) -添加数据创建索引
转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...
- c# AutoMapper 使用方式
安装方式:使用vs自带的nuget管理工具,搜索AutoMapper ,选择第一个安装到你的项目即可. 我从网上找了一些资料,下载了个demo,然后自己又写了一遍,我把AutoMapper 的使用分为 ...
- mysql安装后服务启动不了(总结)
mysql安装后服务启动不了 1.1 前言 最近真的是倒霉到家,装个mysql都能把所有的问题给问候了一遍······不过这也是一个宝贵的经验,得好好总结下,毕竟也不知道以后会不会再次遇到.如果有网友 ...
- centos 下安装pptp (vpn) 的方法
废话少说 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3 ...
- 实战-Mysql5.6.36脚本编译安装及初始化
概述 本文为centos7.3自动化编译安装mysql5.3.6的脚本及后续初始化操作,话不多少,直接上脚本. 安装脚本install.py如下: #coding=utf-8 #!/usr/bin/p ...
- JAVA IO分析一:File类、字节流、字符流、字节字符转换流
因为工作事宜,又有一段时间没有写博客了,趁着今天不是很忙开始IO之路:IO往往是我们忽略但是却又非常重要的部分,在这个讲究人机交互体验的年代,IO问题渐渐成了核心问题. 一.File类 在讲解File ...
- UWP 图片缩放
给Image外面包裹一个ScrollViewer,你会回来感激我的. 哦,对了,PC上需要按住Ctrl键,滑动鼠标滑轮即可:手机上双指就可以缩放. <ScrollViewer ZoomMode= ...
- 基于maven的ssm框架整合
基于maven的ssm框架整合 第一步:通过maven建立一个web项目. 第二步:pom文件导入jar包 (1 ...
- java 之 组合模式(大话设计模式)
代码是一门艺术,每次看完大话设计模式后都会有新的认识,有时会感叹原来还可以这样玩,相信大家都用过递归,递归的使用一般遍历文件夹等会常用到, 今天讲的设计模式类似于递归,也比较神奇,先看下类图,稍后再帮 ...
Kotlin——最详细的常量、变量、注释的使用的更多相关文章
- Kotlin——初级篇(二):变量、常量、注释
在Kotlin中的变量.常量以及注释多多少少和Java语言是有着不同之处的.不管是变量.常量的定义方式,还是注释的使用.下面详细的介绍Kotlin中的变量.常量.注释的使用.以及和Java的对比. 如 ...
- Python之变量、常量以及注释
Python之变量.常量以及注释 一.什么是变量 变量,是用于在内存中存放程序数据的容器,怎么理解呢? 计算机的最核心的功能j就是"计算",计算需要数据源,数据源存在在内存里,比如 ...
- Kotlin——最详细的接口使用、介绍
在Kotlin中,接口(Interface)的使用和Java中的使用方式是有很大的区别.不管是接口中的属性定义,方法等.但是定义方式还是相同的. 目录 一.接口的声明 1.接口的声明 关键字:inte ...
- c#利用反射实现对类中的常量进行取值和对应常量的注释
C#利用反射实现对类中的常量进行取值和对应常量的注释 项目示例:https://gitee.com/dhclly/IceDog.GenerateErrorCode 因为业务需要,项目中有大量的错误码, ...
- Swift入门学习之一常量,变量和声明
版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/6059421.html Swift入门学习之一常量,变量和 ...
- 速战速决 (1) - PHP: 概述, 常量, 变量, 运算符, 表达式, 控制语句
[源码下载] 速战速决 (1) - PHP: 概述, 常量, 变量, 运算符, 表达式, 控制语句 作者:webabcd 介绍速战速决 之 PHP 概述 常量 变量 运算符 表达式 控制语句 示例1. ...
- Swift学习(四)常量&变量&基础数据类型
常量和变量 常量: 使用let关键词来声明一个常量 所指向的是一个特定类型的值,如数字10或者字符”hello”,常量的值是不能够被二次修改的 编程时使用常量能够让代码看起来更加安全和简洁! let ...
- C#1 输入输出 常量变量
C# 输入输出 常量变量 //输出 Console.WriteLine("这是一行文字"); 自动回车的. Console.Write("Hello world&qu ...
- Linux多线程编程详细解析----条件变量 pthread_cond_t
Linux操作系统下的多线程编程详细解析----条件变量 1.初始化条件变量pthread_cond_init #include <pthread.h> int pthread_cond_ ...
随机推荐
- DP 网易内推:合唱团
链接:https://www.nowcoder.com/questionTerminal/661c49118ca241909add3a11c96408c8来源:牛客网 [编程题]合唱团 热度指数:18 ...
- [搜索]ElasticSearch Java Api(一) -添加数据创建索引
转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...
- c# AutoMapper 使用方式
安装方式:使用vs自带的nuget管理工具,搜索AutoMapper ,选择第一个安装到你的项目即可. 我从网上找了一些资料,下载了个demo,然后自己又写了一遍,我把AutoMapper 的使用分为 ...
- mysql安装后服务启动不了(总结)
mysql安装后服务启动不了 1.1 前言 最近真的是倒霉到家,装个mysql都能把所有的问题给问候了一遍······不过这也是一个宝贵的经验,得好好总结下,毕竟也不知道以后会不会再次遇到.如果有网友 ...
- centos 下安装pptp (vpn) 的方法
废话少说 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3 ...
- 实战-Mysql5.6.36脚本编译安装及初始化
概述 本文为centos7.3自动化编译安装mysql5.3.6的脚本及后续初始化操作,话不多少,直接上脚本. 安装脚本install.py如下: #coding=utf-8 #!/usr/bin/p ...
- JAVA IO分析一:File类、字节流、字符流、字节字符转换流
因为工作事宜,又有一段时间没有写博客了,趁着今天不是很忙开始IO之路:IO往往是我们忽略但是却又非常重要的部分,在这个讲究人机交互体验的年代,IO问题渐渐成了核心问题. 一.File类 在讲解File ...
- UWP 图片缩放
给Image外面包裹一个ScrollViewer,你会回来感激我的. 哦,对了,PC上需要按住Ctrl键,滑动鼠标滑轮即可:手机上双指就可以缩放. <ScrollViewer ZoomMode= ...
- 基于maven的ssm框架整合
基于maven的ssm框架整合 第一步:通过maven建立一个web项目. 第二步:pom文件导入jar包 (1 ...
- java 之 组合模式(大话设计模式)
代码是一门艺术,每次看完大话设计模式后都会有新的认识,有时会感叹原来还可以这样玩,相信大家都用过递归,递归的使用一般遍历文件夹等会常用到, 今天讲的设计模式类似于递归,也比较神奇,先看下类图,稍后再帮 ...