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

1255627-20180304230923361-401978309.png

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

目录

1255627-20180625174903525-997651302.png

一、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 += 1println("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 = 0val 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? = 0val val_a : Int? = nullinit {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 : TabLayoutlateinit 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
Github:Jteictors

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

QQ群号:497071402
160a5e3194215cdd?w=200&h=274&f=jpeg&s=68508

转载于:https://www.cnblogs.com/Jetictors/p/7723044.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java调用sql返回list_Spring JdbcTemplate实现有java.sql.ResultSet结果集返回的存储过程调用 | 学步园...

一、调用存储过程方式一&#xff1a;/*** 方法功能说明&#xff1a;通过存储过程分页&#xff0c;获取分页信息以及查询记录(装在list中)&#xff1b;* List.get(0) hsTable; //存放分页信息(tableName/token/pageNo/pageSize/recordsCount/pagesCount)--hsTable.get(key)* Lis…

今天研究了一下关于Asp.net文件上传时的内存消耗问题

晕啊&#xff0c;写了半天&#xff0c;突然间所有的格式都没了&#xff0c;我不得不在写字板中重新排版&#xff0c;DuDu哥&#xff0c;你还是快捷键都去掉吧。 简单研究了一下如何解决Asp.net连续上传文件时对内存占用越来越多的问题。但目前只能解决一部份问题&#xff0c;要…

Linux系统编程-管道入门

晚上好&#xff0c;继续记录我的学习心得。当你厌倦了自己的目标时&#xff0c;怎样继续保持专注&#xff1f;误区&#xff1a;成功人士说的都是自己如何“满怀热情”去努力实现他们的目标。不管是在商业、体育还是艺术界&#xff0c;我们听到的都是“一切都归结于激情”或者“…

JavaScript 基础,登录前端验证

1、<script></script>的三种用法&#xff1a; 1.放在<body>中 2.放在<head>中 3.放在外部JS文件中 2、三种输出数据的方式&#xff1a; 1.使用 document.write() 方法将内容写到 HTML 文档中。 2.使用 window.alert() 弹出警告框。 3.使用 innerHTML 写…

Meta的用法

----------------------------------------------- ? 这就是meta标签的典型运用。meta标签有多少参数&#xff0c;有什么作用&#xff0c;为什么我们要特别重视它呢&#xff1f;让我们一起来发掘meta标签的奥妙! ? 根据HTML语言标准注释&#xff1a;meta标签是对网站发展非常…

iOS10 打开APP设置界面和WIFI界面

在iOS10以上&#xff0c;权限这块有了一些变化 首先在info的URL Types 添加 prefs 1、打开APP设置界面 //打开设置let url:NSURL NSURL(string: UIApplicationOpenSettingsURLString)!if UIApplication.shared.canOpenURL(url as URL){ UIApplication.shared.openURL(url as…

一种简单、实用的测量程序运行时间的方法

前言 平时我们可能很少去关注程序运行的时间&#xff0c;但是在一些情况下可能需要对程序进行一个整体的复盘、优化。那么&#xff0c;程序运行的时间就是一个可以考虑的方面&#xff0c;可以测一下某些代码块、函数、算法的运行时间&#xff0c;然后整体考虑看看有没有必要进行…

可以这样给DataGrid加个序号列。

先给DataGrid加个绑定列&#xff0c;该列设置页眉文本&#xff0c;但“数据字段”留空&#xff0c;然后在ItemDataBound事件中加入下面代码。 privatevoiddgScore_ItemDataBound(objectsender, System.Web.UI.WebControls.DataGridItemEventArgs e) { …

工作几天被裁员,难受

前两天&#xff0c;一个读者朋友私聊我说&#xff0c;自己被公司裁员了&#xff0c;这是他的第一份工作&#xff0c;只工作了不到半个月就收到了裁员信息。他非常不甘心&#xff0c;也非常恐慌&#xff0c;不甘心的是&#xff0c;自己觉得工作已经非常努力&#xff0c;也有做出…

C++17 inline静态变量,静态变量不用再类内定义类外初始化了

而在 C17 引入的标准中&#xff0c;你可以直接在类中定义并初始化类静态成员变量&#xff0c;并且这个表达式还是constexpr&#xff0c;从而可以在编译时进行求值&#xff0c;提供更好的优化。 例如&#xff1a; // MyClass.h class MyClass { public:inline static int myVa…

cad2017单段线_没想到啊,我平时用的CAD多段线有这么多学问

很多人都说&#xff0c;CAD用多段线来代替直线绘图会比较方便&#xff0c;因为多段线除了常规直线功能之外&#xff0c;也能画弧线&#xff0c;更重要的是&#xff0c;一次命令执行的线条为一个整体&#xff0c;操作方便。难道多段线PL仅仅只有这明面上的实力吗&#xff1f;当然…

找灵感

关于博客园首页设计&#xff0c;推荐大家到http://pages.blueidea.com/找灵感&#xff0c;几百种艺术设计方案...

一个超强的逆向分析软件

IDA 超强逆向分析工具先说下&#xff0c;想获取这个工具的同学&#xff0c;请在公众号后台回复 「逆向分析」获取下载链接。IDA Pro&#xff08;交互式反汇编其专业版&#xff0c;后续简称为IDA&#xff09;软件是由Hex-Rays SA公司发布&#xff0c;属于当前最炙手可热的一款世…

php的缓存机制,PHP缓存机制

在这里&#xff0c;我们通过一个代码示例进一步了解PHP自身的缓存机制&#xff0c;在今后的学习中&#xff0c;也会对缓存这个概念有一个大致的了解。使用php自身的缓存机制如果要测试php自己的缓存机制, 需要配置php.ini 文件display_errorsOnoutput_bufferingOfferror_report…

java 检索ldap,从LDAP(Java)检索信息

我正在尝试从LDAP服务器检索数据,但它失败了. (连接工程).我很难理解最后一行中search()方法需要哪些参数……“mail”是我想要获取的信息,userName是经过身份验证的用户.DirContext authContext new InitialDirContext(authEnv);SearchControls constraints new SearchContr…

你还不知道怎么退出 Vim?

提起文本编辑器&#xff0c;你一定会想到编辑器之神 Vim。据 Stack Overflow 的开发者调查&#xff1a;2015 年程序员中最流行的编辑器是 Notepad&#xff0c;Vim 的使用比例占 15.2%。到了 2019 年&#xff0c;最流行的开发环境变成 VS Code&#xff0c;而 Vim 的使用比例已占…

如何在C#里实现端口监视呢?

这个问题今天差不多弄了一整天在网上也找不到相关的资料&#xff0c;或者找到的也实现不了总是很奇怪唉

【hdu2089】不要62

惊奇地发现今天居然和dalao的题单重了不少23333333333333 这是我第一次做数位dp&#xff0c;感觉这个题目还是比较兹磁的 #include<iostream> #include<cstring> #include<cstdio> using namespace std; int l,r,dp[20][15],a[20]; int dfs(int pos,int las,…

我的大学6年

这篇文章是郭天祥前辈写的&#xff0c;想起来我上大学那时候&#xff0c;也是看他的视频入门的单片机开发&#xff0c;而且那时候&#xff0c;没有这么多渠道了解外面的东西。当时最喜欢的是一个技术论坛&#xff0c;现在还因为某种原因开始收费了&#xff0c;更甚的是如果不按…

php无法创建cookie,php-curl cookie无法成功创建

我正在使用cUrl(PHP)发布登录请求并将响应存储在cookie文件中.在我的第二个请求中,我在标题中传递cookie并发布数据以进行验证.问题是未在第一个成功请求中创建cookie文件会导致第二个请求失败.请告诉我我做错了什么.$cookiefile"/var/www/html/dimdim/cook.txt";$ur…