FSA全栈行动 FSA全栈行动
首页
  • 移动端文章

    • Android
    • iOS
    • Flutter
  • 学习笔记

    • 《Kotlin快速入门进阶》笔记
    • 《Flutter从入门到实战》笔记
    • 《Flutter复习》笔记
前端
后端
  • 学习笔记

    • 《深入浅出设计模式Java版》笔记
  • 逆向
  • 分类
  • 标签
  • 归档
  • LinXunFeng
  • GitLqr

公众号:FSA全栈行动

记录学习过程中的知识
首页
  • 移动端文章

    • Android
    • iOS
    • Flutter
  • 学习笔记

    • 《Kotlin快速入门进阶》笔记
    • 《Flutter从入门到实战》笔记
    • 《Flutter复习》笔记
前端
后端
  • 学习笔记

    • 《深入浅出设计模式Java版》笔记
  • 逆向
  • 分类
  • 标签
  • 归档
  • LinXunFeng
  • GitLqr
  • Kotlin - 数据类型
  • Kotlin - 类与构造器
  • Kotlin - 空类型和智能类型转换
  • Kotlin - 区间与数组
  • Kotlin - 常量与变量
  • Kotlin - 函数与Lambda表达式
  • Kotlin - 类成员
  • Kotlin - 运算符与中缀表达式
  • Kotlin - 分支与循环
  • Kotlin - 参数与异常
  • Kotlin - 面向对象之抽象类与接口
  • Kotlin - 面向对象之继承与实现
  • Kotlin - 类及成员的可见性
  • Kotlin - 伴生对象与静态成员
  • Kotlin - 方法重载与默认参数
    • 方法重载(Overloads)
    • 默认参数
    • JvmOverloads
  • Kotlin - 扩展成员
  • Kotlin - 属性代理
  • Kotlin - 数据类
  • Kotlin - 内部类
  • Kotlin - 枚举与密封类
  • Kotlin - 高阶函数与函数引用
  • Kotlin - 常见高阶函数
  • Kotlin - 作用域函数
  • Kotlin - 尾递归优化
  • Kotlin - 函数式编程
  • Kotlin - 改良设计模式 - 工厂模式
  • Kotlin - 改良设计模式 - 构建者模式
  • Kotlin - 改良设计模式 - 观察者模式
  • Kotlin - 改良设计模式 - 策略模式
  • Kotlin - 改良设计模式 - 迭代器模式
  • Kotlin - 改良设计模式 - 责任链模式
  • Kotlin - 改良设计模式 - 装饰者模式
  • 《Kotlin快速入门进阶》
GitLqr
2021-01-29
目录

Kotlin - 方法重载与默认参数

欢迎关注微信公众号:[FSA全栈行动 👋]

# 方法重载(Overloads)

当一个类中有两个或多个具有相同方法名和不同的参数类型的方法时,就是重载:

class Person {
    fun say() {
        println("hahaha")
    }
    fun say(what: String) {
        println(what)
    }
    fun say(obj: Any) {
        println("this is ${obj.javaClass.simpleName}")
    }
}

fun main() {
    val person = Person()
    person.say() // hahaha
    person.say("hehehe") // hehehe
    person.say(person) // this is Person
}

方法签名由方法名和参数类型决定,与方法的其他属性无关。

# 默认参数

在 Kotlin 中,方法可以使用默认参数,一般情况下,方法重载可以转换成带默认参数的方法:

class Person {
    fun say(what: String = "hahaha") {
        println(what)
    }
    fun say(obj: Any) {
        println("this is ${obj.javaClass.simpleName}")
    }
}

fun main() {
    val person = Person()
    person.say() // hahaha
    person.say("hehehe") // hehehe
    person.say(person) // this is Person
}

可以看到这里只是把 say() 和 say(what:String) 使用默认参数整合了,但 say(obj:Any) 还在,其实 say(obj:Any) 的设计是不合理的,因为 String 是 Any 的子类,在调用方法时会有歧义,开发中,最好避免这种写法。

# JvmOverloads

现在 Person 类中的 say()是重载方法,而且其中一个 say 有默认参数,我们来看看在 Java 中调用如何:

可以发现,Java 中识别不到不带参数的 say()方法,这是因为 Java 并不知道 Kotlin 中有默认参数这种特性,它只能认为 say(what:String) 和 say(obj:Any) 是重载方法,把 say(what:String) 中的默认参数给忽略了,Kotlin 提供了 @JvmOverloads 可以将带有默认参数的方法转换成对应的重载方法:

class Person {
    @JvmOverloads
    fun say(what: String = "hahaha") {
        println(what)
    }

    fun say(obj: Any) {
        println("this is ${obj.javaClass.simpleName}")
    }
}

ok,这下 Java 中就识别到了不带参数的 say()方法了

#Overloads#JvmOverloads
Kotlin - 伴生对象与静态成员
Kotlin - 扩展成员

← Kotlin - 伴生对象与静态成员 Kotlin - 扩展成员→

最近更新
01
Flutter - Xcode16 还原编译速度
04-05
02
AI - 免费的 Cursor 平替方案
03-30
03
Android - 2025年安卓真的闭源了吗
03-28
更多文章>
Theme by Vdoing | Copyright © 2020-2025 FSA全栈行动
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×