JavaSE面向对象

JavaSE面向对象

一,什么是面向对象?

  • 面向过程:POP

    • 分析出解决问题的所需要步骤,然后把步骤一步一步实现,每一步其实就是一个函数。

    • 面向过程直接关注流程。

  • 面向对象:OOP

    • 以分类的方式进行思考和解决问题。

    • 面向对象先对整体关系做出分类,然后根据不同的类深入进行细节处理。

    • 面向对象的思想符合人类的认知习惯。

  • 但是面向对象无法取代面向过程,他们是相辅相成的。

二,面向过程与面向对象的区别?

​ 对于什么是面向对象,面向对象是一种编程思想。谈到面向对象,那我们要先来说一下面向过程,因为面向对象是从面向过程过渡而来的。

举例说明:洗衣服

  • 面向过程

    我们会将洗衣服任务拆解为一系列步骤

    • 第一步,打开洗衣机
    • 第二步,放衣服和洗衣液
    • 第三步,选择洗衣模式,开始洗衣
    • 第四步,等待洗完,取衣服
  • 面向对象

    拆分为人和洗衣机两个对象,在分析每个对象需要做的事情。

    1. 打开洗衣机
    2. 放衣服和洗衣液
    3. 洗完衣服取衣服

    洗衣机

    • 根据洗衣模式洗衣服
  • 例子中,可以看出面向过程和面向对象是两种不同的思维方式,处理问题的思考角度不同。

  • 面向过程的思维方式,它更加注重这个事情的每一个步骤以及顺序。他比较直接高效,需要做什么可以直接干。

  • 面向对象的思维方式,它更加注重事情由哪些参与者,需求里面有哪些对象,这些对象各自需要做些什么事情。将其拆解成一个个模块和对象,这样会更易于维护和扩展。

  • 这就是面向过程和面向对象的区别。

三,类

  • 什么是类?

    类就是一个模板,描述一类事物的属性和行为的集合。

    类是表示一个客观世界某类群体的一i写基本特征抽象。

  • 类的结构

    1. 成员变量:事物属性的描述;
    2. 方法:事务的行为;(可以做的事情)
    3. 构造方法:初始化对象;
    4. 内部类:在类中声明的类;
    5. 一段没有名称的代码
  • 类的共有属性:成员变量

  • 对象

    对象是一个实例,是以类为模板在内存创建的实例存在的实例。(就是类所创造的一个个具体存在的,实实在在存在的实例),也叫实例化对象。

  • 变量分类

    1. 成员变量

      成员变量定义在类中,方法体之外的变量。

      成员变量可以使用任何一种数据类型(基本类型和引用类型)。

      在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。

      成员变量,在创建对象时会从类中复制一份到对象中。

      成员变量作用范围整个类体。

      随着对象的创建而存在,随着对象的消失而消失

    2. 局部变量

      • 局部变量定义在方法,构造方法或者代码块中。

      • 局部变量可以使用任何一种数据类型(基本类型和引用类型)。

      • 局部白能量使用前必须初始化赋值。

      • 局部变量随着方法的调用或代码块的执行而存在,随着方法的调用完毕或者代码块的执行完毕而消失。

    3. 成员变量和局部变量在内存中的位置不同

      • 成员变量:在堆中(方法区中静态区),成员变量属于对象,对象进堆内存。
      • 局部变量:在栈中,局部变量属于方法,方法进栈内存。
    4. 注意事项

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

  • 方法分类

    • 成员方法

      • 成员方法定义在类中,封装了特定功能的代码块。

      • 方法名能见名知意就行。

      • 作用

        提高代码的复用性。

        实现数据传递。

    • 构造方法

      • 用来初始化对象的方法。
      • 方法名必须与类名一直一致。
  • 方法的重载(OverLoading)

    • 方法的重载就是在一个类中具有相同的名字,但参数不同的多个方法。

    • 参数不同

      • 数量不同
      • 类型不同
      • 顺序不同
    • 注意

      方法重载跟方法的返回值类型没有任何关系

四,访问权限修饰符

  • ​ 四个权限访问修饰符
    1. ​ public:公共权限 修饰类,属性,方法。可以被任意类访问。
    2. protected:受保护的权限 修饰属性,方法。可以呗同包类访问,如果不是同包类,必须是该类的子类才能访问。
    3. default:默认权限 修饰类,属性,方法。只能被同包类访问。
    4. private:私有权限 修饰属性,方法。只能在本类中访问。

五,面向对象语言的三大特征

