浅谈Kotlin(三):类
浅谈Kotlin(一):简介及Android Studio中配置
前言:
已经学习了前两篇文章,对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(三):类的更多相关文章
- 浅谈Kotlin(四):控制流
浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 本篇介绍Kotlin ...
- 浅谈Kotlin(二):基本类型、基本语法、代码风格
浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 通过上面的文章,在A ...
- 浅谈Kotlin(一):简介及Android Studio中配置
浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言: 今日新闻:谷 ...
- 浅谈C++三种传参方式
浅谈C++三种传参方式 C++给函数传参中,主要有三种方式:分别是值传递.指针传递和引用传递. 下面通过讲解和实例来说明三种方式的区别. 值传递 我们都知道,在函数定义括号中的参数是形参,是给函数内专 ...
- 浅谈Kotlin中的函数
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/UV23Uw_969oVhiOdo4ZKAw作者:连凌能 Kotlin,已经被Android官方 ...
- 浅谈Perl的类、包、模块与面对对象编程
http://blog.chinaunix.net/uid-27464093-id-3308003.html Perl面向对象 Perl面向对象学习例子实例代码教程 - 在我们了解perl的面向对象的 ...
- 【JAVA】浅谈java枚举类
一.什么情况下使用枚举类? 有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便? 二.为什么不用静态常量来替代枚举类呢? public static final int SEASO ...
- 浅谈Servlet(三)
一.三种作用域 作用域:web开发中用于存储和获得数据. 1.request 一次请求有效,在forward跳转时可用request作用域传递数据. 2.session client不变,sessio ...
- 浅谈java枚举类
一.什么情况下使用枚举类? 有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便? 二.为什么不用静态常量来替代枚举类呢? public static final int SEASO ...
随机推荐
- 程序员IT计算机中常见英语单词
abstract 抽象的 abstract base class (ABC)抽象基类 abstract class 抽象类 abstraction 抽象.抽象物.抽象性 access 存取.访问 ac ...
- StringBuffer 和 StringBuilder 的 3 个区别
StringBuffer 和 StringBuilder 它们都是可变的字符串,不过它们之间的区别是 Java 初中级面试出现几率十分高的一道题.这么简单的一道题,栈长在最近的面试过程中,却经常遇到很 ...
- 面试题:两种方法计算n!
直接上代码package com.face.test; public class Test { /** * 面试题:递归方法计算n! */ @org.junit.Test public void di ...
- mysql 开发进阶篇系列 43 逻辑备份与恢复(mysqldump 的基于时间和位置的不完全恢复)
一. 概述 在上篇讲到了逻辑备份,使用mysqldump工具来备份一个库,并使用完全恢复还原了数据库.在结尾也讲到了误操作是不能用完全恢复的.解决办法是:我们需要恢复到误操作之前的状态,然后跳过误操作 ...
- AI历史和哲学基础浅谈
换个角度看AI:研究历史和哲学逻辑 正如题图所示,仿生人会梦见电子羊吗?(注:Do Androids Dream of Electric Sheep?是Philip K. Dick所著的一本科幻小说, ...
- Mybatis 事务管理
mybatis的事务和数据源有着非常密切的联系.上文讲述了mybatis的数据源,本文要讲述的便是mybatis的事物 1.事务的分类 我们还是已一段xml配置文件为例 <environment ...
- 减少重复代码的书写--Lombok
本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 在开发中,比如我们要写一个modol 实体类 要编写 get.set 这些获取和填值的方法,这样写也没错 ...
- ES6躬行记(8)——数字
一.进制 ES6不仅完善了数字的八进制形式,还补充了一种十六进制形式,并且添加了全新的二进制形式.下面的三个变量分别表示八进制.十六进制和二进制的10,注释中给出了该进制的另一种写法. var oct ...
- es6入门4--promise详解
可以说每个前端开发者都无法避免解决异步问题,尤其是当处理了某个异步调用A后,又要紧接着处理其它逻辑,而最直观的做法就是通过回调函数(当然事件派发也可以)处理,比如: 请求A(function (请求响 ...
- shiro源码篇 - shiro认证与授权,你值得拥有
前言 开心一刻 我和儿子有个共同的心愿,出国旅游.昨天儿子考试得了全班第一,我跟媳妇合计着带他出国见见世面,吃晚饭的时候,一家人开始了讨论这个.我:“儿子,你的心愿是什么?”,儿子:“吃汉堡包”,我: ...