20230418 0. 面向对象基础

发布时间 2023-06-19 09:41:17作者: 流星<。)#)))≦

面向对象的三大特性:封装、继承、多态

面向对象的好处:可维护、可扩展、可复用、灵活性好

封装

每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装,因此对象不必依赖其他对象来完成自己的操作。

封装有很多好处:

  • 第一,良好的封装能够减少耦合
  • 第二,类内部的实现可以自由地修改
  • 第三,类具有清晰的对外接口

继承

只有合理的应用继承才能发挥好的作用

对象的继承代表了一种'is-a'的关系,如果两个对象A和B,可以描述为'B是A',则表明B可以继承A。

继承者还可以理解为是对被继承者的 特殊化 ,因为它除了具备被继承者的特性外,还具备自己独有的个性。

继承定义了类如何相互关联,共享特性。继承的工作方式是,定义父类和子类,或叫作基类和派生类,其中子类继承父类的所有特性。子类不但继承了父类的所有特性,还可以定义新的特性。

学习继承最好是记住三句话,如果子类继承于父类,

  • 第一,子类拥有父类 非private 的属性和功能;
  • 第二,子类具有自己的属性和功能,即子类可以扩展父类没有的属性和功能;
  • 第三,子类还可以以自己的方式实现父类的功能(方法重写)。

protected 表示继承时子类可以对基类有完全访问权

在Java中,子类从它的父类中继承的成员有方法、属性等,但对于构造方法,有一些特殊,它不能被继承,只能被调用。

继承是有缺点的,那就是父类变,则子类不得不变

继承会破坏包装,父类实现细节暴露给子类,继承显然是一种类与类之间强耦合的关系

多态

多态表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行

  • 第一,子类以父类的身份出现
  • 第二,子类在工作时以自己的方式来实现
  • 第三,子类以父类的身份出现时,子类特有的属性和方法不可以使用

子类可以选择使用override关键字,将父类实现替换为它自己的实现,这就是方法重写Override,或者叫作方法覆写

多态的原理是当方法被调用时,无论对象是否被转换为其父类,都只有位于对象继承链最末端的方法实现会被调用。也就是说,虚方法是按照其运行时类型而非编译时类型进行动态绑定调用的。

要深刻理解并会合理利用多态,不去研究设计模式是很难做到的。也可以反过来说,没有学过设计模式,那么对多态乃至对面向对象的理解多半都是肤浅和片面的。

抽象类

Java允许把类和方法声明为abstract,即抽象类和抽象方法。

  • 第一,抽象类不能实例化
  • 第二,抽象方法是必须被子类重写的方法
  • 第三,如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法

应该考虑让抽象类拥有尽可能多的共同代码,拥有尽可能少的数据

抽象类通常代表一个抽象概念,它提供一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的,所以,在一个以继承关系形成的等级结构里面,树叶节点应当是具体类,而树枝节点均应当是抽象类

接口

接口是把隐式公共方法和属性组合起来,以封装特定功能的一个集合。一旦类实现了接口,类就可以支持接口所指定的所有属性和成员。声明接口在语法上与声明抽象类完全相同,但不允许提供接口中任何成员的执行方式。

实现接口的类就必须要实现接口中的所有方法和属性。

一个类可以支持多个接口,多个类也可以支持相同的接口

接口的命名,有些语言前面要加一个大写字母'I',这是一种规范。

抽象类和接口的区别:

  • 第一,类是对对象的抽象,抽象类是对类的抽象,接口是对类行为的抽象。
    • 接口是对类的局部(行为)进行的抽象,而抽象类是对类整体(字段、属性、方法)的抽象。如果只关注行为抽象,那么也可以认为接口就是抽象类。总之,不论是接口、抽象类、类甚至对象,都是在不同层次、不同角度进行抽象的结果,它们的共性就是抽象。
  • 第二,如果行为跨越不同类的对象,可使用接口;对于一些相似的类对象,用继承抽象类。
  • 第三,从设计角度讲,抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类,而接口是根本不知子类的存在,方法如何实现还不确认,预先定义

实现接口和继承抽象类并不冲突

抽象类是自底而上抽象出来的,而接口则是自顶向下设计出来的

  • 事实上,只有小猫的时候,你就去设计一个动物类,这就极有可能会成为过度设计了。所以说,抽象类往往都是通过重构得来的
  • 而接口就完全不是一回事。我们很早已经设计好了电源插座的接口,但在几十年前是无法想象未来会有什么样的电器需要电源插座的

集合

数组的优点,比如说数组在内存中连续存储,因此可以快速而容易地从头到尾遍历元素,可以快速修改元素等。缺点嘛,应该是创建时必须要指定数组变量的大小,还有在两个元素之间添加元素也比较困难

Java提供了用于数据存储和检索的专用类,这些类统称集合。这些类提供对堆栈、队列、列表和哈希表的支持。大多数集合类实现相同的接口。

泛型

泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型和其方法的参数类型出现。

通常情况下,都建议使用泛型集合,因为这样可以获得类型安全的直接优点而不需要从基集合类型派生并实现类型特定的成员。此外,如果集合元素为值类型,泛型集合类型的性能通常优于对应的非泛型集合类型(并优于从非泛型基集合类型派生的类型),因为使用泛型时不必对元素进行装箱。"