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

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

浅谈Kotlin(三):类

浅谈Kotlin(四):控制流

前言:

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

  本篇介绍Kotlin中类的使用。

一、表现形式

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

  1. /*
  2. * @author xqx
  3. * @emil djlxqx@163.com
  4. * create at 2017/5/18
  5. * description: 自己写的类,人,包含姓名,年龄,性别
  6. */
  7.  
  8. public class XPatient {
  9. private String name; //姓名
  10. private int age; //年龄
  11. private int sex; //性别 1、男 2、女
  12.  
  13. public String getName() {
  14. return name;
  15. }
  16.  
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20.  
  21. public int getAge() {
  22. return age;
  23. }
  24.  
  25. public void setAge(int age) {
  26. this.age = age;
  27. }
  28.  
  29. public int getSex() {
  30. return sex;
  31. }
  32.  
  33. public void setSex(int sex) {
  34. this.sex = sex;
  35. }
  36.  
  37. @Override
  38. public String toString() {
  39. return "XPatient{" +
  40. "name='" + name + '\'' +
  41. ", age=" + age +
  42. ", sex=" + sex +
  43. '}';
  44. }
  45. }

  

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

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

  

  

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

  看一下变化:

      1、代码量少了很多

      2、get/set方法都没有了

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

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

  1. /*
  2. * @author xqx
  3. * @emil djlxqx@163.com
  4. * create at 2017/5/18
  5. * description: 自己写的类,人,包含姓名,年龄,性别
  6. */
  7.  
  8. class XPatient {
  9. var name: String? = null //姓名
  10. var age: Int = //年龄
  11. var sex: Int = //性别 1、男 2、女
  12.  
  13. override fun toString(): String {
  14. return "XPatient{" +
  15. "name='" + name + '\'' +
  16. ", age=" + age +
  17. ", sex=" + sex +
  18. '}'
  19. }
  20. }

二、定义类的构造方法

  首先看Java类的构造

  Java中定义构造方法特点:

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

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

      3、可以有多个构造方法

  1. //无参数的构造方法
  2. public JPatient() {
  3. }
  4.  
  5. //类的三个属性值都需要的构造方法
  6. public JPatient(String name, int age, int sex) {
  7. this.name = name;
  8. this.age = age;
  9. this.sex = sex;
  10. }

  

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

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

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

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

  1. class XPatient(name: String? ,age: Int ,sex: Int) { //主构造方法的形式 ,类名后面加(属性名 : 属性类型 .....)
  2. var name: String? = null //姓名
  3. var age: Int = //年龄
  4. var sex: Int = //性别 1、男 2、女
  5.  
  6. /*进行主构造函数的初始化,自己定制*/
  7. init {
  8. this.name = name;
  9. this.age = age+;
  10. this.sex = sex-;
  11. }
  12. ....
  13. }

    

  ②、二级构造方法:

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

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

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

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

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

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

    下面举例测试:

  1. class XPatient() {
    var name: String? = null //姓名
    var age: Int = 0 //年龄
    var sex: Int = 0 //性别 1、男 2、女
  2.  
  3. /*进行主构造函数的初始化*/
    init {
    Log.i("xqxinfo","调用了无参数的主构造方法");
    }
  4.  
  5. /*传入(name)*/
    constructor(name:String?):this( ){
    this.name = "Alice";
    Log.i("xqxinfo","调用了一个参数的二级构造方法");
  6.  
  7. }
    /*传入(name,age)*/
    constructor(name: String?,age : Int):this(name){
    this.age = age+1;
    Log.i("xqxinfo","调用了两个参数的二级构造方法");
    }
  8.  
  9. override fun toString(): String {
    return "XPatient{" +
    "name='" + name + '\'' +
    ", age=" + age +
    ", sex=" + sex +
    '}'
    }
    }

    进行测试:

  1. 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的类可以被继承

  继承形式:

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

注:方法即函数

浅谈Kotlin(三):类的更多相关文章

  1. 浅谈Kotlin(四):控制流

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 本篇介绍Kotlin ...

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

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 通过上面的文章,在A ...

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

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言: 今日新闻:谷 ...

  4. 浅谈C++三种传参方式

    浅谈C++三种传参方式 C++给函数传参中,主要有三种方式:分别是值传递.指针传递和引用传递. 下面通过讲解和实例来说明三种方式的区别. 值传递 我们都知道,在函数定义括号中的参数是形参,是给函数内专 ...

  5. 浅谈Kotlin中的函数

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/UV23Uw_969oVhiOdo4ZKAw作者:连凌能 Kotlin,已经被Android官方 ...

  6. 浅谈Perl的类、包、模块与面对对象编程

    http://blog.chinaunix.net/uid-27464093-id-3308003.html Perl面向对象 Perl面向对象学习例子实例代码教程 - 在我们了解perl的面向对象的 ...

  7. 【JAVA】浅谈java枚举类

    一.什么情况下使用枚举类? 有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便? 二.为什么不用静态常量来替代枚举类呢? public static final int SEASO ...

  8. 浅谈Servlet(三)

    一.三种作用域 作用域:web开发中用于存储和获得数据. 1.request 一次请求有效,在forward跳转时可用request作用域传递数据. 2.session client不变,sessio ...

  9. 浅谈java枚举类

    一.什么情况下使用枚举类? 有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便? 二.为什么不用静态常量来替代枚举类呢? public static final int SEASO ...

随机推荐

  1. 使用Json封装scroll,已处理其兼容性问题

    scroll.js /* 使用Json封装scroll */ function scroll(){ //标准模式(遵循W3C标准) if(pageYOffset!==null){ return { t ...

  2. win10安装MySQL5.7.21

    一. 下载MySQL 1. 打开MySQL官网,选择DOWNLOADS --> Community 2. 下拉页面找到MySQL on Windows(installers & tool ...

  3. VueJs(6)---V-on指令

    V-on指令 一.概述 v-on是用来绑定事件监听器,用在普通元素上时,只能监听原生 DOM 事件.用在自定义元素组件上时,也可以监听子组件触发的自定义事件. 在监听原生 DOM 事件时,方法以事件为 ...

  4. [Jenkins]Console Output中文显示问号的问题解决

    ------------------------------------------------------ 如需转载,请注明出处. 文章链接:https://www.cnblogs.com/dzbl ...

  5. HDU 1006 Tick and Tick 时钟指针问题

    Tick and Tick Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  6. 从零开始学 Web 之 Vue.js(六)Vue的组件

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  7. centos7非centos标准服务 /etc/init.d/service_name start || stop 启动异常

    公司自己写的java程序,在centos7系统执行/etc/init.d/service_name start||stop的时候报错: grafana二次开发的程序 [root@docp1 init. ...

  8. Docker 简述

    转自:https://cloud.tencent.com/developer/article/1354393 虚拟机和 docker 的区别,如下图: Image (镜像) 镜像不包含任何动态数据,其 ...

  9. WCF 的学习过程

    之前没有接触过WCF,这两天学习中.把遇到的问题和解决办法记下来. 遇到的问题: (1).HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理 ...

  10. Java线程池ThreadPoolExecutor使用和分析(一)

    相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...