新手学Kotlin方法声明这块最容易迷糊。

我带过几百个学员,90%的人第一周都在这踩坑。

别怕,今天我用最直白的代码带你把这块啃下来。

先给你一个能跑的最小例子,看看Kotlin 方法长啥样。

运行的环境是,IntelliJ IDEA 以及 Kotlin 1.9.0 版本,去新建一个 Main.kt 这样的文件,然后直接进行运行。

// 新手最简版:一个普通类里的方法
class Dog {
// fun 是方法关键字,bark 是方法名,括号里没参数,冒号后面 Unit 表示没返回值
fun bark(): Unit {
println("汪汪汪")
}
}
fun main() {
// Kotlin 没有 new,直接类名括号创建对象
val dog = Dog()
dog.bark()  // 输出:汪汪汪
}

看明白没?

fun声明方法,冒号后面写返回值类型。

fun test(s: String, i: Int): Unit

Unit就是 Java 的void,不写也行。

我所带领过的学员当中有个小张,最初的时候老是把 Unit 写成 unit,单单大小写敏感这一情况就坑害了数目众多的人。

普通类方法:必须 new 对象才能调用

这是最常用的场景。

普通类方法不能直接类名点出来,必须先创建实例。

// 企业级优化版:带参数和返回值,加异常处理
class Calculator {
/
计算两个数的除法
@param a 被除数
@param b 除数,不能为 0
@return 除法结果,如果除数为 0 返回 null
/
fun divide(a: Double, b: Double): Double? {
return try {
if (b == 0.0) {
println("警告:除数不能为 0")
return null
}
a / b
} catch (e: Exception) {
println("计算异常:${e.message}")
null
}
}
}
fun main() {
val calc = Calculator()
val result = calc.divide(10.0, 2.0)
println("结果是:$result")  // 输出:结果是:5.0
// 踩坑案例:传 0 会返回 null,不判空直接使用会报错
val errorResult = calc.divide(5.0, 0.0)
// 新手常犯错误:println("结果乘 2:" + errorResult  2)  // 报错!
errorResult 是 null
// 正确做法:用安全调用
println("结果乘 2:${errorResult?.times(2)}")  // 输出:结果乘 2:null
}

class Person(){
    fun eat(){ 
    }
}

李华这位学员曾犯过一个经典类型的错误,此错误为在普通类的方法之前添加 static 这样的修饰,要知道 Kotlin 根本就不存在这样的关键字!

记住,普通类里所有方法都不是静态的

静态类(object):工具类的首选

Person().eat()  //实例对象的构建使用在类名后加()

想写工具类?

kotlin 方法参数使用 _Kotlin 从入门到精通 _kotlin 方法声明

利用 object 来声明静态类,致使所有方法会自动转变为静态,进而能够直接通过类名进行调用。

// 静态工具类:字符串处理
object StringUtil {
// 判断字符串是否为空或空白
fun isBlank(str: String?): Boolean {
return str == null || str.trim().isEmpty()
}
// 安全截取字符串
fun safeSubstring(str: String?, start: Int, end: Int): String {
if (isBlank(str)) return ""
val safeStart = start.coerceAtLeast(0)
val safeEnd = end.coerceAtMost(str!!.length)
return if (safeStart < safeEnd) str.substring(safeStart, safeEnd) else ""
}
}
fun main() {
// 直接类名点方法,不用 new
println(StringUtil.isBlank("   "))   // 输出:true
println(StringUtil.safeSubstring("Hello Kotlin", 0, 5))  // 输出:Hello
// 学员踩坑:object 类里不能用 this 引用外部变量
// object 类本身就是单例,this 指向自己
}

object NumUtil {
    fun double(num: Int): Int{
        return num*2
    }
}

object声明后就是单例,性能比普通类好

我存在着一名学员,其进行 Android 项目的操作,将整个网络请求工具类撰写成 object,启动的速度显著地得到了提升。

伴生对象(companion object):普通类里的“静态”

NumUtil.double(1)

在 Kotlin 这个编程语言里面,它是不存在 static 这种东西的,而是要采用 companion object 来进行替代

想在普通类里加静态方法?

就用它。

// 带伴生对象的普通类
class User(private val name: String) {
// 伴生对象里的方法像静态方法
companion object Factory {
// 静态工厂方法,不用 new User 就能创建
fun createDefault(): User {
return User("默认用户")
}
// 静态常量
const val DEFAULT_AGE = 18
}
fun introduce() {
println("我是$name")
}
}
fun main() {
// 通过类名直接调用伴生对象方法
val defaultUser = User.createDefault()
defaultUser.introduce()  // 输出:我是默认用户
println(User.DEFAULT_AGE)  // 输出:18
// 学员踩坑:伴生对象名字可以省略,默认叫 Companion
// 但省略后代码可读性变差,建议明确命名
val anotherUser = User.Companion.createDefault()  // 也能调用,但不推荐
}

class Person {
 companion object{
  fun test(){
  }
 }
}
Person.test() //通过类名直接访问

编译之后的伴生对象会产生静态方法,然而要留意,伴生对象之中的属性得借助 const 方可成为名副其实的静态常量。

学员王芳踩过坑:不加 const,反射时拿不到值。

三个概念进行对比,普通类方法要 new 对象,静态类直接采用类名,伴生对象使得普通类也能够拥有静态方法。

老师讲的很详细,每个知识点都讲了具体的实例,通过实例的学习,也让知识点印象更深刻,kotlin 中方法的声明和 java 区别还是很大的,日常还是要多多练习,加深印象。

写作工具类的时候,优先选用 object,写作 SDK 或者框架的时候,优先采用伴生对象,以此来保持类内聚。

kotlin 方法参数使用 _Kotlin 从入门到精通 _kotlin 方法声明

课后进行小练习:自行去写一个名为 MathUtil 的 object 类,该类当中要包含加法这个方法,还要有减法这个方法,并且有取最大值这个方法,之后在 main 里面去调用这些方法来试试看。

写完对照一下,看看有没有处理边界情况(比如空值)。