Kotlin变量高级用法揭秘(从基础到性能优化)

第一章:Kotlin变量基础概念与声明方式

在 Kotlin 中,变量是程序中最基本的存储单元,用于保存数据值。Kotlin 提供了两种变量声明关键字:`val` 和 `var`,它们分别代表不可变引用和可变引用。理解这两种声明方式的区别是掌握 Kotlin 编程的基础。

不可变变量与可变变量

  • val:声明一个只读变量(类似 Java 的 final),一旦赋值后不能更改。
  • var:声明一个可变变量,其值可以在后续代码中被重新赋值。
// 使用 val 声明不可变变量
val name: String = "Kotlin"
// name = "Java" // 编译错误:不能重新赋值

// 使用 var 声明可变变量
var age: Int = 25
age = 30 // 合法:允许重新赋值

类型推断

Kotlin 支持类型自动推断,开发者无需显式声明变量类型,编译器会根据初始值自动判断。
val language = "Kotlin" // 推断为 String 类型
var count = 10           // 推断为 Int 类型

变量声明语法结构

变量声明的基本语法如下:
val/var 变量名: 变量类型 = 初始值
其中,类型标注是可选的,若省略则依赖类型推断。

常见数据类型对照表

Kotlin 类型描述示例
Int整数类型42
String字符串类型"Hello"
Boolean布尔类型true / false
Double双精度浮点数3.14
合理选择变量声明方式有助于提升代码安全性与可读性,推荐优先使用 `val` 以支持函数式编程和线程安全设计。

第二章:可变与不可变变量的深度解析

2.1 val与var的本质区别与字节码分析

在Kotlin中,`val`和`var`分别代表不可变引用和可变引用。虽然两者在语法层面看似仅是赋值限制的不同,但从字节码层面能揭示其本质差异。
声明对比与语义含义
  • val:声明后不可重新赋值,对应Java中的final变量语义;
  • var:允许重复赋值,生成带getter和setter的属性。
Kotlin代码示例
val name = "Kotlin"
var age = 25
上述代码中,name被编译为私有字段加公有getter,而age生成完整的getter与setter方法。
字节码行为分析
通过javap反编译可见:
声明方式生成字段访问方法
valprivate finalpublic getter
varprivatepublic getter/setter
这表明val在JVM层面具备更强的不可变保障,直接影响内存可见性与线程安全设计。

2.2 不可变性在并发编程中的优势与实践

数据同步机制
不可变对象一旦创建,其状态无法更改,天然避免了多线程环境下的竞态条件。这消除了对锁的依赖,提升了系统吞吐量。
代码示例:Go 中的不可变结构体

type User struct {
    ID   int
    Name string
}

// NewUser 返回新的 User 实例,不修改原有数据
func NewUser(id int, name string) *User {
    return &User{ID: id, Name: name}
}
上述代码中,User 结构体通过构造函数返回新实例,确保状态不可变。多个 goroutine 可安全共享该实例,无需加锁。
优势对比
特性可变对象不可变对象
线程安全需显式同步天然安全
性能开销高(锁竞争)低

2.3 变量初始化时机与延迟赋值陷阱

在Go语言中,变量的初始化时机直接影响程序行为。若未正确理解初始化顺序,可能导致意料之外的零值使用或竞态条件。
常见初始化陷阱示例
var config *Config
func init() {
    go func() {
        config = loadConfig() // 延迟赋值
    }()
}
func GetConfig() *Config {
    return config // 可能返回nil
}
上述代码中,config在init阶段通过goroutine异步赋值,但主流程可能立即调用GetConfig(),此时config仍为nil,引发panic。
安全初始化策略对比
策略优点风险
同步初始化确定性高启动慢
延迟初始化(sync.Once)按需加载首次调用延迟

2.4 编译时常量与运行时变量的性能对比

在程序优化中,编译时常量相较于运行时变量具有显著性能优势。编译器可在构建阶段对常量进行求值、内联和消除冗余计算,从而减少运行时开销。
常量的编译期优化示例
const bufferSize = 1024
var dynamicSize int

func init() {
    dynamicSize = calculateSize()
}

