详解Kotlin中的面向对象(一)
作者:steveyg 发布时间:2023-08-17 12:57:38
Kotlin中的面向对象
面向对象
面向对象的含义大家应该并不陌生,通过将事物抽象成对象,大大简化了程序的开发难度。我们常用的Java、Python、C++都属于面向对象的编程语言。Kotlin和java很相似,也是一种面向对象的语言。作为Kotlin中最重要的一部分,我们可以通过了解Kotlin的OOP进而了解这门语言,本文将从类、属性、接口、对象等多个方面介绍Kotlin的面向对象的特性。
类
和大部分语言类似,Kotlin使用class作为类的关键字,当我们声明一个类时,需要通过class加类名的方式实现:
class ClassDemo{
}
在声明一个类的时候,至少需要包含class关键字以及后面的类名,同时也可以根据需要增加类头(用来声明一些参数)和类体(花括号{}中包含的内容,可省略)。
构造函数
与java不同的是,虽然都可以包含多个构造函数,但java中的各个构造函数都是平级的,而Kotlin中却分为了两级(主构造函数和二级构造函数),主构造函数是包含在类头中的,需要在init方法中实现额外的操作,而二级构造函数可以在函数体中实现所有操作
//主构造函数,constructor和init都可省略
class ClassDemo constructor(type:String){
init{
System.out.println(type)
}
}
在主构造函数中传入的参数可以在类体中为属性赋值,也可以直接在主构造函数中声明
class ClassDemo(type:String, var prop2: String = type){
var prop1 = type
}
二级构造函数必须包含constructor
class ClassDemo{
constructor(type:String){
System.out.println(type)
}
}
对于有主构造函数的类而言,每个二级构造函数都要,或直接或间接通过另一个二级构造函数代理主构造函数。在同一个类中代理另一个构造函数使用 this 关键字:
//包含主构造函数的二级构造函数
class ClassDemo(type:String){
constructor(type:String, param:String):this(type){
System.out.println(type + param)
}
}
无论有没有声明主构造函数,Kotlin都会提供一个构造函数的方法,有时可能不希望将某个类的构造函数暴露出来(比如实现单例模式时),那么就需要对主构造函数进行处理
class ClassDemo private constructor(){
}
当我们想创建实例时,可以直接调用对应的构造函数进行创建
var demo = ClassDemo("hello world")
val demo = ClassDemo("hello","world")
我们注意到,在Kotlin中无论是声明属性还是创建实例,会有两种方式,var和val,val类似于java中的final,通过它声明的内容是无法变化的,而var和val相反,声明的内容既可以读取也可以修改。
继承
在Kotlin中,所有的类会默认继承Any这个父类,但Any并不完全等同于java中的Object类,因为它只有equals(),hashCode()和toString()这三个方法。当我们想定义一个父类时,需要使用open关键字
open class Base{
}
然后在子类中使用冒号“:”进行继承
class SubClass : Base(){
}
如果父类有构造函数,那么必须在子类的主构造函数中进行继承,没有的话则可以选择主构造函数或二级构造函数
//父类
open class Base(type:String){
}
//子类
class SubClass(type:String) : Base(type){
}
重写
Kotlin中的重写和java中也有所不同,因为Kotlin提倡所有的操作都是明确的,因此需要将希望重写的方法设为open
open fun funDemo() {}
然后通过override标记实现重写
override fun funDemo() {
super.funDemo()
}
override重写的函数也是open的,如果希望它不被重写(前提是这个类可以被继承),可以在前面增加final标签
open class SubClass : Base{
constructor(type:String) : super(type){
}
final override fun funDemo() {
super.funDemo()
}
}
当一个类同时继承且实现了多个接口时,如果重写的方法在父类和接口中都有定义,那么可以通过super<>的方式进行继承
//接口
interface InterfaceDemo{
fun funDemo(){}
}
//继承Base并且实现InterfaceDemo
class SubClass : Base(),InterfaceDemo{
final override fun funDemo() {
super<Base>.funDemo()
super<InterfaceDemo>.funDemo()
}
}
密封类
密封类用于代表严格的类结构,值只能是有限集合中的某中类型,不可以是任何其它类型。这就相当于一个枚举类的扩展:枚举值集合的类型是严格限制的,但每个枚举常量只有一个实例,而密封类的子类可以有包含不同状态的多个实例。声明密封类需要在 class 前加一个 sealed 修饰符。密封类可以有子类但必须全部嵌套在密封类声明内部。
//密封类
sealed class Expr {
class Const(val number: Double) : Expr()
class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
}
和Kotlin中的类相关的用法就介绍到这里,文中的完整代码见github,在Kotlin中的面向对象(二)中将会介绍属性、接口等面向对象过程中同样常见的内容。
文章代码下载:http://xiazai.jb51.net/201706/yuanma/helloKotlin-master(jb51.net).rar
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
来源:http://blog.csdn.net/steveyg/article/details/72676481
猜你喜欢
- 有很多应用场景,用到了接口动态实现,下面举几个典型的应用:1、mybatis / jpa 等orm框架,可以在接口上加注解进行开发,不需要编
- 前言gps定位服务的学习是这段时间gps课程的学习内容,之前老师一直在将概念,今天终于是实践课(其实就是给了一个案例,让自己照着敲).不过在
- 茫茫人海千千万万,感谢这一秒你看到这里。希望我的面试题系列能对你的有所帮助!共勉!愿你在未来的日子,保持热爱,奔赴山海!Java基础知识(继
- 开发环境win10Android Studio效果用于多级菜单展示,或选择。如 每个省,市,县;如 树木的病虫害;关键代码 @overrid
- 英文设置加粗可以在xml里面设置: <SPAN style="FONT-SIZE: 18px">androi
- 在android开发中,经常会遇到一个view需要它能够支持滑动的需求。下面通过本篇文章给大家介绍android view移动的六种方法。l
- 前言在Windows下JAVA用到的环境变量主要有3个,JAVA_HOME、CLASSPATH、PATH,下面来详细的介绍。JAVA_HOM
- 什么是接口?说到接口,USB大家肯定不陌生~接口是一种标准、规范.注意:接口一旦制定好,使用者和实现者都必须遵循的标准.接口的语法: (JD
- 一、reservedcodecachesize参数介绍该参数是JvM虚拟机调优中调整内存大小的一个设置参数,值得大小设置直接影响到Code
- 本文实例为大家分享了java中文传值乱码问题,以及解决方法,供大家参考,具体内容如下一般编码格式设置:1.可以经过两次编码处理,即设置字符集
- 前言最近在优化自己之前基于Spring AOP的统一响应体的实现方案。什么是统一响应体呢?在目前的前后端分离架构下,后端主要是一个RESTf
- 在项目开发中,我们经常会遇到表中的字段名和表对应实体类的属性名称不一定都是完全相同的情况,下面小编给大家演示一下这种情况下的如何解决字段名与
- 1、代码设计的代理模式代理模式属于构建型模式(Proxy),提供了对目标对象的一种访问方式; 即通过代理对象访问目标对象。这样做的好处是:可
- 本文实例讲述了Java Swing组件布局管理器之FlowLayout(流式布局)。分享给大家供大家参考,具体如下:FlowLayout应该
- 最近公司需要做一个告警页面的功能,需要分页,查了很多资料发现PageHelper比较合适故写一篇从零开始的PageHelper使用的教程,也
- 这篇文章主要介绍了Spring JDK * 实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- Apache Dubbo是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡
- 本文实例为大家分享了Struts2框架拦截 器实例的示例代码,供大家参考,具体内容如下在看拦截 器的小例子的前我们先来看看sturts2的原
- Java 和 Groovy 中的映射map都是非常通用的,它允许关键字key和值value为任意类型,只要继承了 Object&n
- 实现的效果图:自定义Fragment继承BottomSheetDialogFragment重写它的三个方法:onCreateDialog()