Kotlin语言(2)-OOP

类与对象

Kotlin中也是使用class关键字来声明一个类的,这一点与Java一致。

class Person{
	var name = ""
	var age = 0
	
	fun eat(){
		println(name + " is eating. He is " + age + " years old. ")
	}
}

Kotlin对这个类进行实例化,这个跟Java的基本类似,但是去掉了new的关键字。当你调用了某个类的构造函数时,你的意图只可能是对这个类进行实例化,没必要使用new关键字,就去掉了。

val p = Person()

fun main(){
	val p = Person()
	p.name = "Jack"
	p.age  = 19
	p.eat()
}

继承与构造函数

继承

1、使Person类可以被继承,除了抽象类,非抽象类默认是不可被继承的。加上open关键字这个类就可以被继承了。

open class Person{
	var name = ""
	var age = 0
	
	fun eat(){
		println(name + " is eating. He is " + age + " years old. ")
	}
}

2、要让Student类继承Person类。在Java中的继承关键字是extends,而在Kotlin中变成了一个冒号,写法如下:

class Student : Person(){
	var name = "Jack"
	var age = 18
}

主构造函数和次构造函数

主构造函数

主构造函数是常用的构造函数,每个类都会默认有一个不带参数的主构造函数,当然也可以给它显式地给它指明参数。主构造函数的特点是没有函数体,直接定义在类名后面即可。

class Student(val sno: String,val grade: Int) : Person(){
}

这里我们将学号和年级这两个字段都放到了主构造函数中,这就表明在对Student进行实例化的时候,必须要传入构造函数中要求的所有参数。

val student = Student("a123" , 5)

需要在主构造函数里编写一些逻辑,Kotlin给我们提供了一个init结构体,所有主构造函数中的逻辑都可以写在里面。
无参数主构造函数:

class Student(val sno: String,val grade: Int) : Person(){
	init{
		println("sno is " + sno)
		println(" grade is " + grade)
	}
}

有参主构造函数:

open class Person(val name: String, val age: Int){
...
}

class Student(val sno: String, val grade: Int,name: String,age: Int) : 
	Person(name,age){
}

val student = Student("a123",5,"Jack",19)
次构造函数

任何一个类只能有一个主构造函数,但可以有多个次构造函数。次构造函数可以用于实例化一个类,这一点和主构造函数没什么不同,只不过它是有函数体的。

class Student(val sno: String, val grade: Int,name: String,age: Int) : 
	Person(name,age){
	constructor(name: String,age: Int) : this("",0,name,age){
	}
	constructor() : this("",0){
	}
}

次构造函数是通过constructor关键字来定义的,这里我们定义了两个次构造函数:第一个次构造函数接收name和age参数,然后它有通过this关键字调用了主构造函数,并将sno和grade这两个参数赋值成初始值;第二个次构造函数不接收任何参数,它通过this关键字调用了我们刚才定义的第一个次构造函数,并将name和age参数也赋值成初始值,由于第二个次构造函数间接调用了主构造函数,因此这是合法的。

val student1 = Student()
val student2 = Student("Jack",19)
val student3 = Student("a123",5,"Jack",19)

!!!一种非常特殊的情况
类中只有次构造函数,没有主构造函数。当一个类没有显式地定义主构造函数且定义了次构造函数时,它就是没有主构造函数的。

class Student : Person{
	constructor(name: String,age: Int) : super(name,age){
	}
}

由于没有主构造函数,次构造函数只能直接调用父类的构造函数,上述代码也是将this换成了super关键字。还有Person不用加括号,有主构造函数就加没有就不加。

接口

!!!接口中的函数不要求有函数体

interface Study{
	fun readBooks()
	fun doHomework()
}

class Student(name: String,age: Int): Person(name,age),Study{
	override fun readBooks(){
		println(name + "is reading.")
	}
	override fun doHomework(){
	println(name + "is doing homework.")
	}
}
//多态
fun main(){
	val student = Student("Jack",19)
	doStudy(student)
}

fun doStudy(study: Study){
	study.readBooks()
	study.doHomework()
}

接口中函数的默认实现,就是不管在实现类中重写了该函数,还是没有实现该函数,但还是会执行在接口中默认实现的函数体。

interface Study{
	fun readBooks(){
	}
	fun doHomework(){
		println("do homework default implementation.")
	}
}

在实现接口的类中可以不强制实现默认实现的函数,但是函数没有默认实现的话是需要强制实现的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
根据提供的引用内容,出现了两个关于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. 如果上述步骤***切换到其他网络环境来解决这个问题。 希望以上步骤能够帮助你解决问题。如果你还有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

特辣番茄炒鸡蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值