本文正在参加「金石方案 . 瓜分6万现金大奖」
前语
在强大而灵活的RecyclerView Adapter——BRVAH(结构引入与BaseQuickAdapter运用篇) – ()这篇文章中,我自定义了一个特点类,但其实其时我写的时分是模糊了好一阵,由于习惯用Java言语开发安卓的我,一时不知道用Kotlin怎么写类与其结构办法,异常尴尬,所以马上翻出教程学习起来,然后才继续完结了这个Adapter的Demo,下面咱们就来看看怎么运用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办法完结或不完结:
默许完结去除承继中的完结办法不报错:
未完结承继后也不完结的话会报错: 这种运用接口的编程办法也叫面向接口编程,亦称多态。数据类
数据类一般用于将服务器端或数据库的数据映射到内存中,为编程逻辑提供数据模型的支持,咱们常说的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)
单例类
首要咱们了解一下单例形式:
单例形式,最常用、最基础的规划形式之一,可用于防止创立重复对象,在大局最多只能拥有一个实例。
单例形式的写法很多,咱们这边先看一下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的方便与优势,感谢我们的阅览!