kotlinjava&Android收藏文档android 常用

Kotlin学习手册(一)类与继承

2019-10-27  本文已影响0人  Geekholt

如需转载请评论或简信,并注明出处,未经允许不得转载

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()
}
上一篇下一篇

猜你喜欢

热点阅读