类与对象

作者: 码农修行之路 | 来源:发表于2020-11-20 19:59 被阅读0次

    面向对象

          面向对象,相信大家都不陌生,我想着不在此啰嗦呢!但是考虑到有些小白师弟,我们文章本着也是从零开始的态度,我再此也简单概括一下:
          介绍之前,我们先来了解一下面向过程,对喽!看字面意思就很容易理解,过程就是一件事物处理的步骤,这些完整的步骤就是一个过程,也就是分析和解决问题所需要的步骤,通过函数把这些步骤一一实现,使用的时候依次调用就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中 如果主构造函数的所有的参数都有默认值,编译器会生成 一个额外的无参构造函数,它将使用默认值

    相关文章

      网友评论

        本文标题:类与对象

        本文链接:https://www.haomeiwen.com/subject/mfrjiktx.html