在Kotlin中@JvmOverloads注解的作用:
    在有默认参数值的方法中使用 @JvmOverloads 注解,则Kotlin就会暴露多个重载方法

    如果在Kotlin中定义了如下方法

    1. fun method(String, b: Int = 0, c: String="abc"){
    2. ...
    3. }

    只是相当于在java中定义如下方法,是的默认参数无任何的意义

    void method(String a, int b, String c){
        ...
    }
    

    但如果使用的了@JvmOverloads注解在 method 方法前,就相当于定义如下三个java方法,而再也不用自己写重载方法

    void method(String a)
    void method(String a, int b)
    void method(String a, int b, String c)
    

    @JvmOverloads注解可以用在 方法,构造函数,静态方法中。

    在构造函数的使用情况下,Android领域用的较多的场景就是自定义View的实现

    class CollapsibleToolbar @JvmOverloads constructor(context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = 0)
        : MotionLayout(context, attrs, defStyleAttr)
    

    �在Kotlin中定义类的继承时,Android Studio工具会提醒使用 @JvmOverloads 注解,并且帮助生成上述格式代码

    class CollapsibleToolbar : MotionLayout
    

    JvmOverloads注解 - 图1

    对应生成的java构造函数如下:

    public class CollapsibleToolbar extends MotionLayout {
    
        public CollapsibleToolbar(Context context) {
            this(context, null);
        }
    
        public CollapsibleToolbar(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public CollapsibleToolbar(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    }