一、前言
在 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:
- 默认是 public;
- 类内部无内容,括号可省略‘
- 类中的属性必须初始化或者延迟初始化。
// 简单的类
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
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 中的扩展方法
扩展方法的意思就是类中本来没有定义某个方法,我们可以给它扩展一个,也就是加一个方法。Java 是没有扩展方法这个概念的。
3.1、扩展方法的定义
比如说我要给 String 类定义一个检验邮箱是否合法的扩展方法,写法如下:
fun String.isEmail(): Boolean {
return matches(Regex("邮箱的正则表达式"))
}
调用:
"[email protected]".isEmail()
四、小结
本篇博客主要讲了 Kotlin 中的类与接口和扩展方法,下一节我们讲空类型安全和智能类型转换。
五、源码
源码 已上传至 github,有需要可以直接下载。