抓住今天,尽可能少的信赖明天。 喝汤能补 (* ^ ▽ ^ *)
前言
该文章作为学习交流,如有错误欢迎各位大佬指正 (* ^ ▽ ^ *)
- 自身技能
(1)已具备计算机的基本知识 - 本文简介
主要讲解:类的语法,继承语法,接口语法。文中代码采用最基础的逻辑和语法形式,后续讲述kotlin简洁的语法糖。
类与对象
类是对事物的一种封装,比如书本,可以将书本的名称,价格,出版社等的信息都写在类这个文件中。
通过这种类的封装,我们可以在需要的时候创建出该类的对象,然后通过对象调用对象中的字段(属性)和函数(行为)来实现各种逻辑。
简单点理解就是:对于某一事物(书),我们要了解其全面的属性(书名,价格)和行为信息(购买,出售,租借),就必须从上网、询问朋友以及商店等方式一步一步获取到信息。 如果有一个箱子,将这个事物的属性和行为信息都放在里面,那么我们只需要在这个箱子中拿到相应的信息即可。
这个箱子就是类,将该事物的属性和行为放入到箱子的过程,就是封装。因此箱子非常重要,不能谁都可以拿到;需要使用的时候,可以通过原始箱子建立一个虚拟的箱子,我们再使用这个虚拟的箱子去拿到信息,这个虚拟的箱子就是创建的对象。
总结下:先将事物封装成具体的类,然后将事物所拥有的属性和行为分别定义成字段和函数,然后对类进行实例化,最后在需要的时候调用类中的字段和方法。
- 语法
类的关键字:class
实例化一个类(也称创建对象): 类名()
java中需要使用都new
示例代码
class Book {
var name = ""
var price = 0.0
fun buy(){
println( name + " need " + price +"¥" )
}
}
fun main(){
val b = Book()
b.name = " 自律 "
b.price = 100.5
b.buy()
}
继承
继承,面向对象编程的特性之一。比如我们定义一个动物类Animal,然后再定义一个它的子类bird。在父类Animal我们定义属性(name,age)和行为(eat) , 对于子类来说,同样具有该属性和行为,如果重复定义就比较冗余,所以通过Bird 继承 Animal的方式,让Bird同样具备这些属性和行为。
- 在kotlin中,任何非抽象类默认都是不可以被继承的, 在关键字class前面加上open关键字 主动告诉编译器这个类时为继承而设计的。
- 对于子类,在继承时,使用的是 : 符号
(java使用的是 extends )
示例代码
关于继承时,是否需要增加()的问题,可以看下构造函数讲解。
open class Animal {
var name = ""
var age = 0
fun eat() {
println(name + " age is " + age)
}
}
class Bird : Animal(){
var appearance = "翅膀"
fun fry(){
println(" flight ")
}
}
接口
接口是用于实现多态编程的重要组成部分。kotlin中,也是允许实现任意多个接口的。
接口中定义的函数,一般不会进行实现,全部交给实现该接口的类去完成。 kotlin中,允许对接口中定义的函数进行默认实现( java1.8也支持了)。对于有默认实现的函数,在类去实现接口时,不会强制要求实现,被调用时若未实现则使用默认的实现逻辑。
- 语法 使用 : 符号实现接口。实现多个接口中间使用 ,符号进行分隔。
- 使用 override关键字表示重写父类或者实现接口中的函数。
示例代码
在使用时,可以将Bird的函数传给sound()函数,然后调用接口中的方法。这种设计就是面向接口编程。
interface AnimalSound {
fun sound()
}
// Animal(name,age) 类 是在继承知识点中定义的示例类
class Bird(val appearance : String ,name: String, age : Int) : Animal(name,age),AnimalSound{
override fun sound() {
}
}
fun main() {
val bird = Bird("翅膀","cui",4)
sound(bird)
}
fun sound(sound: AnimalSound) {
sound.sound()
}
接口中属性
在Java中,接口中的成员变量都是常量,也就是默认的修饰符是public static final类型的,并必须初始化.
在Kotlin中,接口中可以包含抽象属性声明,即:接口只需要定义属性,但是属性不能被初始化,需要交给子类初始化,子类如果不进行初始化, 那么将变成抽象类。
interface IA{
val name: String
}
// 初始化方式一
class A(override val name: String) : IA
// 初始化方式二
class A: IA{
override val name: String
get() = "张三"
}
给接口中的属性赋值方式
1.使用了主构造方法并且使用val关键字为该实现类声明了一个属性name,即:将初始化该实现类对象的属性赋值给了name属性,且val声明的属性默认提供了获取值的方法。
2.在类内部重写的方式,且提供get方法。
强制要求: override关键字表示重写了接口的name属性。
接口与抽象类异同
异点
- 接口是将一些独立的功能、模块、能力,定义为一个一个的接口。比如“可点击的”、“可触摸的”、“可滑动的”、“可吃的”。
接口是抽象功能,抽象类是抽象类别。 - 接口可以看做是抽象类的延申,接口的抽象级别更高
- 抽象类只能被单继承,接口可以多实现。
- 抽象类被子类继承,接口被类实现。
- 方法被 abstract 修饰,一定是抽象类。
同点
- 抽象类和接口都不能被实例化。
- 抽象类和接口中都可以有方法声明和方法实现。
- 抽象类和接口中的变量都不能初始化。
- 子类没有实现完抽象类中的抽象方法,接口实现类没有实现完接口中没有方法体的接口方法,都将变为抽象类。
- 接口中、抽象类中的方法,都不能是私有(private)的。
觉得有帮助的点下赞哟,毕竟三连步骤更多,嘻嘻,谢谢大家的支持(* ^ ▽ ^ *)