浅谈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 = //年龄
var sex: Int = //性别 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 = //年龄
var sex: Int = //性别 1、男 2、女 /*进行主构造函数的初始化,自己定制*/
init {
this.name = name;
this.age = age+;
this.sex = sex-;
}
....
}

    

  ②、二级构造方法:

    为了实现类似于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类的类

注:方法即函数

浅谈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. 程序员IT计算机中常见英语单词

    abstract 抽象的 abstract base class (ABC)抽象基类 abstract class 抽象类 abstraction 抽象.抽象物.抽象性 access 存取.访问 ac ...

  2. StringBuffer 和 StringBuilder 的 3 个区别

    StringBuffer 和 StringBuilder 它们都是可变的字符串,不过它们之间的区别是 Java 初中级面试出现几率十分高的一道题.这么简单的一道题,栈长在最近的面试过程中,却经常遇到很 ...

  3. 面试题:两种方法计算n!

    直接上代码package com.face.test; public class Test { /** * 面试题:递归方法计算n! */ @org.junit.Test public void di ...

  4. mysql 开发进阶篇系列 43 逻辑备份与恢复(mysqldump 的基于时间和位置的不完全恢复)

    一. 概述 在上篇讲到了逻辑备份,使用mysqldump工具来备份一个库,并使用完全恢复还原了数据库.在结尾也讲到了误操作是不能用完全恢复的.解决办法是:我们需要恢复到误操作之前的状态,然后跳过误操作 ...

  5. AI历史和哲学基础浅谈

    换个角度看AI:研究历史和哲学逻辑 正如题图所示,仿生人会梦见电子羊吗?(注:Do Androids Dream of Electric Sheep?是Philip K. Dick所著的一本科幻小说, ...

  6. Mybatis 事务管理

    mybatis的事务和数据源有着非常密切的联系.上文讲述了mybatis的数据源,本文要讲述的便是mybatis的事物 1.事务的分类 我们还是已一段xml配置文件为例 <environment ...

  7. 减少重复代码的书写--Lombok

    本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 在开发中,比如我们要写一个modol 实体类 要编写 get.set 这些获取和填值的方法,这样写也没错 ...

  8. ES6躬行记(8)——数字

    一.进制 ES6不仅完善了数字的八进制形式,还补充了一种十六进制形式,并且添加了全新的二进制形式.下面的三个变量分别表示八进制.十六进制和二进制的10,注释中给出了该进制的另一种写法. var oct ...

  9. es6入门4--promise详解

    可以说每个前端开发者都无法避免解决异步问题,尤其是当处理了某个异步调用A后,又要紧接着处理其它逻辑,而最直观的做法就是通过回调函数(当然事件派发也可以)处理,比如: 请求A(function (请求响 ...

  10. shiro源码篇 - shiro认证与授权,你值得拥有

    前言 开心一刻 我和儿子有个共同的心愿,出国旅游.昨天儿子考试得了全班第一,我跟媳妇合计着带他出国见见世面,吃晚饭的时候,一家人开始了讨论这个.我:“儿子,你的心愿是什么?”,儿子:“吃汉堡包”,我: ...