欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解Kotlin中的面向对象(一)

程序员文章站 2023-12-18 09:00:58
kotlin中的面向对象 面向对象 面向对象的含义大家应该并不陌生,通过将事物抽象成对象,大大简化了程序的开发难度。我们常用的java、python、c++都属于面...

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

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

上一篇:

下一篇: