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

来源:互联网 发布:万得数据 编辑:程序博客网 时间:2024/06/03 19:40

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

开篇之前还是老规矩,先安利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