美文网首页
Kotlin基础之构造方法

Kotlin基础之构造方法

作者: 王魔王 | 来源:发表于2020-07-02 17:32 被阅读0次

    我是IT王魔王
    这是我的第7篇IT系列原创

    Kotlin系列我打算写出最适合初学者入门的文章

    网上有很多文章,这些文章写的都不错
    但是鄙人以为,这些文章有一个共同的特点(是优点,但同时也是缺点)
    所以我用特点来形容

    我一般不喜欢讲废话(这是一句废话,sorry)
    能用图解决的尽量不用文字描述

    java中的构造方法

    /**
     * java person 类
     */
    public class Person {
        String name;
        int age;
    
        public Person() {
        }
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }
    

    特点:
    1、方法名与类名相同
    2、不定义返回值类型

    Kotlin中的构造方法

    Kotlin中讲构造方法独立了出来,使用关键字constructor来表示。同时,Kotlin中将构造方法分为了两类:主构造方法和次构造方法

    主构造方法,每个类最多有1个

    依然拿我们的Penguin类(企鹅的意思)举例说明

    为了不让大家看着蒙圈,我专门把空参/有参构造方法写在了一起,方便大家对比

    主构造方法在类后面声明👇

    1、空参主构造方法/有参主构造方法


    空参/有参主构造方法

    2、constructor关键字可以省略


    constructor关键字可以省略

    3、如果加权限修饰符,那么放到constructor前面,此时,就不能省略constructor关键字了

    加了权限修饰符

    再次强调,当有了权限修饰符时,就不能省略constructor关键字了

    不能省略constructor关键字

    到这里,有关主构造方法的声明语法就讲完了
    接下来我们会有另外一个问题,怎么用?

    当使用有参构造方法时,我们怎么使用主构造方法中的参数呢?

    java中的使用

    java中使用构造方法中的参数

    Kotlin的主构造方法是没有方法体的,这就意味着我们无法在主构造方法中进行任何操作。
    但Kotlin为我们提供了一个init代码块,这个代码块的执行顺序在主构造方法之后,次构造方法之前,我们可以在这个代码块中进行各种初始化的操作,包括访问主构造方法中的参数👇

    /**
    * kotlin 企鹅类
    */
    class Penguin private constructor (name:String,age:Int) {
    
       var name:String?=null //名称
       var age:Int=0  //年龄
       var weight:Int=100  //体重
    
       //kotlin为我们提供了一个init代码块,
       //init代码块的执行顺序在主构造方法之后
       //我们可以在init代码块中进行各种初始化操作
       //init代码块中可以访问主构造方法中的变量
       init {
           this.name=name
           this.age=age
       }
    }
    

    终于不用截图了,好轻松的说😀
    到这里,主构造方法的声明加使用就讲完了。
    现在我们讲一点有趣(奇怪)的知识


    image.png

    在上面这段代码里,有一个小问题
    这个问题小白是不介意的,大神们是无法忍受的,例如我-----就能忍受。

    言归正传,我们来看这段代码有什么问题👇

    image.png

    一个字:太繁琐。
    Kotlin的设计理念之一就是要简洁,越简洁越好。让大家把节省下来的时间去做更重要的事情,例如撩妹。

    在一个类中声明属性,通过构造方法传值进行初始化这种操作有没有很频繁,有没有很繁琐,虽然IDE给我们提供了快捷键,虽然你的手速也很快,但是要是能把这个过程“省略”掉就更完美了。
    Kotlin让提供了这样的功能

    主构造方法中声明属性

    效果相同

    左侧的写法跟右侧的写法效果完全相同。
    var换成val也可以👇

    val也可以

    好了,到这里,主构造方法的知识就真的讲完了。
    大家有没有觉得学到这里的时候觉得Kotlin很爽,腰不酸了腿不疼了,一口气上五楼不费劲了,奇怪的知识增加了。


    奇怪的知识增加了

    次构造方法,每个类可以有N个

    次构造方法声明在类中,依然使用constructor来声明

    /**
     * kotlin 企鹅类
     */
    class Penguin {
        var weight:Int=100  //体重
        var age:Int=0
        var name:String?=null
        
        //空参次构造器
        constructor(){ }
        //有参次构造器
        constructor(name:String,age:Int){
            this.name=name
            this.age=age
        }
    }
    

    当构造方法中没有逻辑时候,大括弧可以省略

    
    /**
     * kotlin 企鹅类
     */
    class Penguin {
        var weight:Int=100  //体重
        var age:Int=0
        var name:String?=null
    
        //空参次构造方法,如果没有逻辑,可以省略大括弧
        constructor()
        //有参次构造方法,如果没有逻辑,可以省略括弧,不过有参的空构造方法是没有意义的
        constructor(name:String,age:Int)
    }
    

    当主构造器和次构造器同时存在时,次构造器必须直接或者间接调用主构造器

    /**
     * kotlin 企鹅类
     */
    class Penguin constructor(name: String) {
        var weight:Int=100  //体重
        var age:Int=0
        var name:String?=null
    
        //空参次构造器,调用了下面的次要构造方法
        constructor():this("奔波儿霸",10)
    
        //有参次构造器,调用了主构造方法
        constructor(name:String,age:Int):this(name){
            this.name=name
            this.age=age
        }
    }
    

    构造方法调用构造方法的方式如👆代码所示,使用:this来调用

    执行顺序上,主构造器>init代码块>次构造器

    与java相似,当我们不声明任何构造方法时,Kotlin编译器会默认给我们增加一个空参构造方法

    
    /**
     * kotlin 企鹅类
     */
    class Penguin constructor() {
        var weight:Int=100  //体重
        var age:Int=0
        var name:String?=null
    }
    

    如👆,当我们不声明任何构造方法时,Kotlin编译器会默认给我们增加一个构造方法(眼睛看不着,编译之后的代码会看到)

    到这里,有关Kotlin中的构造方法就讲完了
    总结一下
    重点在主构造方法
    当主构造方法和次构造方法同时存在,次构造方法必须调用主构造方法

    聊天结束

    相关文章

      网友评论

          本文标题:Kotlin基础之构造方法

          本文链接:https://www.haomeiwen.com/subject/dnvtqktx.html