func processData() {
    data := make([]byte, bufferSize) // 编译期已知大小
    temp := make([]byte, dynamicSize) // 运行时动态分配
}
上述代码中,bufferSize 为编译时常量,make 的长度在编译时确定,可直接嵌入指令;而 dynamicSize 需在运行时读取变量值并执行内存计算,引入额外开销。
性能差异对比
特性编译时常量运行时变量
内存分配时机编译期确定运行时决定
CPU指令优化支持常量折叠需动态加载

2.5 局部变量与字段的内存布局差异

在程序运行时,局部变量和类字段(成员变量)存储在不同的内存区域。局部变量通常分配在栈上,生命周期与其所在方法调用同步;而字段则随对象实例一起分配在堆上,其生存周期与对象一致。
内存位置与生命周期
  • 局部变量:定义在方法内部,存于栈帧中,方法执行结束即销毁
  • 实例字段:作为对象的一部分存储在堆中,对象被垃圾回收时才释放
  • 静态字段:归属于类,存储在方法区(或元空间),生命周期贯穿整个应用运行期
代码示例对比

public class MemoryLayout {
    private int instanceField = 10;     // 堆内存 - 实例字段
    private static int staticField = 20; // 方法区 - 静态字段

    public void method() {
        int localVar = 30;              // 栈内存 - 局部变量
    }
}
上述代码中,instanceField 随对象创建分配在堆中;staticField 存储于方法区,被所有实例共享;而 localVar 在方法调用时压入栈帧,方法退出后自动弹出。这种内存布局差异直接影响访问速度与线程安全性。

第三章:属性委托与幕后字段机制

3.1 委托属性原理与标准委托应用

委托属性是 Kotlin 提供的一种优雅的属性管理机制,它将属性的读写操作委托给另一个对象处理,从而实现逻辑复用和行为定制。
委托属性的基本结构
class Example {
    var prop: String by Delegate()
}
上述代码中,by 关键字将 prop 的访问逻辑委托给 Delegate 实例。该类需实现 getValue 和 setValue 操作符函数,分别用于处理读取与赋值行为。
常用标准委托
  • lazy:延迟初始化,首次访问时计算并缓存结果;
  • observable:监听属性变化,值修改时触发回调;
  • vetoable:可拦截赋值操作,基于条件决定是否接受新值。
实际应用场景
val config by lazy { loadConfig() }
此模式广泛用于资源密集型对象的初始化优化,确保仅在真正需要时才执行加载逻辑。

3.2 自定义委托实现灵活的变量行为

在 Kotlin 中,自定义委托允许我们将属性的读写操作委派给特定对象,从而实现更灵活的变量行为控制。
实现自定义委托
通过实现 getValue 和 setValue 操作符函数,可创建自定义委托类:
class ObservableDelegate(var value: String) {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        println("获取值:${property.name} = $value")
        return value
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, newValue: String) {
        println("设置值:${property.name} 从 $value -> $newValue")
        value = newValue
    }
}
上述代码中,getValue 在属性读取时触发,setValue 在赋值时执行。参数 thisRef 表示所属实例,property 提供属性元信息。
应用场景
  • 监听属性变化并触发回调
  • 延迟初始化或缓存计算结果
  • 实现单向数据流中的状态同步

3.3 幕后字段(backing field)的使用场景与限制

数据封装与验证控制
幕后字段常用于实现属性的封装,在获取或设置值时加入逻辑控制。例如在 C# 中,通过私有字段支持公共属性,确保数据有效性。

private string _name;
public string Name
{
    get { return _name; }
    set { _name = value?.Trim() ?? string.Empty; }
}
上述代码中,_name 是幕后字段,赋值时自动去除空格并防止 null 值,增强健壮性。
性能优化与延迟初始化
  • 避免重复计算:将复杂计算结果缓存至幕后字段
  • 延迟加载:首次访问时初始化,提升对象创建效率
使用限制
自动属性(如 public string Name { get; set; })由编译器隐式生成幕后字段,无法手动干预,因此不适合需要精细控制的场景。

第四章:变量性能优化与最佳实践

4.1 避免装箱:基本类型与内联类的选择

