Kotlin(二):类和接口

本文详细介绍了Kotlin语言的关键特性,包括类与对象的定义、属性的声明与访问、构造函数的使用、继承与重写的实现方式、以及接口的概念与应用。此外还探讨了嵌套类和内部类的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

kotlin类包含:构造函数和初始化代码块、函数、属性、内部类、对象声明

类属性
setter and getter

setter 和getter 和java完全不一样
kotlin的声明方法

var <propertyName>[: <PropertyType>] [= <property_initializer>]
    [<getter>]
    [<setter>]

实例

class Person {

    var lastName: String = "zhang"
        get() = field.toUpperCase()   // 将变量赋值后转换为大写
        set

    var no: Int = 100
        get() = field                // 后端变量
        set(value) {
            if (value < 10) {       // 如果传入的值小于 10 返回该值
                field = value
            } else {
                field = -1         // 如果传入的值大于等于 10 返回 -1
            }
        }

    var heiht: Float = 145.4f
        private set
        
// 测试
fun main(args: Array<String>) {
    var person: Person = Person()

    person.lastName = "wang"

    println("lastName:${person.lastName}")

    person.no = 9
    println("no:${person.no}")

    person.no = 20
    println("no:${person.no}")

}
}

Kotlin 中类不能有字段。提供了 Backing Fields(后端变量) 机制,备用字段使用field关键字声明,field 关键词只能用于属性的访问器

通俗来说,field相当于this.属性名

构造函数
主构造器

主构造器是在类名旁边进行声明的,使用关键字constructor(可省略) 带上传入的的参数。

class Person constructor(firstName: String) {
    init {
        println("FirstName is $firstName")
    }
}

在主构造器中不能写任何代码,因此类的初始化只能交由init{} 代码块中执行,在init{}可以调用主构造器传入的参数。

实例
创建一个类,并通过构造函数传入值

class Demo (name:String){
   var name:String = name
}

// 在main函数中   输出结果为 xxxx
  var demo : Demo = Demo("xxxx")
    print(demo.name)
    
次构造器

次构造函数必须要加前缀

// 第一种方式
class Demo{
    
    constructor(age:Int,name:String){

    }

}

// 第二种方式
class Demo (name:String){

    constructor(age:Int,name:String) : this(name){

    }

}

如果类有主构造函数,每个次构造函数都要,或直接或间接通过另一个次构造函数代理主构造函数。在同一个类中代理另一个构造函数使用this关键字
换言之,如果类有主构造器,那么如果要声明次构造器则必须调用主构造器

私有构造器
class DontCreateMe private constructor () {
}
静态方法

在实现私有构造器后,就无法通过常规方法创建对象,因此可以通过静态方法获取一个实例。
在kotlin中如何实现静态方法

// 方法一
companion object {
     fun test(){
        、、、
      }
}
// 方法二
companion object StaticParams {
     fun test(){
        、、、
      }
}

companion object {}中可以包含静态常量,或者静态方法,单例等等。

在声明属性的时候就需要对setter和setter进行声明(也可以无视,不声明)

继承

Kotlin中所有类都继承Any类,它是所有类的超类

如果一个类要被继承,可以使用open关键字进行修饰

kotlin继承一个类的方式和C#类似 使用 ‘’ 冒号

open class Base(p: Int)           // 定义基类
class Derived(p: Int) : Base(p)
重写

使用fun声明函数时,默认会使用final修饰,因此无法被重写,如果需要被重写基类的函数需要使用open修饰,而子类的函数需要使用override关键字

/**用户基类**/
open class Person{
    open fun study(){       // 允许子类重写
        println("我毕业了")
    }
}

/**子类继承 Person 类**/
class Student : Person() {

    override fun study(){    // 重写方法
        println("我在读大学")
    }
}

嵌套类和内部类

嵌套类和内部类都是一个类写在另一个类里,但是它们是有区别的

// 嵌套类
class Outer {                  // 外部类
    private val bar: Int = 1
    class Nested {             // 嵌套类
        fun foo() = 2
    }
}

// 内部类
class Demo {
    var name = "Chenchangsheng"
    var age = 99
    inner class DemoInner{
        // 可以访问外部类的的属性
        var innerName=name;
        fun getOutterDemo(){
            // 通过标签分别获取外部类和内部类的对象
            var outer = this@Demo
            var inner = this@DemoInner
        }
    }
}

可以发现 内部类必须使用。inner 关键字定义 并且 与嵌套类不同的是,内部类持有外部类的引用,可以访问外部类的属性和方法

接口

kotlin 接口与java8类似,使用interface关键字定义接口,允许方法有默认实现(java8之后支持接口方法有默认实现,声明方法的时候 使用static或default关键字定义)

实现接口
open class A{
}
interface B{
}
// 继承类 
class C:A(){
}

// 实现接口
class D:B{
}

注意在继承类的时候会比实现接口对一对括号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值