分享下学习Kotlin的历程-构造函数/抽象类/枚举

转载请注明出处:王亟亟的大牛之路

开篇之前还是老规矩,先安利https://github.com/ddwhan0123/Useful-Open-Source-Android 还是尽量每天做更新和维护

Kotlin和Java一样支持多构造函数的姿势,并且对属性对get/set方法进行了二次封装

这一篇,也通过简单的demo来讲一下相关知识


构造函数

在说Kotlin构造函数之前先提一提Java的构造函数和实例方法那些事

构造方法和实例方法的区别:
主要的区别在于三个方面:修饰符返回值命名

1、和实例方法一样,构造器可以有任何访问的修饰符,public、private、protected或者没有修饰符
,都可以对构造方法进行修饰。不同于实例方法的是构造方法不能有任何非访问性质的修饰符修饰,例如static、final、synchronized、abstract等都不能修饰构造方法。

2、返回类型是非常重要的,实例方法可以返回任何类型的值或者是无返回值(void),而构造方法是没有返回类型的,void也不行。

3、至于命名就是构造方法与类名相同,当然了实例方法也可以与类名相同,但是习惯上我们为实例方法命名的时候通常是小写的,另一方面也是与构造方法区分开。
而构造方法与类名相同,所以首字母一般大写。

Kotlin的构造函数相对来说就更简便

如果是无参数的就和java中的 类定义一摸一样

class Wjj

如果是有参数的,就直接加在类名后面,像这样

class Wjj(userName:String,age:Int)

因为无法在主构造函数中做高端操作,所以提供了一个init{}的姿势来解决一些 初始化的问题,像这样

 init {
        println("----> "我是init")
    }

Kotlin也支持多个构造函数,但是都是会继承主构造函数,像这样

open class Student(var name: String) {
    init {
        if (name.equals("wjj")) {
            name = "王亟亟"
        }
        println("----> Student 构造函数 name " + name)
    }

    var age: Int = 0
    var sex: Boolean = true
        get() {
            return !name.equals("王亟亟")
        }

    constructor(name: String, age: Int) : this(name) {
        this.age = age
    }

    constructor(name: String, age: Int, sex: Boolean) : this(name) {
        this.age = age
        this.sex = sex
    }

}

类定义时默认是final属性,不可被继承。若需要继承,使用open关键字进行修饰。
这一点在之前的文章也有提过


Kotlin也提供了,对参数预设值的姿势,极大的避免了 我们那些空指针的恶心姿势,像这样

open class Grade(var GradeStr: String = "没名字") {
}

那么当你创建对象的时候,不传参也就不会报错了,像这样

val grade = Grade()
等同于
val grade = Grade("")

抽象类

Kotlin中的抽象类允许有abstract修饰的成员方法,非抽象类不允许有抽象方法

abstract class Wjj{
    abstract fun hellow()
}

class Wmm{
    abstract fun hellow() // 编译错误
}

抽象类默认是可被继承的,接口是特殊的抽象类,允许有抽象方法:

interface Wjj{
    abstract fun hellow()
}

枚举类

Kotlin也支持枚举,每个枚举常量都是一个对象

enum class Direction {
    NORTH, SOUTH, WEST, EAST
}

由于每个枚举都是枚举类的实例,因此可以进行初始化

enum class Color(val rgb: Int) {
        RED(0xFF0000),
        GREEN(0x00FF00),
        BLUE(0x0000FF)
}

部分模块模块知识点来源于:https://www.kotlincn.net/docs/reference/enum-classes.html

ok,废话讲完了,这下拿例子解释下

新建三个类

这里写图片描述

可被继承的学生类 Student.kt

open class Student(var name: String) {
    //初始化方法
    init {
        if (name.equals("wjj")) {
            name = "王亟亟"
        }
        println("----> Student 构造函数 name " + name)
    }

    var age: Int = 0
    var sex: Boolean = true//修改引用的值
        get() {
            return name != "王亟亟"
        }

    constructor(name: String, age: Int) : this(name) {
        this.age = age
    }

    constructor(name: String, age: Int, sex: Boolean) : this(name) {
        this.age = age
        this.sex = sex
    }
}

继承于学生类的班级类 Classes.java

public class Classes extends Student {
    //学生人数
    private int StudentNumber;
    //班名
    private String ClassName;
    //年级
    private int GradeNumber;
    //年级中文名
    private String GradeStr;

    public Classes(String name) {
        super(name);
        this.ClassName = name;
    }

    public Classes(String name, int age) {
        super(name, age);
    }

    public Classes(String name, int age, boolean sex) {
        super(name, age, sex);
    }

    public int getStudentNumber() {
        return StudentNumber;
    }

    public void setStudentNumber(int studentNumber) {
        StudentNumber = studentNumber;
    }

    public String getClassName() {
        return ClassName;
    }

    public void setClassName(String className) {
        ClassName = className;
    }

    public int getGradeNumber() {
        return GradeNumber;
    }

    public void setGradeNumber(int gradeNumber) {
        GradeNumber = gradeNumber;
    }

    public String getGradeStr() {
        return GradeStr;
    }

    public void setGradeStr(String gradeStr) {
        GradeStr = gradeStr;
    }
}

年级类:Grade.kt

open class Grade(var GradeStr: String = "没名字") {
    var flag = false
    var GradeNumber: Int = 0
        get() {
            return if (flag) {
                9
            } else {
                10
            }
        }

    init {
        println("----> Grade 构造函数 GradeStr " + GradeStr)
    }

    constructor(GradeStr: String, GradeNumber: Int = 7) : this(GradeStr) {
        this.GradeNumber = GradeNumber
        println("----> Grade 次构造函数 GradeNumber " + GradeNumber)
    }
}

调用的方法:

 var classes = Classes("三年级二班")
        Log.d("----> ", "SecondActivity onResume classes " + classes.className)
        var student = Student("wjj", 20, true)
        Log.d("----> ", "SecondActivity onResume student sex " + student.sex)
        val grade = Grade()
        Log.d("----> ", "SecondActivity onResume Grade GradeNumber " + grade.GradeNumber)

打印结果:

----> Student 构造函数 name 三年级二班
---->: SecondActivity onResume classes 三年级二班
----> Student 构造函数 name 王亟亟
---->: SecondActivity onResume student sex false
----> Grade 构造函数 GradeStr 没名字
---->: SecondActivity onResume Grade GradeNumber 10

源码地址:https://github.com/ddwhan0123/KotlinAndroidDemo

猜你喜欢

转载自blog.csdn.net/ddwhan0123/article/details/77944883
今日推荐