Kotlin 类型初步 - 类和接口

1. 类

1.1 类的定义

学一个类的定义,只需要掌握他的属性和方法的定义,那么类就基本上可以使用了

1.2 类的成员

Kotlin中的变量必须初始化,让我们一定要培养这个意识,对自己定义的所有的成员负责到底,定义出来之后,就要负责初始化,不然得话就是一个不清不楚的状态,而且编译器做这种过多的工作,也会容易产生错误。 java中如果类成员没有初始化,编译器会给成员变量赋值0,如果是对象的话,赋值null.

1.3 类的构造方法

1.2.1 定义:构造方法就是我们在创建对象的时候,调用的方法,就是构造方法

1. 
class SimpleClass {
    var x: int
    
    // 构造方法不是和类名一样
    // 明确的使用constructor, 这个方法是构造器
    constructor(x: Int) {
        this.x = x
    }
    ...

}

2. 简化: 
构造器挪到类的定义这一行,上面的constructor是一个副构造器.
和类名写在一起的是主构造器
主构造器要求其他所有的构造器都要调用它,就是说要求类的实例化路径只有一条
class SimpleClass
        constructor(x: Int) {
    var x: Int = x
    ...
}

3. 再简化:
构造器和类名都放在一起了,肯定知道他是构造器,所以可以将constructor省略
把构造器提到了类声明的这一行
class SimpleClass(x:Int) {
    var x: Int = x
    ...
}

4. 还可以再简化:
 观察3中类的属性,使用构造器的参数初始化,这样的化,还可以进一步简化为
所以如果我们给构造器的参数加了一个var 或者val ,那么他定义了类的属性
class SimpleClass(var x:Int) {
    ...
}
class SimpleClass(var x: Int, val y: String)
    : AbsClass(), SimpleInf {
    
    // 再定义一个成员, 成员定义在这个位置,和定义在类构造函数中有什么区别呢?
    // 从成员的角度来看,没区别。只不过,定义在构造器中,相当于这个成员本身需要通过构造器来初始化。
    // 定义的z 在使用的时候和x, y没有区别,见main函数
    val z: Long = 0L
    

    override fun absMethod(){}
    override fun simpleMethod(){}

    fun y(){}
}


fun main(varags args: String) {

    val simpleClass = SimpleClass(9, "Hello")
    
    println(simpleClass.x)
    println(simpleClass.y)
    println(simpleClass.z)

    // 调用方法
    simpleClass.y()
}

1.4 kotlin 类的实例化和java的对比

2. 接口

2.1 接口的定义

接口中的方法默认都是public,都是提供给外部调用的

2.2 接口的实现

注意implements 和 ":"

java中的@Override可以不写

kotlin中的override必须写,不写编译会报错

3. 抽象类的定义

Kotlin中抽象类的可见性默认为public, 抽象类的抽象方法默认可复写,普通的方法不可以被复写

抽象方法一定是用来被复写的 关键字为 abstract

其他普通的方法 kotlin默认是不可以复写的, 加了关键字open才可以被复写。java默认是可以复写,加了final之后,不能被复写

4. 类的继承

kotlin中继承使用":" , 并且父类需要调用构造器

// 抽象类
abstract class AbsClass {
    // 抽象方法
    abstract fun absMethod()
    
    // 关键字open 可复写的方法
    open fun overridable(){}
    
    // 默认不可复写方法
    fun nonOverridable(){}
}
// 定义接口
interface SimpleInf {
    
    // 在kotlin中可以定义属性property
    var simpleProperty: Int

    fun simpleMethod()
}
open class SimpleClass(var x: Int, val y: String)
    : AbsClass(), SimpleInf {

    val z: Long = 0L
    
    override fun absMethod(){}
    override fun simpleMethod(){}

    // 复写抽象类的open函数
    override fun overridable() {
    }

    // overridable不想被其他类继承
    // final override fun overridable(){}
    
    fun y(){}
}

// 1. 要定义SimpleClass2继承SimpleClass, SimpleClass要声明为open。
// 2. 类SimpleClass的构造函数带有参数,所以SimpleClass2的构造函数需要传参
class SimpleClass2(var x: Int, var y: String) : SimpleClass(x, y) {

    // 复写父类的overridable函数
    // 子类SimpleClass集成同时AbsClass的open方法
    // 如果子类的overridable函数不想被继承,在SimpleClass类使用final修复方法overridable。
    override fun overridable() {}

}
fun main(vararg args: String) {
    val simpleClass = SimpleClass(9, "Hello")
    println(simpleClass.x)
    println(simpleClass.y)
    println(simpleClass.z)

    simpleClass.y()
    simpleClass.zzz("Sleeping ZZZ!")
    
}

  • 21
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,出现了两个关于Kotlin的错误信息。第一个引用中显示了一个无法解析依赖的错误,指出无法下载kotlin-reflect.jar文件。第二个引用中显示了一个关于kotlin-gradle-1.8.10.jar (org.jetbrains.kotlin:kotlin-reflect)",这个错误通常是由于Gradle无法找到所需的kotlin-reflect库而引起的。解决这个问题的方法是确保你的项目的Gradle配置正确,并且指定了正确的Kotlin版本。 你可以尝试以下几个步骤来解决这个问题: 1. 确保你的项目的build.gradle文件中包含了正确的Kotlin版本和kotlin-gradle-plugin版本。你可以在build.gradle文件中找到似于以下代码的部分: ```groovy ext { kotlin_version = '1.8.10' } dependencies { // ... implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" // ... } buildscript { // ... dependencies { // ... classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // ... } } ``` 请确保kotlin_version变量的值与你想要使用的Kotlin版本一致,并且在dependencies和buildscript的classpath中正确引用了kotlin-gradle-plugin。 2. 如果你已经确认了build.gradle文件中的配置正确无误,那么可能是因为Gradle无法从远程仓库下载kotlin-reflect.jar文件。你可以尝试清除Gradle的缓存并重新构建项目。在命令行中执行以下命令: ```shell ./gradlew clean ``` 然后重新构建项目: ```shell ./gradlew build ``` 这将清除Gradle的缓存并重新下载所需的依赖。 3. 如果上述步骤***切换到其他网络环境来解决这个问题。 希望以上步骤能够帮助你解决问题。如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值