封装
  • 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
    • 例子:就比如说最常用的手机,人人都会用,打电话,发短息,玩游戏,刷视频等等,但你知道手机怎么实现这个功能的吗?不知道,我们会使用就可以了,怎么实现的对我们来水不重要。这就很类似封装的理念。
  • 封装的优点
    1. 防止代码被破坏,提高数据的安全性。
    2. 提高代码的复用性。
    3. 便于修改,增强代码的可维护性。
    4. 高内聚:类的内部数据操作细节自己完成,不允许外部干涉。
    5. 低耦合:仅对外暴露少量的方法用于使用。
  • 封装的具体表现就是使用不同的访问权限。
继承
  • 继承是面向对象程序设计不可缺少的设计思想,是实现代码可重用的根基,是提高代码可扩展性的主要途径。
  • 类和类之间有些也会具有一定的关系。
    • 比方说四边形,可以分为正方形,长方形,菱形,他们不但继承了四边形的特征,也具有属于自己的特征,这就是一种继承的关系。
  • 有时候我们会基于某一个类进行扩展,使一个新类直接拥有基类的基本特征,而不需要财富区写,这就是继承的思想。
    • 比如现在的手机发展,最早的大哥大只有通话功能,后来按键手机增加界面等操作,再到现在的智能手机,它们不是一蹴而就的,而是通过原有的功能上再增加新功能而逐渐演变过来的,这其实就是一种继承的只管体现。
    • 继承原有的功能,增加自己新的功能,实现了扩展和复用。
  • Java规定类只能继承一个类,但是一个类可以被多个类继承,类之间可以有多层的继承关系,直接继承的是直接父亲,父类的父类就是间接父类,而最上层就是Object。
  • super关键字用来访问父类成员。
  • 在创建子类是,不会创建父类对象。只会将父类中的信息加载到子类对象中存储。
  • 使用继承时,需要注意继承是否收权限修饰符的影响
    • 子类无法继承private修饰的属性方法。
    • 子类和父类同包可以继承default的属性方法。
  • 不能继承被final修饰的类
  • 方法的重写(OverRide)
    • 当父类的方法实现不能满足子类需求时,可以对方法进行重写(多态的体现)。
    • 注意:构造方法,静态方法不能重写,成员变量不存在重写。
OverLoading和OverRide的区别?
  1. 定义不同
    • 重载(OverLoading)是定义相同的方法名,参数不同。
    • 重写(OverRide)是父类无法满足子类需求时,重写父类的方法。
  2. 范围不同
    • 重载在一个类中
    • 重写是子类与父类之间
  3. 多态不同
    • 重载是编译时多态性
    • 重写是运行时多态性(多态是一个类需要表现出多种形态,子类重写父类的方法,使子类具有不同的方法实现)
  4. 参数不同
    • 重载的参数个数,阐述类型,参数顺序可以不同
    • 重写父类子方法参数必须相同
  5. 修饰范围不同
    • 重载对修饰范围没有要求
    • 重写要求重写方法的修饰范围大于被重写方法的修饰范围
抽象类
  • ​ 什么是抽象类
    • Java中可以定义被abstract关键字修饰的类,被abstract关键字修饰的类叫抽象类。
    • 被abstract修饰的方法叫抽象方法,这种方法只有声明,没有方法体。
    • 一个类含有抽象方法,那么它一定是抽象类
    • 抽象类中的方法实现交给子类来完成。
  • 抽象类的特点
    1. abstract可以修饰方法或者类。
    2. 被abstract修饰的类叫抽象类,被abstract修饰的方法叫抽象方法。
    3. 抽象类中可以没有抽象方法。
    4. 子类继承了抽象类以后,要么该子类还是一个抽象。类,要么就把父类的所有抽象方法都重写。
    5. 抽象类多用于多态中。
    6. 抽象类不可以被实例化。
    7. 抽象方法要求子类继承后必须重写。
