Kotlin学习(5)-类和对象之类的构造

1.类的简单定义

Kotlin中定义类依旧使用关键字"class",类声明一般由类名、类头(指定其类型参数、主构造函数)和花括号组成(类主体)。

class Person() {
    //初始化块
    //初始化块仅仅定义了初始操作,它无法定义输入参数
    init {
        println("--------> init() block.")
    }
}

类创建好后,就可以实例化它。具体实例化一个类如下:

//实例化Person对象,省略了new关键字
var person = Person()

上面的init{}块又是什么?在Kotlin中构造函数分为主构造函数和次构造函数,主构造函数不能包含任何的代码,所以初始化的代码就需要放到init{}中(这与Java的方式很不一样)。

//Kotlin的方式
//主构造函数没有任何注解或者可见性修饰符,可以省略这个 constructor 关键字
class Person constructor(age: Int) {
    var age: Int
    init {
        //将age赋值给本类中的变量age
        this.age = age
    }
}


//Java的方式
public class Person {
    private int age;
    /**
     * 构造函数
     */
    public Person() {
    
    }

    /**
     * 构造函数
     * @param age
     */
    public Person(int age) {
        this.age = age;
    }
}

2.类的构造函数

Java中类的构造函数与类同名(见上面的“Java的方式”),但在Kotlin中并没有继续这样表示。Kotlin中构造函数的输入参数直接添加到类名后面,如上面Person类的age输入参数。但这样带来了另一个问题——如何创建多个构造函数?Java中一般根据参数的个数(类型)来实现,Kotlin中则使用上面提到的次级构造函数。
Kotlin支持一个主构造函数+一个(多个)次级构造函数。

class Person(age: Int) {
    init {
        println("------>init{} age = ${age}")
    }
    /**
     * 次级构造函数
     */
    constructor(age: Int, sex: Int) : this(age) {
        println("------>age = ${age} --- sex = ${sex}")
    }
}

//实例化Person对象
var person = Person(20)
var person2 = Person(20,0)

代码示例中,次级构造函数没有函数名,直接使用了关键字constructor表示。此外,次级构造函数主动调用了主构造函数——":this(age)"这句代码,这表明次级构造函数是由主构造函数派生得来。
Kotlin类构造函数还支持默认参数,这有助于进一步简化代码。如果想要在Java类中实例化Person对象,需要添加注解@JvmOverloads constructor。

 //默认sex=0
class Person(age: Int, sex: Int = 0) {
    init {
        println("------>init{} age = ${age} --- sex = ${sex}")
    }
}

//Java类中实例化Person对象
//因为添加了@JvmOverloads注解,constructor关键字不可以省略
class Person @JvmOverloads constructor(age: Int, sex: Int = 0) {
    init {
        println("------>init{} age = ${age} --- sex = ${sex}")
    }
}


3.【总结】

  • Kotlin中实例化对象省略new关键字;

  • Kotlin中类初始化使用init{};

  • Kotlin构造函数输入参数直接添加到类名后面;

  • 次级构造函数没有函数名称且需要调用主构造函数;

  • 构造函数支持默认参数,简化代码。

你可能感兴趣的:(Kotlin,Android学习中的笔记,kotlin)