• 面向对象的基本理解


    一、面向对象的三大基本特征以及五大原则

    三大基本特征:

    1、 封装: 

    将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问;只能通过规定的方法访问数据;隐藏类的实例细节,方便修改和实现;(对封装的属性不一定要通过get/set方法,其他方法也可以对封装的属性进行操作。当然最好使用get/set方法,比较标准。) 

    访问修饰符

    本类

    同包

    子类

    其他

    private

    dafule

    protected

    public

    2、 继承:

    继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为,子类拥有父类的所有属性和方法(除了private修饰的属性不能拥有)从而实现了实现代码的复用; (java中的继承是单继承,即一个类只有一个父类);

    只要在子类加上extends关键字继承相应的父类:

    Class 子类 extends 父类{

      方法体

    }

    子类不能继承父类的private成员以及父类的构造方法

    Object类是所有类的父类,如果一个类没有使用extends关键字明确标识继承另一个类,那么这个类默认继承Object类。(Object类中的方法,适合所有子类!!!)

    优点:提高了代码的复用性以及维护性

     缺点:耦合增加

    3、 多态:

    多态同一个行为具有多个不同表现形式或形态的能力。是指一个类实例(对象)的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。

    多态存在的三个必要条件

    • 继承
    • 重写(子类继承父类后对父类方法进行重新定义)
    • 父类引用指向子类对象

     

     多态的优点:

    • 1. 消除类型之间的耦合关系
    • 2. 可替换性
    • 3. 可扩充性
    • 4. 接口性
    • 5. 灵活性
    • 6. 简化性

    五大基本原则:

     1、单一职责原则(SRP)

    一个类应该有且只有一个去改变它的理由,这意味着一个类应该只有一项工作。

      2、开放封闭原则(OCP)

      对象或实体应该对扩展开放,对修改封闭。

    3、里氏替换原则(LSP)

    比如,假设有两个类,一个是Base类,另一个是Child类,并且Child类是Base的子类。那么一个方法如果可以接受一个基类对象b的话:method1(Base b)那么它必然可以接受一个子类的对象method1(Child c).

    里氏替换原则是继承复用的基石。只有当衍生类可以替换掉基类,软件单位的功能不会受到影响时,基类才能真正的被复用,而衍生类也才能够在基类的基础上增加新的行为。

    但是需要注意的是,反过来的代换是不能成立的,如果一个软件实体使用的是一个子类的话,那么它不一定适用于基类。如果一个方法method2接受子类对象为参数的话method2(Child c),那么一般而言不可以有method2(b).

    4、依赖倒置原则(DIP)

      高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。具体实现应该依赖于抽象,而不是抽象依赖于实现。

    抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对抽象(接口)编程,而不是针对实现细节编程。

     5、接口隔离原则(ISP)

      不应强迫客户端实现一个它用不上的接口,或是说客户端不应该被迫依赖它们不使用的方法,使用多个专门的接口比使用单个接口要好的多!

    比如,为了减少接口的定义,将许多类似的方法都放在一个接口中,最后会发现,维护和实现接口的时候花了太多精力,而接口所定义的操作相当于对客户端的一种承诺,这种承诺当然是越少越好,越精练越好,过多的承诺带来的就是你的大量精力和时间去维护!

    大部分内容来自:

    https://www.cnblogs.com/fzz9/p/8973315.html#%E3%80%80%E3%80%802%E5%BC%80%E6%94%BE%E5%B0%81%E9%97%AD%E5%8E%9F%E5%88%99ocp

    OOA:面向对象分析

    OOP:面向对象编程

    OOD:面向对象设计

    AOP:面向切面编程

    二、局部变量和全局变量的区别

    成员变量和局部变量的区别?
    A:在类中的位置不同
    成员变量:在类中方法外
    局部变量:在方法定义中或者方法声明上
    B:在内存中的位置不同
    成员变量:在堆内存
    局部变量:在栈内存
    C:生命周期不同
    成员变量:随着对象的创建而存在,随着对象的消失而消失
    局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
    D:初始化值不同
    成员变量:有默认初始化值
    局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。

    注意事项:

    局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。

    以上内容来自:https://blog.csdn.net/u012979602/article/details/78334246

    三、OO中先有对象还是先有有类?

    OOP中:类的定义:类(Class)实际上是对某种类型的对象定义变量和方法的原型。是具有相同属性和操作的一组对象的集合!它表示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础。看到这里,已经无需多言,标准答案,是先有对象,再有类

    大佬有详细说明:

    https://www.cnblogs.com/kubixuesheng/p/4132116.html

    1、 在实例化对象时(new 对象),构造方法会进入方法区并开辟空间;而通过this或者super来调用构造方法时,相当于调用的方法进入方法区,并没有开辟空间;值得一提的是,这里在《JAVA编程思想》中有点小出错,它把构造方法归为静态方法,构造方法具有静态方法的一些特点,但并不属于静态方法;

    2、 今天问了老师一个问题,这个问题我本应该先去思考,查看源码,虽然是个小问题,但也体现了我的基础上很多不足,以及思考方式的错误,况且以前还是学过以及看过源码,都给忘了;

     

    在这个Teacher类中,我重写了toString方法,以前一直没有当回事,直接实例化对象后,把引用变量输出了,并未调用这个重写了的toString方法,

    那么为什么没有调用这个重写了的toString还是会输出toString的内容了?从源码上看来:

     

    是不是有点懂了?那就把它看懂并且去理解这种方式,试着去举一反三:

    我们在上图的valueOf的源码看来:

     

    原来这个valueOf已调用了toString方法,而回到开头我们讲的

     

    图片上的第二行相当于第三行,直接输出teacher引用变量调用的并不是Teacher类里我们重写的toString方法,而是println里的toString.

    作为新手小菜鸟的我,只想记录,便于温故知新,如有错误或疏忽,请留言,审查后改正,谢谢各位大佬
  • 相关阅读:
    【LOJ #3058】「HNOI2019」白兔之舞(单位根反演+矩阵快速幂+MTT)
    【LOJ #2289】「THUWC 2017」在美妙的数学王国中畅游(LCT+泰勒展开)
    【LOJ #3193】「ROI 2019 Day2」机器人高尔夫球赛(DP+Map)
    【Codeforces 1119H】Triple(FWT)
    PKUWC2020 (旅)游记
    多项式算法合集
    redis入门学习
    servelt
    spring容器原理学习
    Spring MVC
  • 原文地址:https://www.cnblogs.com/zhangsonglin/p/10478589.html
Copyright © 2020-2023  润新知