浅谈Kotlin(三):类

浅谈Kotlin(一):简介及Android Studio中配置

浅谈Kotlin(二):基本类型、基本语法、代码风格

浅谈Kotlin(三):类

浅谈Kotlin(四):控制流

前言:

  已经学习了前两篇文章,对Kotlin有了一个基本的认识,往后的文章开始深入介绍Kotlin的实战使用。

  本篇介绍Kotlin中类的使用。

一、表现形式

  首先看一段Java中定义类的形式,定义三个属性,每一个属性对应一个get、set方法,有一个toString()方法

/*
* @author xqx
* @emil djlxqx@163.com
* create at 2017/5/18
* description: 自己写的类,人,包含姓名,年龄,性别
*/

public class XPatient {
    private String name;  //姓名
    private int age;      //年龄
    private int sex;     //性别  1、男    2、女

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "XPatient{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                '}';
    }
}

  接下来我们看这个类对应的Kotlin的表现形式:

  跟着下面的操作做一个处理,让我们这个类对应的 .java 文件转化为对应的 .kt 文件

  之后转换完成我们看下转换后的代码:

  看一下变化:

1、代码量少了很多

      2、get/set方法都没有了

      3、只有一个重写的toString()方法。

      4、类的属性都有一个默认的初始值

/*
* @author xqx
* @emil djlxqx@163.com
* create at 2017/5/18
* description: 自己写的类,人,包含姓名,年龄,性别
*/

class XPatient {
    var name: String? = null  //姓名
    var age: Int = 0      //年龄
    var sex: Int = 0     //性别  1、男    2、女

    override fun toString(): String {
        return "XPatient{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                '}'
    }
}

二、定义类的构造方法

  首先看Java类的构造

  Java中定义构造方法特点:

