Kotlin基础之构造方法

我是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基础之构造方法)