标签: Kotlin
1.Any类
我们都知道Java中每个类都有一个Object的默认父类,在Kotlin中也有,但是不是Object,
而是 Any 类,虽说都是所有类的共同父类,但是类组成却是不一样的,对比下就知道了:


2.类定义与对象实例化
Kotlin中不同于Java,允许在一个文件中定义多个类,另外,类实体是可选的,就是直接
class Test 这样,对的不用疑惑,可以不写大括号,当然这个一般用于表示概念(没什么
卵用)。而实例化类对象以及调用成员方法也很简单:


这里设置对象的属性Name,其实是调用了自动生成的setName()方法,对了,你
还可以自定义属性的getter和setter方法,做一些过滤或者一些附加操作,例如:

然后这里有个坑,就是如果你写成get() = trueHeight,会不停调用自身,然后OOM!
网上有人说在前面加个$,但实测不行,如果有解决方案的务必告知我!
另外,你还可以再get和set方法前加 private,这样可以禁止外部调用!
3.构造器(构造方法)
Kotlin中的构造器分为三种:
主构造器
规矩如下:
- 1.如果一个非抽象类没有声明任何主次构造器,那么会默认生成一个public 无参的主构造器!
- 2.一个类只有一个主构造器,类头部的一部分,在类名后,constructor(参数列表),
- 3.主构造器中不能包含任何代码,如果想写一些初始化代码,可以写到init初始化代码块中!
使用示例如下:

辅助构造器
规矩如下:
- 1.写在类中,可以有一个或者多个,用constructor关键字标识!
- 2.可以通过this()调用其他辅助构造器,但是任何一个辅助构造器都必须调用主构造器!
使用示例如下:

私有主构造器
其实就是在主构造器前加上一个private,然后就只能通过辅助构造器来实例化对象
使用示例如下:

4.继承
上一节常识那里也说了,Kotlin中继承父类或者实现接口,直接用 : 引号,如果有多个
可以用,逗号隔开;另外上一节看对应的Java代码我们知道了类的默认修饰符是: public final,
意味着这个类是不能改变的,如果你想进行一些重写的话,你需要在class前添加一个 open 关键字,
子类构造方法需要实现父类构造方法,而方法的修饰符也是final的,重写某个方法,同样需要在
方法前加上open关键字,而且重写的方法前还需加上override关键字;还有,你可以用 super
关键字来调用父类中的方法,这一点和Java中是一样的。
使用示例如下:

5.接口
Kotlin中的接口类似于Java8,支持抽象方法,抽象属性,还支持包含实现的方法
接口与其中的方法默认是 open 的和Java一样使用 interface 声明!
接口与抽象类的区别在于:接口不能存储状态数据,可以拥有属性,但是这些属性必须
是抽象的,或者提供访问器的自定义实现!
使用示例如下:

另外,如果一个需要实现的类或接口中包含同名方法,可以使用<>来指明调用的是哪个
父类方法!比如:

6.抽象类
和接口类似,默认是open的,但是对于抽象成员,需要使用 abstract 关键字声明!
使用示例如下:

7.内部类,匿名内部类的创建
类可以嵌套在其他类中,如果只是简单的嵌套,内部类是无法访问外部类成员的!
如果你想在内部类中访问外部成员,你需要使用 inner 关键字进行声明。
使用示例如下:

另外匿名内部类,Kotlin中会自动转成lambda表达式的形式,比如设置点击事件:
Java中:

Kotlin中:

因为OnClickListener匿名内部类中只有一个onclick方法,可以省略,如果是有
多个方法需要重写的匿名内部类,则要使用object关键字了,例子如下:

8.单例对象
Kotlin中 没有静态属性和方法,如果你想实现类似于单例的功能,
你可以使用关键字 object 声明一个对象,对象的构造器不能提供构造器参数,
在第一次使用的时候会被初始化,可用于提供常量或共享不可变对象!
使用示例如下:

9.伴生对象
除了上面的单例对象外,Kotlin 中还提供了伴生对象这种东西,使用 companion关键字声明,
可以直接 类.成员 访问成员,有点类似与静态成员,但是在运行时,他们依旧是实体的实例成员,
另外,使用companion关键字时,伴生对象的名称可以省略!
使用示例如下:

当然可能有一些强迫症患者硬是要用静态成员和静态方法的话,你可以用下述关键字:
静态成员:
- @JvmField 注解:生成与该属性相同的静态字段
- lateinit 关键字:延迟初始化,上一节定义空变量讲了~
- const 关键字:将 Kotlin 属性转换成 Java 中的静态字段(定义常量用)
静态方法:
- @JvmStatic 注解:在单例对象和伴生对象中生成对应的静态方法
使用示例如下:

10.数据类
就是只表示数据的类,用 data 进行声明,默认基于构造方法中实现了:
toString(), componentN(), copy(), equals() 和 hashCode() 方法,
另外,不在构造方法中定义的属性不会产生在toString()的结果中!
Data类可以直接使用 == 进行比较。
使用示例如下:

11.枚举类
Kotlin中的枚举与Java中基本类似,用 enum 声明为枚举类
最基本的用法是实现类型安全的枚举,比如,要你表示周一到周日,大部人会使用1-7,
如果出现了异常情况,用户输入了0或者8,枚举可以看做对输入的数据类型做了限制
只能是枚举中的某一个,从而实现了所谓的类型安全。
使用示例如下:


除此之外,你还可以通过valueOf("名字")类匹配或者values()拿到一个Array,
然后进行遍历~
12.封闭类
用于限制类的层次结构,值只能是集合中的类型,不可以是其他任何类型,
可以理解成 "扩展的枚举类",但与枚举有些不同:
枚举中的实例是唯一的,而封闭类可以有很多实例,他们可以有不同的状态,
使用关键字 sealed 声明(内部的类都是本身的子类)另外该关键字不能修饰接口或抽象类,会报
waring,但不会出现编译错误。另外有一点要区分:
直接子类必须都写在封闭类中!!! 封闭类子类的扩展可以在任何地方,而无需在同一个文件中!
使用密封类的最主要的的好处体现在你使用 when 表达式,可以确保声明可以覆盖到所有的情形,不需要再使用
else 情形。
PS:在Kotlin 1.1中允许使用data数据类继承!
使用示例如下:



网友评论