多态
  • 什么是多态
    • 多态就是指同一实体同时具有多种形式,也就是同一类对象,执行同一个行为,会表现出 不同的行为特征。
    • 可以把不同的子类对象都当做父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准。
      • 举例说明:小猫,小狗,小猪我们可以把他们都归纳为小动物,每种小动物都需要吃对象,所以我们可以同意设置他们都必须吃,但是每种晓东无习性不一样,那这个就可以设置成小动物自己特有的功能,多态对象只能调用父类中定义子类中重写的功能,并不能调用子类的特有功能,这样就实现了代码的统一。
  • 多态存在的三个必要条件
    • 要有继承(包括接口的实现)(前提条件)
    • 要有重写(前提条件)
    • 父类引用指向子类对象
  • 多态中成员访问的特点
    • 方法调用:编译看左,运行看右;
    • 变量调用:编译看左,运行也看左;(多态注重行为多态即方法多态
  • 多态的优点
    • 提高了程序的可扩展性和可维护性。
    • 我们看右不用关心某个对象到底是什么类型,就可以使用该对象的某些方法。
  • 多态的缺点
    • 多态不能使用子类特有的功能
  • 类型转换
    • 前面说到多态的缺点"多态不能使用子类特有的功能",那么该由谁调用呢?
    • 类型转换分为两种:自动类型转换和强制类型转换
      • 自动类型转换(向上转型)
        • Parent p = new Child(); //向上转型,此时,p是Parent类型
        • 就是将子类对象当作父类对象,只能调用父类的功能,如果子类中重写了父类中的方法,那调用时就会执行子类重写过的方法。
        • 比如:花木兰替父从军,大家都把花木兰看做她爸,但是实际从军的是花木兰,而且,花木兰只能做她爸能做的事,在军营里是不可以化妆的。
        • 向上转型提高了程序的扩展性
      • 强制类型转换(向下转型)
        • Child c = (Child)p; //此时,把Parent类型的p转成小类型Child
        • 向下转型是为了方便调用子类中特有的方法。
        • 比如:花木兰打仗结束,就不需要再看做是她爸了,就可以”对镜贴花黄”了
final关键字
  • 在java中,final关键字有三个用法,修饰类,修饰变量,以及修饰成员方法。

  • final修饰类

    被final修饰的类不能被继承,但是可以有父类,即最终类。

  • final修饰变量

    • final修饰成员变量
      • 该成员变量必须在其所在类对象创建之前被初始化(且只能初始化一次)
      • 初始化三种方法
        1. 直接初始化(赋值)。
        2. 在代码块中初始化。
        3. 在成员变量苏哦在类的构造方法中初始化。
    • final修饰局部变量
      • 该变量必须在使用之前赋值,且只能被覆值一次
    • final修饰成员变量在定义时必须初始化(三种方法),final修饰局部变量定义时可以不初始化,但是使用之前必须完成初始化。
  • final修饰成员方法

    • 被final修饰的成员方法,该方法不能被重写,但是可以被继承。
接口
  • 什么是接口?

    • 有时必须从几个子类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多继承。有了接口,就可以得到多继承的效果。

    • 接口(interface)是抽象方法和常量值的定义集合。

    • 从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现(但接口不是类!!!)。

    • 案例:蝙蝠会飞,又会用牙齿咬

      ​ 首先定义一个飞行的接口,接着定义一个咬人的接口,最后定义蝙蝠类去实现这两个接口。

  • 接口的特点

    • 用interface来定义接口。
    • 接口中的所有成员变量都是默认由public,static,final修饰的。
    • 接口中没有构造方法。构造方法是用来创建对象的。
    • 接口与继承关系类似,接口与实现类之间存在多态性。
    • 接口突破了Java单继承的局限性。
    • 接口提高了程序的功能拓展,降低了耦合度。
    • 一个类可以实现多个无关的接口,多个无关的类可以实现同一个接口。
    • 实现接口的类中必须提供接口中的所以方法的具体实现内容,否则该类就是抽象类。
接口和抽象类的区别
  1. 成员的区别

    • 抽象类

      • 有构造方法,用于子类实例化使用。

      • 成员变量可以是变量,也可以是常量

      • 成员方法可以抽象,也可以非抽象。

    • 接口

      • 没有构造方法。
      • 成员变量只能是常量。默认修饰符:public static final
      • 成员方法在jdk1.8以前只能是抽象的,1.8以后可以写default和static开头的具体方法。
  2. 类和接口的关系区别

    • 类与类
      • 继承关系,只能单继承。但是可以多层继承。
    • 类与接口
      • 实现关系,可以单实现,也可以多实现。
      • 类还可以在继承一个类的同时实现多个接口。
    • 接口与接口
      • 继承关系,可以单继承,也可以多继承。
  3. 体现的理念不同

    • 抽象类里面定义的都是一个继承体系的共性内容。
    • 接口是功能的集合,是一个体系额外的功能,是暴露出来的规则。
  4. 选择使用接口和抽象类的依据是什么?

    • 抽象类表示的是这个对象是什么。接口表示的是这个对象能做什么

    • 比如:男人,女人,这两个类,他们的抽象类的人,说明他们是人。

      人可以吃东西,够野可以吃东西,你可以把“吃东西”定义成一个接口,然后人这些类去实现它。

    • 所以,在高级语言上,一个类只能继承一个类(抽象类)(就比如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口,走路接口)。

    • 当我们关注一个事务的本质时,用抽象类;当我们关注一个操作时,用接口。

    • 抽象类的功能要远超接口,但是定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其子类的所以共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值