带你踏入Kotlin大门|Kotlin基本功——变量篇

前置知识

  • Java 编程基础

前言

前文为大家浅浅介绍了kotlin这一门语言,给大家讲述了 kotlin 这个新型基于 jvm 平台的语言的优势,以及我们 Android 开发者学习的必要性。话不多说,本篇正式开启 kotlin 的学习历程,带你正式踏入 kotlin 大门。

至于使用的编译工具,依旧是我们日常开发使用的 Android studio 或者 IDEA ,新建一个 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 中,类型声明是使用 : 这种类型来声明的,我们继续使用上述的demo。

//偏要声明
var stringValue:String = "abc"
var intValue:Int = 1
var longValue:Long = 1234

//无法类型推导,必须做类型声明
var stringValue:String
var intValue:Int
var longValue:Long

我们会发现 Java 中的 int 和 long 这里的首字母变成了大写。那是因为,kotlin 中不再有基本变量类型,全面转变为对象数据类型。下面给出对应的表格

val 引用不可变

为什么 val 更准确的说法是 引用不可变呢?
因为 val 的设计和 Java 中的 final 是一样的,不可变的是指引用的数据地址不可变,而非地址内的值不可变。如果这样子说,你依旧感到晦涩,可以查看下述的代码。

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

上述代码中,我们直接修改 val 类型的变量,给这个变量赋予新的数组。会出现报错,告知我们 val 类型不可重复赋值。但当我们修改代码如下,会发现数组的内容是可以修改的。

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

所以说,val 中不可变的是对变量的引用,而非变量本身的内容。
而出现这种现象的根本原因是底层数据设计的问题。

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

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

var 存在的意义

val 是 kotlin 中默认推荐的修饰,我在这里也推荐你,优先使用 val 来声明一个变量。为什么呢?因为 val 是引用不可变,使用这种修饰,会是你的编程好习惯,它能避免你的变量在不知情的情况下被别人修改,这也就可以避免很多不必要的bug。同时,也建议你在使用 Java的时候,默认给变量都加上 final 。

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

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

作者:Yj家的孺子牛
链接:https://juejin.cn/post/7151791231884853262
Kotlin入门教程指南,全家桶学习资料可扫描下方二维码获取!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kotlin中,单例模式是一种非常常见的设计模式,它确保一个只有一个实例,并提供全局访问该实例的方式。Kotlin中的单例模式可以使用对象声明来实现,这是一种非常方便的语法。但是,对象声明也有一些局限性,例如不能在运行时动态地创建对象。为了解决这个问题,可以使用参单例模式。 参单例模式是指在创建单例时,传递一些参数,以便在创建单例时使用。在Java中,可以使用静态方法或者静态变量来实现参单例模式。但是在Kotlin中,可以使用伴生对象来实现参单例模式。伴生对象是一个的对象,可以访问该的私有成员,并且可以实现接口。 下面是一个使用伴生对象实现参单例模式的例子: ```kotlin class Singleton private constructor(private val name: String) { init { println("Singleton initialized with name $name") } companion object { private var instance: Singleton? = null fun getInstance(name: String): Singleton { if (instance == null) { instance = Singleton(name) } return instance!! } } } ``` 在上面的例子中,Singleton的构造函数是私有的,只能在内部访问。而伴生对象中的getInstance方法是公共的,可以在任何地方调用。getInstance方法接收一个name参数,用于在创建Singleton实例时使用。如果实例不存在,则创建一个新的实例,并将其存储在instance变量中。如果实例已经存在,则直接返回该实例。 可以使用以下代码创建Singleton实例: ```kotlin val singleton1 = Singleton.getInstance("test1") val singleton2 = Singleton.getInstance("test2") ``` 在上面的代码中,将分别创建名为test1和test2的两个Singleton实例。由于使用的是参单例模式,因此可以为每个实例传递不同的参数。 参单例模式在某些情况下非常有用,例如创建具有不同配置参数的实例。然而,需要注意的是,参单例模式可能会导致一些问题,例如可能会导致内存泄漏或者线程安全问题。因此,在使用参单例模式时,需要仔细考虑其适用性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值