在性能敏感的场景中,频繁的装箱与拆箱操作会带来额外的内存开销和GC压力。Kotlin提供了内联类(inline class)来解决这一问题。
内联类的优势
内联类通过关键字 inline 修饰,将包装类型在编译期优化为底层基本类型,避免运行时对象创建。
inline class UserId(val value: Int)
fun process(id: UserId) = println(id.value)
上述代码中,UserId 在运行时被优化为 Int,不产生堆对象,从而消除装箱。参数 value 直接以原始类型传递,提升执行效率。
性能对比
类型是否装箱内存占用
Int否4字节
Integer (JVM)是对象开销 + 4字节
inline class Wrapper(Int)否4字节

4.2 lateinit与lazy的适用场景与开销分析

lateinit 的使用场景

lateinit 适用于非空类型且在初始化前能保证被赋值的场景,常见于依赖注入或配置对象。

class UserService {
    lateinit var database: Database

    fun init() {
        database = Database.connect()
    }
}

上述代码中,database 在 init() 调用后初始化,避免了可空类型的冗余检查。但若访问未初始化的 lateinit 变量会抛出异常。

lazy 的延迟初始化优势

lazy 实现线程安全的惰性求值,适合开销较大的对象初始化。

val userManager by lazy { UserManager() }

首次访问时才创建实例,后续调用直接返回缓存值。其内部通过同步锁确保多线程安全,适用于单例模式或资源密集型对象。

性能与内存开销对比
特性lateinitlazy
初始化时机运行时手动赋值首次访问
线程安全不保证默认保证
内存开销低中(持有委托对象)

4.3 变量作用域控制对GC的影响

变量的作用域直接影响其生命周期,进而决定垃圾回收器(GC)何时可以安全回收内存。当变量在局部作用域中声明时,一旦该作用域执行结束,变量将不再可达,GC便可将其标记为可回收。
作用域与对象存活周期
缩小变量作用域有助于提前释放引用,减少内存占用。例如,在函数内部创建的大对象若仅在某代码块内使用,应尽早结束其引用。

func processData() {
    var largeData *[]byte
    {
        data := make([]byte, 1024*1024) // 分配大内存
        largeData = &data
        // 使用 data
    }
    // largeData 指向的内存在此处已不可达
    runtime.GC() // 触发 GC,可能回收 largeData 所指内存
}
上述代码中,data 在内部作用域中创建,尽管通过指针被外部引用,但作用域结束后无其他引用指向它,GC 可识别其为垃圾。
最佳实践建议
  • 尽量在最小作用域内声明变量
  • 及时将不再使用的变量设为 nil
  • 避免在全局作用域中缓存短期对象

4.4 使用object与companion object的资源管理策略

在Kotlin中,`object`和`companion object`为单例模式和静态资源管理提供了原生支持。通过`object`声明,可确保全局唯一实例,适用于共享配置或连接池。
单例对象的资源控制
object DatabaseManager {
    private val connectionPool = mutableListOf<String>()
    
    init {
        // 初始化连接
        connectionPool.add("conn-1")
    }

    fun getConnection() = connectionPool.firstOrNull()
}
该代码定义了一个线程安全的单例对象,`init`块用于初始化资源,`private`字段防止外部直接访问,保证封装性。
伴生对象中的工厂方法
  • companion object可用于类内部的静态资源管理
  • 常用于定义工厂方法或缓存实例
  • 与类共享私有作用域,便于资源清理

第五章:Kotlin变量用法的未来趋势与总结

随着 Kotlin 在多平台开发中的持续演进,变量的声明与管理方式正朝着更安全、更简洁的方向发展。现代 Android 开发广泛采用 `val` 与 `var` 的语义区分,强调不可变性优先原则,减少副作用。
不可变变量的工程实践
在实际项目中,使用 `val` 替代可变变量能显著提升代码可读性与线程安全性。例如:

// 推荐:不可变引用
val userRepository = UserRepository()
val userData = userRepository.fetchUser(id)

// 避免过度使用 var
var currentUser: User? = null
currentUser = fetchUser() // 易引发空指针或状态混乱
属性委托的实际应用
`by lazy` 和 `Delegates.observable` 已成为大型项目中管理变量生命周期的核心手段。以下为配置热更新场景中的实现:

class ConfigManager {
    var threshold: Double by Delegates.observable(0.0) { _, old, new ->
        logger.info("Threshold updated from $old to $new")
        onConfigChanged()
    }
}
数据绑定与视图模型集成
在 Jetpack Compose 中,`mutableStateOf` 结合 `var` 实现响应式变量更新,是 UI 状态管理的关键:
  • 使用 mutableStateOf(true) 创建可观察状态
  • 通过 by mutableStateOf() 简化语法
  • 避免在 ViewModel 外直接暴露可变状态
