(新) Kotlin搞起来 —— 4.类与对象

(新) Kotlin搞起来 —— 4.类与对象

标签: Kotlin

本文声明
本文由Coder-pig编写,想了解其他内容,可见Coder-Pig的猪栏
尊重作者劳动成果,未经本人授权,禁止转载!违者必究!
《Kotlin搞起来》系列目录地址:http://blog.csdn.net/coder_pig/article/details/72851862


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数据类继承!

使用示例如下


  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值