面向对象
面向对象,相信大家都不陌生,我想着不在此啰嗦呢!但是考虑到有些小白师弟,我们文章本着也是从零开始的态度,我再此也简单概括一下:
介绍之前,我们先来了解一下面向过程,对喽!看字面意思就很容易理解,过程就是一件事物处理的步骤,这些完整的步骤就是一个过程,也就是分析和解决问题所需要的步骤,通过函数把这些步骤一一实现,使用的时候依次调用就ok!(牵一发而动全身)
面向对象:把待解决的问题按照一定的规划划分为多个独立的对象,通过多个对象的相互配合来实现应用程序的功能(部分、局部改动)
每个独立的对象承载着不同分工任务 也就是说 某一需求的变动,需要一个甚至个别几个对象的改动,从而代码更易于维护
- 面向对象的三大特征:封装、继承、多态
封装:面向对象的核心思想 将对象的属性和行为封装起来,不需要让外部知道具体的实现细节,只知道怎样使用就好(不要在意细节,当然码农还是要有追溯源头,刨根问底勇气)
1.对细节部分的包装、隐藏
2.防止该类的代码和数据被外部类定义的代码随机访问
3.要访问该类的代码和数据,必须通过指定的接口进行访问控制
继承:主要描述类与类之间的关系,通过继承可以在不修改原有类的前提下,对原有类功能进行扩展(增强代码的复用性,为程序的修改补充提供便利)
1.类是单继承 但是可以多重继承 接口可以多实现
2.子类拥有父类的非私有属性和方法 重写父类的方法 对父类进行扩展
3.继承的缺点就是耦合度高
4.关键字:extends implements
多态:程序中允许出现重名现象,在一个类中定义的属性和方法被其它类继承后,它们可以有不同的数据类型或表现行为(相同的属性名或方法名,在不同的对象中,所表现的行为是不一样的)
1.直白的说,同一个接口,不同实例使用执行不同操作
2.多态存在的三个必要的条件 继承、重写、父类引用指向子类的对象
3.实现方式 重写、接口
简单的举个例子:
fun main(args: Array<String>) {
show(Cat())
show(Dog())
// 向上转型
val a: Animals = Cat()
a.eat()
// 向下转型
val c:Cat = a as Cat;
c.work()
}
fun show(a: Animals) {
a.eat()
if (a is Cat) {
a.work()
} else if (a is Dog) {
a.work()
}
}
open class Animals {
open fun eat() {
println("父类吃")
}
}
class Cat : Animals() {
override fun eat() {
println("小猫吃")
//super.eat()// 父类吃
}
fun work() {
println("小猫工作")
}
}
class Dog : Animals() {
override fun eat() {
println("小狗吃")
//super.eat()// 父类吃
}
fun work() {
println("小狗工作")
}
}
类
类的创建 相信也都不陌生 关键字class修饰
class Animals{
}
// 如果没有类体可以省略花括号
class Car
主构、次构函数
// 如果构造函数中有注解或可见性修饰符 这个constructor关键字是必须的,并且这些修饰符在它前面
class Human1 public @Inject constructor() {
constructor(human2: Human2) {
}
}
class Human2 constructor(name: String, age: Int) {
// 主构造
var name: String? = null
var age: Int? = null
// 静态代码块 优先初始化
init {
this.name = name
this.age = age
}
// 次构造 必须委托主构造
constructor(name: String, age: Int, sex: String) : this(name, age) {
}
// 或者通过其它次构造函数间接委托
constructor(name: String, age: Int, sex: String, className: String) : this(name, age, sex) {
}
}
- 如果一个非抽象类没有声明任何主、次构造函数 它会有一个生成的不带参数的主构造函数 构造函数的可见性是public 如果你不想一个类有默认的公共的构造函数 那么你需要声明一个非默认可见的空的主构造函数
class Human private constructor() {
}
- 在JVM中 如果主构造函数的所有的参数都有默认值,编译器会生成 一个额外的无参构造函数,它将使用默认值
网友评论