Kotlin 中的类与接口

Kotlin 中的类与接口

一、前言

<font face= 黑体>在 Kotlin 学习笔记之内置类型(1)和 Kotlin 学习笔记之内置类型(2)中我们已经讲了 Kotlin 内置类型中的基本类型数组区间集合框架函数

二、Kotlin 中的类和接口

2.1、类的定义

Java:

// 简单的类
public class SimpleClass {
}

// 有属性和方法的类
public class SimpleClass {
    public int x;
    public void y() {
    }
}

// 有构造方法的类
public class SimpleClass {
    public int x;
    public SimpleClass(int x) {
        this.x = x;
    }
}

Kotlin:

<font face= 黑体>默认是 public; <font face= 黑体>类内部无内容,括号可省略‘ <font face= 黑体>类中的属性必须初始化或者延迟初始化。
// 简单的类
class SimpleClass   // 默认是 public

// 有属性和方法的类
class SimpleClass {
    var x: Int = 0  // 必须初始化
    fun y() {
    }
}

// 有构造方法的类
class SimpleClass {
    var x: Int = 0  // 必须初始化
    constructor(x: Int) {  // 副构造器
        var x: Int = x
    }
}
<==> //等价写法
class SimpleClass constructor (x: Int) {  // 主构造器
    var x: Int = x
}
<==> // 等价写法
class SimpleClass (x: Int) {  // 主构造器
    var x: Int = x
}
<==> // 等价写法
class SimpleClass (var x: Int) {  // 主构造器

}

2.2、类的实例化

Java:

SimpleClass simpleClass = new SimpleClass(9);
System.out.println(simpleClass.x);
simpleClass.y();

Kotlin:

val simpleClass = SimpleClass(9)
println(simpleClass.x)
simpleClass.y()

2.3、接口的定义

Java:

public interface SimpleInf {
    void simpleMethod();
}

Kotlin:

interface SimpleInf {
    fun simpleMethod()
}

2.4、接口的实现

Java:

public class SimpleClass implements SimpleInf {
    @Override
    public void simpleMethod() {
    }
}

Kotlin:

class SimpleClass(var x: Int): SimpleInf {
    override fun simpleMethod() {
    }
}

2.5、抽象类的定义

Java:

public abstract class AbsClass {
    public abstract void absMethod();
    protected void overridable(){ }
    public final void nonOverridable(){ }
}

Kotlin:

abstract class AbsClass {
    abstract fun absMethod()
    
    // 不是抽象方法也不是接口方法  
    // 必须加 open 关键字的方法才可以被覆写
    open fun overridable(){}                             
    fun nonOverridable(){}
}

2.6、类的继承

Java:

public class SimpleClass extends AbsClass implements SimpleInf {

}

Kotlin:

class SimpleClass(var x: Int): AbsClass(), SimpleInf {

}

2.7、属性 Property

<font face= 黑体>Kotlin 中的 Property 其实就等于 Java 中的 field + getter + setter。

Java:

public class Person {
    private int age; //field
    
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        System.out.println("setAge: " + age);
        this.age = age;
    }
}

Kotlin:

class Person(age: Int, name: String) {
    var age: Int = age //property
        get() {
            return field
        }
        set(value) {
            println("setAge: $value")
            field = value
        }
}

2.8、属性引用

fun main() {
    val ageRef = Person::age  // 未绑定 Receiver
    val person = Person(18, "Test1")
    val nameRef = person::name  // 绑定 Receiver
    ageRef.set(person, 20)  // 需要传 Receiver
    nameRef.set("Test2") // 不需要传 Receiver
}

2.9、Kotlin 中的类和接口回顾

类和接口小结

三、Kotlin 中的扩展方法

<font face= 黑体>扩展方法的意思就是类中本来没有定义某个方法,我们可以给它扩展一个,也就是加一个方法。Java 是没有扩展方法这个概念的。

3.1、扩展方法的定义

<font face= 黑体>比如说我要给 String 类定义一个检验邮箱是否合法的扩展方法,写法如下:

fun String.isEmail(): Boolean {
    return matches(Regex("邮箱的正则表达式"))
}    

<font face= 黑体>调用:

"123456789@qq.com".isEmail()

四、小结

<font face= 黑体>本篇博客主要讲了 Kotlin 中的类与接口扩展方法,下一节我们讲空类型安全智能类型转换

五、源码

源码 已上传至 github,有需要可以直接下载。