变量类型适用场景性能影响
val + immutable data配置对象、单例服务低内存开销,线程安全
var + delegate动态配置、监听属性引入回调开销
MutableStateUI 状态驱动触发重组,需优化
移动开发中 Kotlin 的性能优化 当你在应用商店看到“流畅度9.8分”的竞品时,是否好奇他们的工程师做了什么?当用户反馈“滑动列表卡成PPT”时,你是否对着Kotlin代码无从下手?本文聚焦Kotlin语言特性对Android性能的影响,覆盖内存分配、函数调用、线程管理三大核心场景,帮你从“写代码”进阶到“写高性能代码”。本文采用“问题-原理-方案-实战”的递进结构:先用“厨房做饭”的故事引出性能问题;再拆解Kotlin特性的性能影响;接着给出具体优化技巧;最后通过完整案例演示如何用工具定位并解决问题。扩展函数。 阅读详情

相关推荐

【Unity3D渲染】Unity3d实现Photoshop的各种图层混合模式

Adobe Photoshop图层混合原理、Unity ShaderLab图层混合实现

a310989583的专栏 2436

Kotlin基础——静态方法、静态属性和单例

在Kotlin中,单例的书写方式相较于Java就简单了许多。只需在声明类是,将class换做object即可,注意,o为小写。在使用了object来修饰类后,这个类中的所有方法和属性就都为静态的了,可以在其他地方通过类名来调用出来。通过反编译为Java代码可以开出,这个单例的模式为饿汉式。

qq_41817384的博客 881

【分布式系统学习】CAP原理详解

概述:互联网最重要任务莫过于海量数据处理,即大规模分布式系统,分布式是互联网的核心技术!!!如上所述,分布式系统是无法同时满足CAP三个特性的。1.Atomicity(原子性)一个事务中的所有操作,要么全部完成,要么全部不完成,不会在中间某个环节结束。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。2.Consistency(一致性)在事务开始之前和事务结束以后,数据库的完整性没有被破坏。3.Isolation(隔离性)

大龄烤红薯的博客 5024

Kotlin基础学习

Kotlin基础学习主要涵盖安装Kotlin编译器、了解基础语法、学习变量声明、类型推断、函数定义以及控制结构等方面。

编程小弟的博客 1643

PMSM无感foc控制(滑模-反正切-PLL)【仿真模型搭建教程】(附模型)

