2.Android Compose 基础系列:在 Kotlin 中创建和使用变量
<p>在应用开发中,有些内容是固定的,例如“设置”中的菜单项;而有些内容会不断变化,比如新闻应用中的标题、来源或发布时间。为了让这些变化自动更新,而不是每次都修改代码,我们需要使用 <strong>变量(variable)</strong>。</p><h2 id="-学习目标">🎯 学习目标</h2>
<ul>
<li>了解什么是变量,并学会定义和更新变量</li>
<li>掌握如何为变量选择合适的数据类型</li>
<li>学会在代码中添加注释,提升可读性</li>
<li></li>
</ul>
<hr>
<h2 id="什么是变量">什么是变量</h2>
<p>在编程中,变量就像一个带标签的盒子,用来存放某个数据值。</p>
<ul>
<li><strong>标签(变量名)</strong>:告诉我们盒子里装的是什么</li>
<li><strong>盒子里的值</strong>:就是存放的数据</li>
</ul>
<p>举个例子:</p>
<ul>
<li>盒子外写着 <code>name</code>(表示名字)</li>
<li>盒子里放着 <code>"Alex"</code>(表示名字的值)</li>
</ul>
<p>当你想修改名字时,只需替换盒子里的值,而不必修改整个程序。</p>
<h2 id="为什么需要变量">为什么需要变量</h2>
<p>如果在代码中直接写死所有值,程序只能应对特定情况。<br>
使用变量就像写信时使用模板,只需替换不同内容即可应对多种情况:</p>
<pre><code class="language-kotlin">尊敬的 { name }:
您好!很高兴今天能在 { location } 与您会晤。希望 { date } 还能见到您。
祝您天天好心情!
</code></pre>
<p>同样地,在应用中,你可以用变量来代替变化的数据:</p>
<ul>
<li>👤 用户名:<code>name</code></li>
<li>📍 地点:<code>location</code></li>
<li>⏰ 时间:<code>date</code></li>
</ul>
<p>这样,应用就能根据不同用户或场景自动生成对应内容,而不需要每次都重新编写逻辑。</p>
<h2 id="kotlin-常见数据类型">📊Kotlin 常见数据类型</h2>
<p>在定义变量时,需要指定变量能存储的数据类型。Kotlin 提供了丰富的基本类型:</p>
<table>
<thead>
<tr>
<th style="text-align: left">类型分类</th>
<th style="text-align: left">数据类型</th>
<th style="text-align: left">示例值</th>
<th style="text-align: left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left"><strong>整数类型 (整型)</strong></td>
<td style="text-align: left"><code>Byte</code></td>
<td style="text-align: left"><code>127</code></td>
<td style="text-align: left">8位有符号整数(范围:-128 ~ 127)</td>
</tr>
<tr>
<td style="text-align: left"></td>
<td style="text-align: left"><code>Short</code></td>
<td style="text-align: left"><code>32767</code></td>
<td style="text-align: left">16位有符号整数(范围:-32768 ~ 32767)</td>
</tr>
<tr>
<td style="text-align: left"></td>
<td style="text-align: left"><code>Int</code></td>
<td style="text-align: left"><code>2147483647</code></td>
<td style="text-align: left">32位有符号整数(范围:-2³¹ ~ 2³¹-1)</td>
</tr>
<tr>
<td style="text-align: left"></td>
<td style="text-align: left"><code>Long</code></td>
<td style="text-align: left"><code>9223372036854775807L</code></td>
<td style="text-align: left">64位有符号整数(需以 <code>L</code> 结尾)</td>
</tr>
<tr>
<td style="text-align: left"><strong>浮点类型</strong></td>
<td style="text-align: left"><code>Float</code></td>
<td style="text-align: left"><code>3.14f</code></td>
<td style="text-align: left">32位单精度浮点数(需以 <code>f</code> 结尾)</td>
</tr>
<tr>
<td style="text-align: left"></td>
<td style="text-align: left"><code>Double</code></td>
<td style="text-align: left"><code>3.1415926</code></td>
<td style="text-align: left">64位双精度浮点数(默认浮点类型)</td>
</tr>
<tr>
<td style="text-align: left"><strong>字符类型</strong></td>
<td style="text-align: left"><code>Char</code></td>
<td style="text-align: left"><code>'A'</code></td>
<td style="text-align: left">单个字符,使用单引号包裹</td>
</tr>
<tr>
<td style="text-align: left"><strong>布尔类型</strong></td>
<td style="text-align: left"><code>Boolean</code></td>
<td style="text-align: left"><code>true</code> / <code>false</code></td>
<td style="text-align: left">逻辑真值类型</td>
</tr>
<tr>
<td style="text-align: left"><strong>字符串类型</strong></td>
<td style="text-align: left"><code>String</code></td>
<td style="text-align: left"><code>"Hello"</code></td>
<td style="text-align: left">字符序列,可用 <code>"""</code> 创建多行字符串</td>
</tr>
<tr>
<td style="text-align: left"><strong>数组类型</strong></td>
<td style="text-align: left"><code>Array</code></td>
<td style="text-align: left"><code>arrayOf(1, 2, 3)</code></td>
<td style="text-align: left">可存储任意类型的元素</td>
</tr>
<tr>
<td style="text-align: left"><strong>集合类型</strong></td>
<td style="text-align: left"><code>List</code></td>
<td style="text-align: left"><code>listOf("A", "B")</code></td>
<td style="text-align: left">不可变列表</td>
</tr>
<tr>
<td style="text-align: left"></td>
<td style="text-align: left"><code>MutableList</code></td>
<td style="text-align: left"><code>mutableListOf(1, 2, 3)</code></td>
<td style="text-align: left">可变列表</td>
</tr>
<tr>
<td style="text-align: left"></td>
<td style="text-align: left"><code>Set</code></td>
<td style="text-align: left"><code>setOf("A", "B")</code></td>
<td style="text-align: left">不可变集合(自动去重)</td>
</tr>
<tr>
<td style="text-align: left"></td>
<td style="text-align: left"><code>MutableSet</code></td>
<td style="text-align: left"><code>mutableSetOf("A", "B")</code></td>
<td style="text-align: left">可变集合</td>
</tr>
<tr>
<td style="text-align: left"></td>
<td style="text-align: left"><code>Map</code></td>
<td style="text-align: left"><code>mapOf("key" to "value")</code></td>
<td style="text-align: left">不可变键值对集合</td>
</tr>
<tr>
<td style="text-align: left"></td>
<td style="text-align: left"><code>MutableMap</code></td>
<td style="text-align: left"><code>mutableMapOf("k" to "v")</code></td>
<td style="text-align: left">可变键值对集合</td>
</tr>
<tr>
<td style="text-align: left"><strong>空类型</strong></td>
<td style="text-align: left"><code>Any</code></td>
<td style="text-align: left">任意类型值</td>
<td style="text-align: left">Kotlin 所有类的超类</td>
</tr>
<tr>
<td style="text-align: left"></td>
<td style="text-align: left"><code>Unit</code></td>
<td style="text-align: left"><code>Unit</code></td>
<td style="text-align: left">表示无返回值(相当于 Java 的 <code>void</code>)</td>
</tr>
<tr>
<td style="text-align: left"></td>
<td style="text-align: left"><code>Nothing</code></td>
<td style="text-align: left">-</td>
<td style="text-align: left">表示不会返回(如抛异常的函数)</td>
</tr>
<tr>
<td style="text-align: left"><strong>可空类型</strong></td>
<td style="text-align: left"><code>String?</code>, <code>Int?</code> 等</td>
<td style="text-align: left"><code>null</code></td>
<td style="text-align: left">允许存储 <code>null</code> 值的类型</td>
</tr>
</tbody>
</table>
<h2 id="-变量类型实际使用示例">🎯 变量类型实际使用示例</h2>
<h3 id="地图应用">地图应用</h3>
<ul>
<li>📍 地点名称:<code>String</code></li>
<li>⭐ 星级评分:<code>Double</code></li>
<li>💬 评论数量:<code>Int</code></li>
<li>❤️ 是否收藏:<code>Boolean</code></li>
</ul>
<h3 id="视频应用">视频应用</h3>
<ul>
<li>🎬 视频标题:<code>String</code></li>
<li>📺 频道名称:<code>String</code></li>
<li>👀 播放次数:<code>Int</code></li>
</ul>
<h2 id="-定义变量">🧩 定义变量</h2>
<p>定义变量的语法如下:</p>
<pre><code class="language-kotlin">val 变量名: 数据类型 = 初始值
</code></pre>
<p><img src="https://i-blog.csdnimg.cn/direct/a46e7f9946c8413fb96abf8108e4d165.png"></p>
<p>示例:</p>
<pre><code class="language-kotlin">fun main() {
val count: Int = 2
println(count)
}
</code></pre>
<p>输出结果:</p>
<pre><code class="language-kotlin">2
</code></pre>
<blockquote>
<p><strong>提示:</strong></p>
<p>val 表示不可变变量(定义后不能修改值)</p>
<p>var 表示可变变量(定义后可重新赋值)</p>
</blockquote>
<h2 id="类型推断">类型推断</h2>
<p>如果 Kotlin 能根据初始值判断类型,则可以省略类型声明:</p>
<pre><code class="language-kotlin">val count = 2 // 自动推断为 Int
</code></pre>
<p>若未赋初始值,必须明确指定类型:</p>
<pre><code class="language-kotlin">val count: Int //但直接这样写,会报错,要用后面讲解的其他只是修复
</code></pre>
<h2 id="使用变量与字符串模板">使用变量与字符串模板</h2>
<p>要在字符串中插入变量值,可使用 字符串模板:</p>
<pre><code class="language-kotlin">fun main() {
val count = 10
println("You have $count unread messages.")
}
</code></pre>
<p>输出:</p>
<pre><code class="language-kotlin">You have 10 unread messages.
</code></pre>
<p>${} 可在字符串中放入表达式,例如:</p>
<pre><code class="language-kotlin">println("Total: ${5 + 3}")
</code></pre>
<h2 id="基本数学运算">基本数学运算</h2>
<p>整数变量可以直接参与运算,例如加减乘除:</p>
<pre><code class="language-kotlin">fun main() {
val unreadCount = 5
val readCount = 100
println("You have ${unreadCount + readCount} total messages.")
}
</code></pre>
<p>输出:</p>
<pre><code class="language-kotlin">You have 105 total messages.
</code></pre>
<h2 id="4-更新变量">4. 更新变量</h2>
<p>在应用程序运行时,可能需要更新变量的值。例如购物车总金额会随用户操作而变化。</p>
<h3 id="val-与-var">val 与 var</h3>
<ul>
<li><code>val</code>:只读变量,值不可更改。</li>
<li><code>var</code>:可变变量,值可更新。</li>
</ul>
<p>示例:</p>
<pre><code class="language-kotlin">fun main() {
var cartTotal = 0 // 声明可变变量
println("Total: $cartTotal")
cartTotal = 20 // 更新变量值
println("Total: $cartTotal")
}
</code></pre>
<p>输出:</p>
<pre><code class="language-kotlin">Total: 0
Total: 20
</code></pre>
<h2 id="增量运算符和减量运算符">增量运算符和减量运算符</h2>
<p>可以使用表达式更新变量,例如增加或减少值:</p>
<pre><code class="language-kotlin">fun main() {
var count = 10
println("You have $count unread messages.")
count = count + 1 // 增加 1
println("You have $count unread messages.")
count++ // 使用增量运算符,等同于 count = count + 1
println("You have $count unread messages.")
count-- // 使用减量运算符,等同于 count = count - 1
println("You have $count unread messages.")
}
</code></pre>
<pre><code class="language-kotlin">You have 10 unread messages.
You have 11 unread messages.
You have 12 unread messages.
You have 11 unread messages.
</code></pre>
<blockquote>
<p>提示:只有在变量值会发生变化时使用 var,否则优先使用 val 以保证代码安全。</p>
</blockquote>
<h2 id="其他数据类型">其他数据类型</h2>
<h3 id="double">Double</h3>
<p>用于存储小数,精度比 Float 高。</p>
<p>示例:</p>
<pre><code class="language-kotlin">fun main() {
val trip1 = 3.20
val trip2 = 4.10
val trip3 = 1.72
val totalTripLength = trip1 + trip2 + trip3
println("$totalTripLength miles left to destination")
}
</code></pre>
<p>输出:</p>
<pre><code class="language-kotlin">9.02 miles left to destination
</code></pre>
<h3 id="string">String</h3>
<p>用于存储文本,用双引号包裹。可通过 + 进行字符串拼接。</p>
<pre><code class="language-kotlin">fun main() {
val nextMeeting = "Next meeting: "
val date = "January 1"
val reminder = nextMeeting + date + " at work"
println(reminder)
}
</code></pre>
<p>输出:</p>
<pre><code class="language-kotlin">Next meeting: January 1 at work
</code></pre>
<p>字符串中使用引号需要转义:</p>
<pre><code class="language-kotlin">fun main() {
println("Say \"hello\"")
}
</code></pre>
<p>输出:</p>
<pre><code class="language-kotlin">Say "hello"
</code></pre>
<h3 id="boolean">Boolean</h3>
<p>只有两个可能值:true 或 false。常用于表示开关状态或条件判断。</p>
<pre><code class="language-kotlin">fun main() {
val notificationsEnabled = false
println(notificationsEnabled)
println("Are notifications enabled? " + notificationsEnabled)
}
</code></pre>
<p>输出:</p>
<pre><code class="language-kotlin">false
Are notifications enabled? false
</code></pre>
<h2 id="编码规范">编码规范</h2>
<p>在 Kotlin 中,建议遵循以下编码规范,这是 Google 推荐使用并且其他专业开发者也在遵循的一种 Android 代码统一编写方式:</p>
<ol>
<li><strong>变量命名</strong>
<ul>
<li>使用 <strong>驼峰命名法</strong>(camelCase),以小写字母开头。</li>
</ul>
</li>
</ol>
<pre><code class="language-kotlin">val discount: Double = 0.20
</code></pre>
<ol start="2">
<li><strong>类型声明空格</strong></li>
</ol>
<p>冒号后添加一个空格。</p>
<pre><code class="language-kotlin">val discount: Double = 0.20
</code></pre>
<ol start="3">
<li><strong>运算符空格</strong></li>
</ol>
<ul>
<li>
<p>赋值运算符 =</p>
</li>
<li>
<p>加号 +、减号 -、乘号 *、除号 / 前后都应有空格。</p>
</li>
</ul>
<pre><code class="language-kotlin">var pet = "Dog"
val sum = 1 + 2
</code></pre>
<ol start="4">
<li>行长度</li>
</ol>
<p>每行代码建议不超过 100 个字符,方便阅读和维护。</p>
<h2 id="在代码中添加注释">在代码中添加注释</h2>
<p>编写代码时,建议使用注释说明代码用途,帮助读者理解。</p>
<h3 id="单行注释">单行注释</h3>
<p>使用 <code>//</code>,通常在符号后添加一个空格:</p>
<pre><code class="language-kotlin">// 这是一个注释
height = 1 // 假设初始高度为 1
</code></pre>
<h3 id="多行注释">多行注释</h3>
<p>使用 /* ... */,适合超过 100 个字符的长注释:</p>
<pre><code class="language-kotlin">/*
* 这是一个很长的注释
* 可以占用多行,只需要开始和结束,中间的*是为了好看写的
*/
</code></pre>
<h3 id="示例单行注释与多行注释结合">示例:单行注释与多行注释结合</h3>
<pre><code class="language-kotlin">/*
* 该程序显示用户收件箱中的消息数量
*/
fun main() {
// 创建一个变量表示未读消息数量
var count = 10
println("You have $count unread messages.")
// 将消息数量减少 1
count--
println("You have $count unread messages.")
}
</code></pre>
<blockquote>
<p>💡 提示:在常见的编辑器中输入注释时,IDE 会提供自动提示和快捷键支持,帮助你快速书写注释。注释里面的*不需要手动写完,编辑器会自动生成,后面章节会详细讲解。现在主要是让大家了解注释的作用。</p>
</blockquote>
<h2 id="总结">总结</h2>
<p>做得很好!您已经了解了 Kotlin 中的变量及其用途,掌握了如何创建、更新和使用变量,尝试了不同的基本数据类型(Int、Double、String、Boolean),并了解了 <code>val</code> 与 <code>var</code> 的区别。</p>
<h2 id="核心要点">核心要点</h2>
<ul>
<li>变量是存储单项数据的容器。</li>
<li>必须先声明变量,才能使用。</li>
<li><code>val</code> 用于定义只读变量,一旦赋值不可更改。</li>
<li><code>var</code> 用于定义可变变量,可以更新值。</li>
<li>Kotlin 中建议尽可能使用 <code>val</code>。</li>
<li>变量声明示例:<code>val count: Int = 2</code></li>
<li>类型推断:提供初始值时可省略数据类型。</li>
<li>常见基本类型:Int、Double、String、Boolean、Float。</li>
<li>更新变量使用赋值运算符 =</li>
<li>只有 var 声明的变量才能被更新。</li>
<li>增量运算符 ++ 用于加 1,减量运算符 -- 用于减 1。</li>
<li>可用于字符串拼接,也可将其他类型(如 Int、Boolean)拼接到字符串。</li>
</ul>
<h2 id="-引用与版权说明">📖 引用与版权说明</h2>
<ul>
<li>本文内容部分参考自 Kotlin 官方文档 及 Android Developers 官方指南,并结合作者的实战经验进行讲解与整理。</li>
<li>文中图片(如代码结构示意图)来源于官方图床或官方文档示例,仅用于教学与学习目的。</li>
<li>代码示例均为原创或根据官方示例改写,遵循 Apache License 2.0 协议。</li>
<li>若涉及版权问题或引用不当,请联系作者进行处理。</li>
</ul><br><br>
来源:https://www.cnblogs.com/woblog/p/19127494
頁:
[1]