Kotlin学习手册(一)类与继承
如需转载请评论或简信,并注明出处,未经允许不得转载
Kotlin系列导读
Kotlin学习手册(一)类与继承
Kotlin学习手册(二)属性与字段
Kotlin学习手册(三)接口
Kotlin学习手册(四)内部类
Kotlin学习手册(五)函数
Kotlin学习手册(六)数组与集合
Kotlin学习手册(七)for循环
Kotlin学习手册(八)内联函数let、with、run、apply、also
Kotlin学习手册(九)空类型安全
Kotlin学习手册(十)带你真正理解什么是Kotlin协程
目录
类
.java
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
.kotlin
class Person {
var name: String? = null
}
构造函数
主构造函数
.java
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
.kotlin
在 Kotlin 中的一个类可以有一个主构造函数以及一个或多个次构造函数(constructor
)
主构造函数是类头的一部分,它跟在类名后
class Person(var name: String?)
次构造函数(构造函数重载)
.java
public class Person {
private String name;
private String address;
public Person(String name) {
this.name = name;
}
public Person(String name,String address) {
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
.kotlin
类也可以声明前缀有 constructor
的次构造函数
class Person {
var name: String? = null
var address: String? = null
constructor(name: String) {
this.name = name
}
constructor(name: String, address: String) {
this.name = name
this.address = address
}
}
init代码块
.java
public class Person {
private String name;
public Person(String name) {
this.name = name;
//添加代码
System.out.print("My name is " + name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
.kotlin
主构造函数不能包含任何的代码。初始化的代码可以放到以 init 关键字作为前缀的初始化块中
class Person(var name: String?) {
init {
//主构造的参数(name)可以在初始化块中使用
print("My name is $name")
}
}
注意:如果同时包含init和次构造函数,init会优先于次构造函数执行
创建类的实例
.java
Person person = new Person("geekholt");
.kotlin
Kotlin 并没有 new
关键字
val person = Person("geekholt")
继承
在 Kotlin 中所有类都有一个共同的超类 Any
,这对于没有超类型声明的类是默认超类,类似java中的Object
Any
有三个方法:equals()
、 hashCode()
与 toString()
。因此,为所有 Kotlin 类都定义了这些方法
基类只有主构造函数
.java
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Man extends Person {
public Man(String name) {
super(name);
}
}
.kotlin
class Man(name: String) : Person(name)
基类只有次构造函数
.java
public class Person {
private String name;
private String address;
public Person(String name) {
this.name = name;
}
public Person(String name, String address) {
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
public class Man extends Person {
public Man(String name) {
super(name);
}
public Man(String name, String address) {
super(name, address);
}
}
.kotlin
class Man : Person {
constructor(name: String) : super(name) {}
constructor(name: String, address: String) : super(name, address) {}
}
重写父类方法
.java
public class Person {
public void sayHello() {
}
}
public class Man extends Person {
@Override
public void sayHello() {
System.out.print("Hello");
}
}
.kotlin
kotlin中如果不加open
关键字,默认类、方法都是final
的,即不可被重写。所以对需要进行重写的方法要加上open
关键字
open class Person {
open fun sayHello() {
}
}
class Man : Person() {
override fun sayHello() {
print("Hello")
}
}
注意:由于基类会优先于派生类进行初始化,也就意味着基类构造函数执行时,派生类中声明或覆盖的属性都还没有初始化,所以设计一个基类时,应该避免在构造函数、属性初始化器以及 init
块中使用 open
成员
抽象类
.java
abstract public class Person {
public abstract void sayHello();
}
.kotlin
我们并不需要用 open
标注一个抽象类或者函数——因为这不言而喻。
abstract class Person {
abstract fun sayHello()
}