Kotlin中数据类和单例类的实现和讲解面向对象编程接口的实现
Posted CodeJiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin中数据类和单例类的实现和讲解面向对象编程接口的实现相关的知识,希望对你有一定的参考价值。
1. 数据类和单例类
在开始学习之前, 先来学习一下Kotlin语言中的可见性修饰符:
熟悉Java的人都知道, Java中有4种可见性修饰符,
public、private、protected、default。
kotlin种也有4种,分别是public、private、protected、internal。
首先private修饰符和Java是一模一样的,都表示只对当前类的内部可以见。
public修饰符虽然作用和Java是一样的,
但在Kotlin种public修饰符是默认选项,
而在Java中default才是默认的权限修饰符。
修饰符 | Java | Kotlin |
---|---|---|
public | 所有类可见 | 所有类可见(默认) |
private | 当前类可见 | 当前类可见 |
protected | 当前类, 子类, 同一包路径下的类可见 | 当前类, 子类可见 |
default | 同一包路径下的类可见(默认) | 无 |
internal | 无 | 同一模块中类可见 |
1.1数据类
在一个规范的系统架构中,数据类占有着非常重要的角色,
他们用于将服务器端或者将数据库中的数据映射到内存中,
为编程提供数据模型的支持。或许你听过MVC、MVP、MVVM、
之类的架构模式,但不管是哪一种架构模式,
这里的M都是指的数据类。
数据类通常需要重写equals(), hashCode(), toString()这几个方法,
其中equals()方法用于判断两个数据类是否相等,
hashCode()作为equals()方法的配套方法, 也需要一起重写,
否则会导致HashMap, HashSet等hash相关的系统类无法正常工作.
toString()方法用于更清晰的输入日志.
这里我们来定义一个手机类(先用java代码实现):
public class Phone
private String brand;
private double price;
public Phone()
public Phone(String brand, double price)
this.brand = brand;
this.price = price;
@Override
public int hashCode()
return super.hashCode();
@Override
public boolean equals(@Nullable Object obj)
return super.equals(obj);
@Override
public String toString()
return "Phone" +
"brand='" + brand + '\\'' +
", price=" + price +
'';
看上去比较复杂吧, 关键是这些代码还没有实际逻辑的意义,
只是为了让它用于数据类的功能而已,而在Kotlin语言中,
可以用data关键字来简化这些代码:
data class Phone(val brand: String, var price: Double)
是的,你没有看错,只需要这一行代码就实现了,
当你在一个类前面加了data关键字,就表明你希望这个类是一个数据类,
Kotlin会根据主构造函数中的参数帮你将equals(), hashCode(), toString()
等固定且无实际逻辑意义的方法自动生成, 从而减少开发的工作量.
当一个类中没有任何代码时,可以省去尾部的大括号
测试代码:
fun main()
val phone1 = Phone("Samsung", 2999.9)
val phone2 = Phone("Samsung", 2999.9)
println("phone1 = phone2 ? " + (phone1 == phone2))
运行结果:
1.2 单例类
首先先来介绍单例模式:
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例
这里用Java来写一个单例类:
public class Singleton
private static Singleton instance;
private Singleton()
public synchronized static Singleton getInstance()
if (instance == null)
instance = new Singleton();
return instance;
public void singletonTest()
System.out.println("SingletonTest is called.");
这段代码其实很好理解, 首先用private将Singleton的构造函数私有化,
使得外部不可以创建这个类的具体实例.
getInstance()方法用于外部获取Singleton类的实例,
singletonTest()是上面单例类的一个方法
代码讲解:
public static void main(String[] args)
// 获取 单例类 Singleton 的实例
Singleton singleton =Singleton.getInstance();
// 调用单例类Singleton 的 singletonTest()方法
singleton.singletonTest();
虽然Java中单例类的实现并不复杂, 但是Kotlin做的更好,
它将一些固定的, 重复的逻辑实现隐藏了起来,
只暴露给我们最简单方便的用法.
在Kotlin中创建单例类的方式为, 将class关键字改成object关键字.
代码实现:
object Singleton
如果我们要在这个类中编写其他的函数, 直接加上去就好
代码实现:
object Singleton
fun singletonTest()
println("SingletonTest is called.");
2. 面向对象编程接口的实现
Study接口:
interface Study
fun readBooks()
fun doHomeWork()
引例:
fun main()
doStudy(Student("Tom", 18))
open class Person(val name: String, val age: Int)
class Student(name: String, age: Int) : Person(name, age), Study
override fun readBooks()
println("$name is reading")
override fun doHomeWork()
println("$name is doing homework")
fun doStudy(study: Study)
study.readBooks()
study.doHomeWork()
运行结果:
熟悉Java的人都知道, Java中继承使用的关键字是extends,
实现接口使用的关键字是implements, 而Kotlin中统一使用冒号:
中间用逗号分隔
我们可以对接口中的函数选择默认实现(从jdk1.8开始有这个功能)
interface Study
fun readBooks()
fun doHomeWork()
println("I'm doing homework now.")
如果接口中的函数有了函数体, bane函数体中的内容就是它的默认实现.
现在当一个类去实现Study接口时, 只会强制要求重写readBooks方法,
而doHomework方法可以选择实现, 如果不去实现, 则使用默认的实现逻辑.
测试代码:
fun main()
doStudy(Student("Tom", 18))
open class Person(val name: String, val age: Int)
class Student(name: String, age: Int) : Person(name, age), Study
override fun readBooks()
println("$name is reading")
fun doStudy(study: Study)
study.readBooks()
study.doHomeWork()
运行结果:
以上是关于Kotlin中数据类和单例类的实现和讲解面向对象编程接口的实现的主要内容,如果未能解决你的问题,请参考以下文章