1、方法名需要和类名一致

      2、参数可以任意属性值的组合,也可以不写

      3、可以有多个构造方法

    //无参数的构造方法
    public JPatient() {
    }

    //类的三个属性值都需要的构造方法
    public JPatient(String name, int age, int sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

  在看Kotlin的类,这里有个知识点 :Kotlin类中可以有一个主构造方法 和 一个至多个二级构造方法。

  ①、主构造方法的的写法:

直接写在类的头部,类似于定义方法的形式 加一个参数。

    需要添加 init{} 代码块来处理对主构造方法传来的参数的初始化操作。

class XPatient(name: String? ,age: Int ,sex: Int) {  //主构造方法的形式 ,类名后面加(属性名 : 属性类型 .....)
    var name: String? = null  //姓名
    var age: Int = 0      //年龄
    var sex: Int = 0     //性别  1、男    2、女


    /*进行主构造函数的初始化,自己定制*/
    init {
        this.name = name;
        this.age = age+1;
        this.sex = sex-1;
    }
    ....
}

 ②、二级构造方法:

    为了实现类似于Java中一个类具有多种构造方法

 二级构造函数最终委托到主构造方法,中间可以有0个或多个中间二级构造方法。

    个人理解,如果涉及到一个类有多个构造方法的时候,主构造方法尽量设为无参的。

    如下:当创建一个对象XPatient("Alice",18); 的时候 会调用二级构造方法 constructor(name: String?,age : Int):this(name){}

       该二级构造方法再委托(调用)对应的一个参数name(String) 对应的二级构造方法  constructor(name:String?):this( ){}

       一个参数的该二级构造方法最终委托(调用)主构造方法

  下面举例测试:

class XPatient() {
    var name: String? = null  //姓名
    var age: Int = 0      //年龄
    var sex: Int = 0     //性别  1、男    2、女


    /*进行主构造函数的初始化*/
    init {
        Log.i("xqxinfo","调用了无参数的主构造方法");
    }

    /*传入(name)*/
    constructor(name:String?):this( ){
        this.name = "Alice";
        Log.i("xqxinfo","调用了一个参数的二级构造方法");

    }
    /*传入(name,age)*/
    constructor(name: String?,age : Int):this(name){
        this.age = age+1;
        Log.i("xqxinfo","调用了两个参数的二级构造方法");
    }

    override fun toString(): String {
        return "XPatient{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                '}'
    }
}

    进行测试:

val patient = XPatient("Alice", 18)
Log.i("xqxinfo", "该对象的属性值" + patient.toString())

    打印结果:

05-19 18:08:05.621 25081-25081/? I/xqxinfo: 调用了无参数的主构造方法
05-19 18:08:05.621 25081-25081/? I/xqxinfo: 调用了一个参数的二级构造方法
05-19 18:08:05.621 25081-25081/? I/xqxinfo: 调用了两个参数的二级构造方法
05-19 18:08:05.621 25081-25081/? I/xqxinfo: 该对象的属性值XPatient{name='Alice', age=19, sex=0}

    这里看一下,不要以为先执行了主构造方法,然后再执行一个参数的,再执行两个参数的二级构造方法。

实际还是先执行了创建对象的那个参数 对应的两个参数的二级构造方法,两个参数的构造方法调用一个参数的构造方法,一个参数的又调用了主构造方法。

    所以当主构造方法执行完之后,会返回来执行一个参数的构造方法内的处理,一个参数的构造方法执行完了,再执行两个参数的构造方法内的处理。类似于递归。

      所以打印结果如上代码所示。

二、类的继承

关于Kotlin的类有几个知识点需要先知道:

    1、默认情况下,任何类都是根继承自Any(类似于Java中的Object)

    2、默认情况下,任何类都是不可继承的(final)

    3、只有被申明open或者abstract的类可以被继承

  继承形式:

open class Animal(name: String)  // 被继承的类  需要open修饰
class Person(name: String, surname: String) : Animal(name)     //继承Animal类的类

注:方法即函数

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小灰灰

Greenrobot-EventBus源码学习(五)

EventBus 深入学习五之注册 订阅者的注册 + 消息推送 1. 注册 先贴出注册代码, 可以可到和 Guava 相比没什么大的区别, 主要的点在内部实...

1786
来自专栏desperate633

深入理解javascript中的继承机制(3)属性复制对象之间的继承深复制原型继承原型继承与属性复制的混合使用

我们开始换一种思路实现继承,可不可以直接将父对象的属性直接复制给子对象,这样子对象不久也拥有了父对象的属性,相当于继承。

682
来自专栏java工会

Java中关于try、catch、finally中的细节分析

1735
来自专栏机器学习和数学

[编程经验] Python正则表达式

Hello,大家好。又见面了,今天给大家介绍一下,正则表达式在Python中是如何使用的。这样说的原因是正则表达式并不是Python所独有的,而是自成体系,在很...

2504
来自专栏微信公众号:Java团长

Java:类与继承

对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础。抽象、封装、继承、多态这四大特性都离不开类,只有存在类,才能体现面向对象编程的特点,今天我们就来了解...

1263
来自专栏从流域到海域

JavaScript闭包详解

JavaScript闭包详解 闭包就是由函数创造的一个词法作用域,里面创建的变量被引用后,可以在这个词法环境之外自由使用(维基百科)。 闭包,官方对闭包...

1968
来自专栏微信公众号:Java团长

Java:类与继承

  对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础。抽象、封装、继承、多态这四大特性都离不开类,只有存在类,才能体现面向对象编程的特点,今天我们就来...

381
来自专栏大眼瞪小眼

介绍C语言指针

引用传递是C++才有的特性,C语言只支持值传递。所以C语言只能通过传指针来达到在函数内修改函数外变量的功能。也就是swap(int &a,int &b)在C语言...

511
来自专栏猿人谷

小瓜牛漫谈 — String

String 类在 Java 中代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。 1 public static voi...

1709
来自专栏积累沉淀

JavaScript DOM基础2

DOM自身存在很多类型,比如Element类型:表示的是元素节点,再比如Text类型:表示的是文本节点。DOM也提供了一些扩展功能。 一.DOM类型 DOM基础...

1778

扫码关注云+社区