本文正在参加「金石方案 . 瓜分6万现金大奖」

前语

在强大而灵活的RecyclerView Adapter——BRVAH(结构引入与BaseQuickAdapter运用篇) – ()这篇文章中,我自定义了一个特点类,但其实其时我写的时分是模糊了好一阵,由于习惯用Java言语开发安卓的我,一时不知道用Kotlin怎么写类与其结构办法,异常尴尬,所以马上翻出教程学习起来,然后才继续完结了这个Adapter的Demo,下面咱们就来看看怎么运用Kotlin完结面向对象编程吧!

安卓语言基础之Kotlin的面向对象编程

正篇

类的写法

和Java相同的地方是都要用class关键字:

class Person {
    var name = ""
    var age = 0
    fun profile() {
        println("name : $name, age : $age")
    }
}

也是大括号里面写成员变量和成员办法,实例化也很简单:

val p = Person()

仅仅没有new这个关键字,这是Kotlin的机制。

承继

Kotlin的承继不需求写extends关键字,而且Kotlin的承继机制也与Java不相同,在Kotlin中任何一个非抽象类默许都是不可承继的,原因与val关键字类似,由于类和变量相同,最好不可变,假如一个类允许被承继,它就无法预知子类会怎么完结,然后导致呈现一些未知危险,所以当一个类不是用来承继的,在Java中也应该用final声明,制止其承继。

而Kotlin现已主动帮咱们做好了,它默许一切非抽象类都不可被承继,而抽象类是不能直接实例化,需求子类承继才能创立实例,一切抽象类便是必须要被承继才行。

但假如咱们想要让一个类能够被承继,其实只需求加上关键字open即可:

open class Person {
    var name = ""
    var age = 0
    fun profile() {
        println("name : $name, age : $age")
    }
}

然后在Kotlin中Java的承继关键字extends变成了“:”(冒号):

class Teacher : Person() {
    var num = 0
    var className = ""
}

咱们看到父类还加上了括号,这便是和下面要说的结构函数有关

结构函数

open class Person(
    val name : String,
    val age : Int
) {
    fun profile() {
        println("name : $name, age : $age")
    }
}
class Teacher(var num : Int,
              var className : String,
              name: String,
              age: Int
              ) : 
    Person(name, age) {
}

咱们能够看到和Java的结构函数不同,它不是写在类办法体的,而是像办法声明参数相同写在类名后的小括号内,所以父类承继时也就需求小括号,一起咱们将子类Teacher后的这个小括号内容称作主结构函数,任何一个类只能有一个主结构函数,当然,有主结构函数,也会有次结构函数,这里先不过多论述,后边有时间再更新到本文中。

有结构函数的类实例化:

val teacher = Teacher(25, "A", "SchoolPerson", 30)

接口

Kotlin的接口和Java的接口声明类似:

interface Teach {
    fun teach()
    fun work()
}

承继后需求去完结接口的一切办法,承继不需求用Java的implements关键字,还是运用冒号,多个类时中心用逗号分隔,接口不必名称后加小括号,由于它没有结构函数可调:

class Teacher(var num : Int,
              var className : String,
              name: String,
              age: Int
              ) :
    Person(name, age), Teach {
    override fun teach() {
        TODO("Not yet implemented")
    }
    override fun work() {
        TODO("Not yet implemented")
    }
}

其中,override为Kotlin重写办法的关键字,和Java的@Override注解类似

此外,Kotlin也支持接口函数默许完结,即能够在接口中对函数完结,然后在完结接口时就不必强制完结该函数,自由挑选是否完结该函数,不实习就调用默许完结办法:

interface Teach {
    fun teach()
    //默许完结
    fun work() {
        println("Work!!")
    }
}

承继后能够挑选对现已默许的work办法完结或不完结:

安卓语言基础之Kotlin的面向对象编程

默许完结去除承继中的完结办法不报错:

安卓语言基础之Kotlin的面向对象编程

未完结承继后也不完结的话会报错:

安卓语言基础之Kotlin的面向对象编程

这种运用接口的编程办法也叫面向接口编程,亦称多态。

数据类

数据类一般用于将服务器端或数据库的数据映射到内存中,为编程逻辑提供数据模型的支持,咱们常说的MVC,MVP,MVVM这些架构形式的M即指代数据类

前语中那个图片其实便是想写数据类但其时还不知道Kotlin怎么写就导致呈现了个怪样子的,但也勉强符合预期,后边会进行更正,那么数据类该怎么写呢,我之所以写错便是由于Java中数据类实在不相同,在Java中咱们一般要重写equals()、hashCode()和toString()办法,让这个类拥有数据类的功用:

public class ModelDemo {
    String name;
    int age;
    public ModelDemo(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof ModelDemo)) return false;
        ModelDemo modelDemo = (ModelDemo) o;
        return age == modelDemo.age && Objects.equals(name, modelDemo.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
    @Override
    public String toString() {
        return "ModelDemo{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }
}

而在Kotlin中,只需你加上关键字data就能主动帮你处理好这些,不需求做这些无用的工作:

data class ModelDemo(val name: String, val age: Int)

就这一句,简简单单。然后相同能够完结上面Java代码重写的办法的作用:

val modelDemo = ModelDemo("Name", 18)
val modelDemo1 = ModelDemo("Name", 18)
println(modelDemo)
println(modelDemo == modelDemo1)

安卓语言基础之Kotlin的面向对象编程

单例类

首要咱们了解一下单例形式:

单例形式,最常用、最基础的规划形式之一,可用于防止创立重复对象,在大局最多只能拥有一个实例。

单例形式的写法很多,咱们这边先看一下Java的一种常见写法:

public class SingleDemo {
    private static SingleDemo instance;
    public SingleDemo() {}
    public synchronized static SingleDemo getInstance() {
        if (instance == null) {
            instance = new SingleDemo();
        }
        return instance;
    }
   public void singleDemoTest() {
        System.out.println("singleDemoTest is called");
   }
}

调用:

SingleDemo singleDemo = SingleDemo.getInstance();
singleDemo.singleDemoTest();

Java中看起来完结单例也不难,但当我看到Kotlin中时,真的笑了:

object SingleDemo {
}

对,这便是Koltin版的单例,假如再加上Java中完结的办法:

object SingleDemo {
    fun singleDemoTest() {
        println("singleDemoTest is called")
    }
}

调用看起来像在运用Java静态办法的调用,其实是Kotlin现已帮咱们主动创立好了SingleDemo的实例,且会保证大局只存在一个SingleDemo实例:

SingleDemo.singleDemoTest()

只能说不愧是晚出来的言语,优势真显着,只需求把class关键字换成object,一个单例简简单单完结创立。

总结

本文将Kotlin的面向对象编程介绍了一遍,真的感受到了Kotlin的方便与优势,感谢我们的阅览!