本文主要目的是教大家如何把文献中的公式转换成仿真模型。 首先介绍滑模控制的原理及如何搭建simulink模型。 1.1基于反电势估计位置原理 永磁同步电机在静止坐标系αβ下的电压方程: 扩展反电动势包含转子位置信息,并且αβ轴下扩展反电动势的反正切函数正好就等于位置角theta。 1.2 滑模控制原理(比较重要的点是以电机电流模型推导展开) 通过滑模观测得到鲁棒性比较高的αβ轴下扩展反电动势,并求其反正切函数,得到位置信息。 /*********************...

weixin_44769876的博客 1万+

陀螺仪选型避坑指南:为什么IMU660RA是智能车竞赛的性价比之选?

本文针对智能车竞赛场景,提供陀螺仪选型避坑指南,并深度解析为何IMU660RA成为性价比之选。文章指出,竞赛选型应避免盲目追求高性能“黑盒”模块,而应注重原始数据获取与算法开发。IMU660RA以其良好的常温稳定性、适中的噪声水平、极致的性价比和丰富的生态支持,成为帮助参赛者深入理解姿态解算原理、进行“白盒开发”的理想教学与实践平台。

tech5的博客 882

kotlin之变量

kotlin只允许在变量前面声明两种关键字:val或者var val:(value的简写)用来声明一种值,这种值在赋值之后不可改变,对应Java中的final(这不是常量吗…) var:(variable的简写),声明变量 类型推导机制 既然在变量前只允许声明两种关键字,那么他怎么知道这是什么类型呢? 比如我们在刚刚的代码上加入一行:var a = 10 package com.example.test fun main() { var a = 1 print("hello world!

非猿 751

Xilinx System Generator多速率系统(Multi-Rate Systems)的使用

在本实验练习中,您将学习在System Generator中如何使用多个时钟域有效地实现具有多个数据速率的设计。

白码王子小张的博客 1093

Kotlin 内存管理与性能优化:避免内存泄漏的策略

在 Kotlin 应用开发中,了解内存管理机制,识别常见的内存泄漏场景,并采取有效的避免策略,是打造高性能应用的关键。通过合理使用引用类型、正确处理内部类和匿名类、及时关闭资源、移除监听器和回调,以及借助性能优化工具,开发者可以有效地避免内存泄漏,提升应用的性能和稳定性,为用户提供更好的使用体验。随着 Kotlin 语言的不断发展和应用场景的不断拓展,持续关注内存管理和性能优化技术,将有助于开发者跟上技术发展的步伐,开发出更优质的应用。

数字魔方操控师的博客 1258

系统分析师论文范文(三)微服务

摘要(300字) 2024年4月,我作为系统分析师参与某省三甲医院云影像系统建设项目,负责系统分析与设计工作。该项目旨在响应国家"无胶片化"医疗政策,解决传统影像系统数据孤岛、调阅效率低等问题。系统基于DICOM 3.0和HL7国际标准,采用B/S架构与Spring Cloud Alibaba微服务技术栈,包含影像采集、智能分析、数据安全等核心模块,实现全院影像资源的云端统一管理与多端调阅。在架构设计上,通过微服务拆分、分布式事务控制及多层次安全防护机制,保障了系统的高可用性与数据一致性。系统于2024年1

echo的博客 221

Vulkan入门系列3 - 绘制三角形代码解析(全)

【代码】Vulkan入门系列3 - 绘制三角形完整代码(带详细注释)

GPU全栈博主 1034

【Android开发进阶必看】:Kotlin数据绑定的7种高级用法

掌握Kotlin数据绑定实践的高级技巧,提升Android开发效率。涵盖视图绑定、双向绑定、LiveData集成等7种实用场景,解决UI更新难题,实现更简洁的代码结构。关键优势包括类型安全、性能优化与可维护性,进阶开发值得收藏。

simcode的专栏 929

TC3XX - MCAL知识点(三):MCU EB-tresos配置说明及代码浅析

AURIX 2G Tc3xx的配置相较AURIX 1G Tc2xx来讲简化了许多,但是依赖于数据手册的理解来讲整个MCU功能做了较大增强,此处先简单的介绍一下,本文前期先补充介绍一下英飞凌手册的阅读规则,因为后面的文章会基于此文的一些缩写进行截图寄存器之类的。MCU在AUTOSAR架构里面的图示如下MCU驱动程序负责配置SCU、GTM、CCU6、GPT12和STM外设。驱动程序提供由AUTOSAR指定的运行时服务。

梦想技术家 2875

kotlin的val声明的变量是常量吗

比如在Java中,常量通常指的是用final关键字修饰的静态变量,并且需要在编译时就能确定其值,即编译时常量。而Kotlin中的val虽然也是不可变的,但它的值并不一定是在编译时确定的。const关键字修饰的val才是编译时常量,必须声明在顶层或者伴生对象中,并且其值必须是基本类型或者String。例如,val适合用于在对象生命周期内不可变的变量,而const val则用于全局的、编译时确定的常量。需要说明val的不可变性是运行时的保证,而并非编译时的强制,除非使用const val。

yzpbright的博客 685

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Kotlin 变量声明与类型推断源码级(1)

Kotlin中`val`和`var`关键字分别对应不可变变量与可变变量,这种设计直接体现在字节码层面。在编译器前端处理阶段,`val`声明的变量会被标记为`final`修饰符(对应Java字节码语义),而`var`则保持普通成员变量属性。

Android开发领域创作者 803

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Kotlin在Android性能优化中的实践

通过利用Kotlin的Null安全特性、扩展函数、协程、Lambda表达式以及代码简化特性,我们可以简化代码结构、减少冗余和复杂性,提高代码的执行效率和应用的整体性能。然而,需要注意的是,性能优化是一个综合性的过程,除了编程语言的选择和使用外,还需要综合考虑应用的设计、架构、算法等多个方面。此外,Kotlin还支持属性访问的简化写法,使得我们可以更加直接地访问对象的属性,减少了冗余的getter和setter方法的调用。通过减少回调逻辑的复杂性,我们可以提高代码的执行效率,减少潜在的性能瓶颈。

JessicaAustin的博客 993

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Kotlin在Android开发中的性能优化技巧是什么?

Kotlin在Android开发中的性能优化是一个综合性的过程,涉及到多个方面的技巧和策略。通过了解Kotlin的性能特点、避免不必要的对象创建、合理使用协程和线程、优化数据结构和算法、减少资源消耗以及利用Kotlin的编译时特性,我们可以有效地提升应用的性能,为用户提供更好的体验。在实际开发中,我们应该根据具体需求和场景选择合适的优化手段,并持续关注和监控应用的性能表现,以便及时调整和优化。随着Kotlin在Android开发中的普及,越来越多的开发者开始关注如何在Kotlin中优化应用的性能。

AntonioMargery的博客 1092

【Kotlin程序员节特辑】:20年架构师揭秘Kotlin性能优化的5大核心技巧

在kotlin程序员节之际,资深架构师分享Kotlin性能优化的5大核心技巧,涵盖启动加速、内存管理与并发处理等实战场景。通过协程优化、单例懒加载等方法显著提升应用响应速度与稳定性,助力开发者高效编码,值得收藏。

QuickDebug的博客 912

Kotlin性能优化实战(内存泄漏与GC频繁触发大揭秘)

解决Kotlin应用卡顿与内存问题,本文深入探讨Kotlin性能优化实践,涵盖内存泄漏排查、GC频繁触发根源分析及优化策略,适用于Android开发场景。通过弱引用、对象复用等核心方法提升应用流畅度,值得收藏。

CodePulse的博客 765

Kotlin 之 const

变量和常量 在kotlin语法中,修饰符var用来修饰可变变量,val修饰只读变量。关于val的只读属性而不是不可变属性,可以参考:val的只读属性 但是Kotlin同时又提供了一个const修饰符。在开发过程中,如果我们在伴生对象中定义了一个val类型的变量,那么Android Studio会智能的提示开发者需要使用const来修饰该变量。 const的特点 const只能修饰val,不能...

Android小菜比的博客 3841

【Kotlin Android开发性能优化终极指南】:揭秘1024个你不知道的高效技巧

掌握Kotlin Android开发性能优化技巧,系统揭秘1024个高效提升应用流畅度与响应速度的实战方法,涵盖内存管理、启动加速、UI渲染优化等关键场景。助你打造极致性能App,值得收藏。

SimTrans的博客 1121

【Kotlin性能优化终极指南】:揭秘JVM调优背后的5大核心技巧

掌握Kotlin性能优化实践,显著提升JVM应用运行效率。本文揭秘编译优化、协程调度、内存管理等5大核心技巧,适用于高并发与大型项目开发。降低延迟、减少资源消耗,打造高效稳定系统,值得收藏。

InstrIsle的博客 338

终极指南:10个Kotlin集合groupBy性能优化技巧

Kotlin作为一种在Java虚拟机上运行的静态类型编程语言,以其简洁的语法和强大的功能深受开发者喜爱。在Kotlin中,`groupBy`函数是处理集合数据分组的常用工具,但在处理大量数据时,其性能表现至关重要。本文将分享10个实用的Kotlin集合`groupBy`性能优化技巧,帮助你编写更高效的代码。 ## 1. 选择合适的键选择器函数 `groupBy`函数的核心是键选择器函数,选择高

gitblog_00823的博客 816

Android:关于Kotlin的入门语法指南(类、变量 & 函数)都总结在这里了!

今天,carson将主要详细讲解Kotlin的所有基本语法

Carson带你学Android 2687

Android-Kotlin-When&类型推断

6 -> “六”else -> {“” + textContent.length}}return result}}main测试方法:package cn.kotlin.kotlin_base02fun main(args: Array) {var textEngine = TextEngine(“皇后工天下”)println(textEngine.getDoTextAction())var textEngine2 = TextEngine(“风云帝王”)println(textEngine2.getDoTe

2401_84003809的博客 917
上一篇: Swift视频处理实战(从入门到精通):十大必备技术栈全公开
下一篇: 你真的懂Kotlin密封类吗?:3分钟彻底搞清它的设计精髓
BytePulse
博客等级 码龄1年 163粉丝 2177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值