继续创造,加速生长!这是我参加「日新方案 10 月更文应战」的第10天,点击检查活动概况

带你踏入Kotlin大门(一)|kotlin初识 – ()

带你踏入kotlin大门(二)|根本功_变量篇 – ()

带你踏入kotlin大门(三)|根本功_函数篇 – ()

带你踏入kotlin大门(四)|根本功_逻辑控制篇 – ()

带你踏入kotlin大门(五)|根本功_类和承继篇 – ()

带你踏入Kotlin大门(六)|根本功_接口和特别类篇 – ()

前置知识

  • Java 编程根底

前语

前文为咱们浅浅介绍了 kotlin 这一门言语,给咱们讲述了 kotlin 这个新型根据 jvm 渠道的言语的优势,以及咱们 Android 开发者学习的必要性。话不多说,本篇正式敞开 kotlin 的学习进程,带你正式踏入 kotlin 大门。

至于运用的编译东西,仍旧是咱们日常开发运用的 Android studio 或许 IDEA ,新建一个 kotlin 文件即可敞开编码。或许能够运用 kotlin官方的 在线网站 来学习。

带你踏入kotlin大门(二)|基本功_变量篇

(上述为在线网站截图,一起指出 main 函数怎么写)

本篇文章,先带咱们学习 kotlin 中的 变量

不一样的变量

类型声明

关于类型声明,咱们在 Java 中会经常用到,便是咱们在定义变量的时候,在变量名之前要写的声明。

//java
String stringValue = "abc";
int intValue = 1;
Long longValue = 1234;

上述 Java 代码的变量声明,换到 kotlin 中是这姿态的。

//kotlin
var stringValue = "abc"
var intValue = 1
var longValue = 1234

kotlin 中,咱们的变量类型声明变成了运用 var 或许 val 来进行声明,一起每一行末尾不再运用分号

其中,var 全称是 variable ,意思为可变。其意思正是 可变变量 ,对应于 Java 中的非 final 类型。

val 全称是 value ,更精准的释义应该是:引证不行变,对应于 Java 中的 final 类型。

咱们先来以 var 为例子学习 kotlin 中的变量,val 类型稍后再说。

咱们关于上述的 kotlin 代码或许会有疑惑,为何 kotlin 能够不做类型声明呢,莫非它能自己知道我要的是什么类型的变量么?

是的,kotlin 大部分情况下能够知道你要声明的是什么类型的变量,这是得益于它的 类型推导 机制。当咱们在变量后面写了表达式或许对应的值时,咱们能够不用声明变量的类型,让编译器主动推导类型。

那当咱们偏要声明变量类型,或许咱们未赋值时候,怎么声明变量呢?

kotlin 中,类型声明是运用 <name>:<object> 这种类型来声明的,咱们继续运用上述的demo。

//偏要声明
var stringValue:String = "abc"
var intValue:Int = 1
var longValue:Long = 1234
//无法类型推导,必须做类型声明
var stringValue:String
var intValue:Int
var longValue:Long

咱们会发现 Java 中的 intlong 这儿的首字母变成了大写。那是由于,kotlin 中不再有根本变量类型,全面转变为目标数据类型。下面给出对应的表格

带你踏入kotlin大门(二)|基本功_变量篇

val 引证不行变

为什么 val 更准确的说法是 引证不行变 呢?

由于 val 的规划和 Java 中的 final 是一样的,不行变的是指引证的数据地址不行变,而非地址内的值不行变。如果这姿态说,你仍旧感到晦涩,能够检查下述的代码。

fun main() {
    val num = intArrayOf(1,2,3)
    num = intArrayOf(2,2,3)
}

带你踏入kotlin大门(二)|基本功_变量篇

上述代码中,咱们直接修正 val 类型的变量,给这个变量赋予新的数组。会呈现报错,告知咱们 val 类型不行重复赋值。但当咱们修正代码如下,会发现数组的内容是能够修正的。

fun main() {
    val num = intArrayOf(1,2,3)
//     num = intArrayOf(2,2,3)
	num[0] = 2
    println(num[0])
}

带你踏入kotlin大门(二)|基本功_变量篇

所以说,val 中不行变的是对变量的引证,而非变量本身的内容。

而呈现这种现象的根本原因是底层数据规划的问题

咱们知道,在 Java 中,final 润饰的根本数据类型是放在运行时常量池中,润饰的类信息是放在堆的办法区中,本质上他们都是放置于 堆内存 中。

相同的,val 的特性实现和 final 一样,它润饰的数组也是存储于 堆内存 中。所以也意味着只是引证不行改,但是引证的目标可改。

var 存在的含义

valkotlin 中默认推荐的润饰,我在这儿也推荐你,优先运用 val 来声明一个变量。为什么呢?由于 val 是引证不行变,运用这种润饰,会是你的编程好习惯,它能防止你的变量在不知情的情况下被别人修正,这也就能够防止很多不必要的bug。一起,也主张你在运用 Java的时候,默认给变量都加上 final

val 那么好,那为啥 var 还要存在呢?

var 是表示某个变量可变,咱们日常开发中,总会需求某个变量是可变的。否则,当咱们要使某个数递增的时候,会变得异常困难。这便是它存在的道理。

参阅

从内存视点理解static与final关键字 – 简书 (jianshu.com)

《kotlin中心编程》

《第一行代码》(第三版)