Kotlin学习(六) --其他特殊的类
2018-02-25 21:45
225 查看
Kotlin的特殊的类
把之前学的kotlin知识总结一下哈,区别于java kotlin有很多特殊的类,主要就是根据安卓开发设计的感觉。数据类
这个数据类就很关键了,可以节约好多开发的时间,尤其是在解析json数据时候,自己创建的类的时候,用数据类就很方便。格式:data class 类名(var param1 :数据类型,…){}
关键字:data
举个例子:在java中一个数据类如下
public class Person { private String name; private String surname; private String id; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } public String getId() { return id; } public void setId(String id) { this.id = id; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; if (name != null ? !name.equals(person.name) : person.name != null) return false; if (surname != null ? !surname.equals(person.surname) : person.surname != null) return false; return id != null ? id.equals(person.id) : person.id == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + (surname != null ? surname.hashCode() : 0); result = 31 * result + (id != null ? id.hashCode() : 0); return result; } @Override public String toString() { return "Person{" + "name='" + name + ''' + ", surname='" + surname + ''' + ", id='" + id + ''' + '}'; } }
但在kotlin里面我们可能只需要一行。。。。emmmmmm
data class Person(var name: String, var surname: String, var id: String)
其中我们就可以发现省了好多的代码,,查资料我发现kotlin的数据类帮我们做了好多的事
当我们声明一个数据类时,编辑器自动为这个类做了一些事情,不然它怎么又比Java简洁呢。它会根据主构造函数中所定义的所有属性自动生成下列方法:
1生成equals()函数与hasCode()函数
2生成toString()函数,由类名(参数1 = 值1,参数2 = 值2,….)构成
3由所定义的属性自动生成component1()、component2()、…、componentN()函数,其对应于属性的声明顺序。
4copy()函数。
copy函数的用法
在数据类的特殊copy函数就是可以局部修改部分属性,但是保持其他不变就像下面的例子
val mUser = User("笑笑","16") println(mUser) val mNewUser = mUser.copy(name = "小笑笑") println(mNewUser)
输出结果是:
User(name=笑笑, pwd=16)
User(name=小笑笑, pwd=16)
解构声明
Kotlin中定义一个数据类,则系统会默认自动根据参数的个数生成component1() … componentN()函数。其…,componentN()函数就是用于解构声明的 个人理解就是可以是单独把数据类对象的个别变量的值得出来 看下下面的例子val mUser = User("笑笑,"17") val (name,pwd) = mUser println("name = $name\tpwd = $pwd")
输出结果:
name = 笑笑 pwd = 17
抽象类
这个和java里面的抽象类差不多一样的关键字:abstract
abstract可以修饰类 也可以修饰抽象类里面的变量和方法
举例子
abstract class Lanauage{ val TAG = this.javaClass.simpleName // 自身的属性 // 自身的函数 fun test() : Unit{ // exp } abstract var name : String // 抽象属性 abstract fun init() // 抽象方法 } class TestAbstarctA : Lanauage(){ override var name: String get() = "Kotlin" set(value) {} override fun init() { println("我是$name") } } class TestAbstarctB : Lanauage(){ override var name: String get() = "Java" set(value) {} override fun init() { println("我是$name") } } fun main(args: Array<String>) { // val lanauage = Lanauage() 是错误的,因为抽象类不能直接被实例化 val mTestAbstarctA = TestAbstarctA() val mTestAbstarctB = TestAbstarctB() println(mTestAbstarctA.name) mTestAbstarctA.init() println(mTestAbstarctB.name) mTestAbstarctB.init() }
输出结果:
Kotlin
我是Kotlin
Java
我是Java
抽象类本身具有普通类特性,以及组成部分。不过值得注意的是,抽象类不能直接被实例化
其抽象了类的子类必须全部重写带abstract修饰的属性和方法。
抽象成员只有定义,没有实现。都有abstract修饰符修饰。
抽象类是为其子类定义了一个模板。不同是类实现不同的功能
抽象类中可以定义内部抽象类。
只能继承一个抽象类。
若要实现抽象类的实例化,需要依靠子类采用向上转型的方式处理。
抽象类可以继承自一个继承类,即抽象类可以作为子类。
内部类
在安卓开发中内部类和匿名内部类都是很常见的关键字:inner
格式:inner class 类名(参数){}
class Other{ // 外部类 val numOther = 1 inner class InnerClass{ // 嵌套内部类 val name = "InnerClass" fun init(){ println("我是内部类") } } } fun main(args: Array<String>) { Other().InnerClass().init() }
输出结果:我是内部类
注意:调用内部类的属性或方法的格式为:外部类().内部类().内部类方法/属性。在调用的时候嵌套类是需要实例化的。
内部类不能使用外部类的属性和成员
在这里注意内部类和嵌套类的区别
1 嵌套类没有关键字/所谓的嵌套类:即指一个类可以嵌套在其他类中。
2嵌套类可以直接创建实例,方式是包装类.嵌套类
val nested : Outter.Nested()
3内部类不能直接创建实例,需要通过外部类调用
val outter = Outter()
outter.Inner().execute()
4 嵌套类的调用方法 外部类.内部类().内部类方法/属性
ps就是没带括号啊啊啊啊啊
匿名内部类
这个安卓开发经常用在开发中,匿名内部类随处可见。比如说Button的OnClickListener,ListView的单击、长按事件等都用到了匿名内部类。 一般的使用方式为定义一个接口,在接口中定义一个方法。class Other{ lateinit private var listener : OnClickListener fun setOnClickListener(listener: OnClickListener){ this.listener = listener } fun testListener(){ listener.onItemClick("我是匿名内部类的测试方法") } } interface OnClickListener{ fun onItemClick(str : String) } fun main(args: Array<String>){ // 测试匿名内部类 val other = Other() other.setOnClickListener(object : OnClickListener{ override fun onItemClick(str: String) { // todo println(str) } }) other.testListener() }
接口中的属性使用
在接口中申明属性。接口中的属性要么是抽象的,要么提供访问器的实现。接口属性不可以有后备字段。而且访问器不可以引用它们。接口里面都是抽象的方法必须靠继承类来实例化它的方法关键字:interface
格式:interface 接口名{
…
}
fun main(args: Array<String>) { // 类的初始化 var demo = Demo1() demo.fun1() } /** * 我定义的接口 */ interface Demo1Interface{ // 定义的方法 fun fun1() } /** * 接口的实现类 */ class Demo1 : Demo1Interface{ override fun fun1() { println("我是接口中的fun1方法") } }
总结
这几天就看了几个kotlin类的相关知识,,,还有密封类什么的看不太懂相关文章推荐
- Kotlin学习笔记5-4 其他-类型检查与转换
- Kotlin学习笔记5-1 其他-解构声明
- html学习笔记(1)--处理特殊字符以及其他的一些小细节
- Kotlin学习笔记5-5 其他-This表达式
- Linux学习笔记--命令的顺序执行、管道符、通配符、其他特殊符号
- Kotlin学习笔记5-8 其他-空安全
- Kotlin学习笔记5-2 其他-集合
- Kotlin语言学习之将函数作为参数传递,使用双冒号::引用其他方法
- Kotlin学习笔记5-3 其他-区间
- 【CodeSmith学习笔记】:特殊字符如何包含在模板中和模板引用其他文件
- Hibernate学习:二(持久化对象的生命周期),有参考其他资料
- Kotlin学习笔记(1)- 环境配置
- Kotlin新手学习教学路程
- asp.net学习Request和Response的其他属性
- linux学习笔记-----其他文件权限管理命令
- JAVA学习笔记46——其他容器简介3:guava只读控制+函数式编程+集合操作
- 学习kotlin 记录笔记。----hello word
- Cougaar学习笔记之---定制特殊的AspectType和AspectValue
- 一步步学习kotlin for android(三) kotlin省略findviewById
- sql语句 查询表中 每门课都大于80分的学生名称 根据以下三种 学习sql 中其他函数的使用