面向对象的三大特征

1. 封装性

1.1 为什么要引入封装性

我们程序设计追求“高内聚,低耦合”

  • 高内聚:类的内部数据操作细节自己完成,不允许外部干涉
  • 低耦合:仅暴露少量的方法用于使用

隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露的暴露岀来。这就是封装性的设计思想。

1.2 问题引入

当我们创建一个类的对象以后,我们可以通过”对象.属性”的方式,对对象的属性进行赋值。这里,赋值操作要受到属性的数据类型和存储范围的制约。除此之外,没其他制约条件。但是,在实际问题中,我们往往需要给属性赋值加入额外的限制条件。这个条件就不能在属性声明时体现,我们只能通过方法进行限制条件的添加。(比如:setName()同时,我们需要避免用户再使用”对象.属性”的方式对属性进行赋值。则需要将属性声明为私有的(private)。此时,针对于属性就体现了封装性。

1.3 常用体现

  1. 属性私有化,使用公共方法去操作私有的属性
  2. 类内部使用的方法私有化不对外暴露
  3. 单例模式:
    1. 构造方法私有化
    2. 提供一个静态的私有的属性来承载实例化
    3. 提供一个静态公有的方法对外返回单例的实例化对象
  4. 如果不希望类在包外调用可设置为缺省的

1.4 java规定的四种权限修饰符

  1. 权限大小: public > protected > 缺省 > private
  2. 具体的修饰范围 | 修饰符 | 类内部 | 同一个包 | 不同包的子类 | 同一个工程 | | —- | —- | —- | —- | —- | | private | √ | | | | | 缺省 | √ | √ | | | | protected | √ | √ | √ | | | public | √ | √ | √ | √ |
  1. 可以修饰结构
    1. 四种权限修饰符都可以修饰类的内部结构:属性、方法、构造器、内部类
    2. 修饰类 只能使用:public和缺省

2. 继承性

2.1 引入继承性的好处

  • 提高代码的复用性,减少代码冗余
  • 便于功能的扩展
  • 为之后的多态性提供前提

image.png

2.2 继承性说明

  1. 一个类可以被多个类继承
  2. 一个类只能由一个父类
  3. 每个类都直接或间接的继承了Object类
  4. 子类会获取到父类的所有类包括私有的类,但是不能直接调用父类私有类

2.3 子类实例化的过程

image.png

image.png

在new一个子类对象的时候都会直接或间接的调用父类的构造函数,所以在调用一个子类的时候会创建所有的父类的对象

3. 多态性

3.1 对多态的理解

首先就比如一个方法中对程序进行序列化,但是不知道外部用户具体要使用什么类型的序列化。这个时候就可以使用多态,创建一个序列化的接口具体使用的各种类型的序列化与实现这个接口,方法内部只需要使用接口进行操作而不需要关注外部传过来的是什么类型的序列化器。

3.2 何为多态性

编译时类型与运行时类型不同

一般用于父类的引用指向子类

  1. // 后者继承前者
  2. Person p = new student()

而在使用方法的时候会使用student覆写过的方法这就是多态

一般多态称为向上转型

  1. Student stu = (Student)p

上述语句是可以成立的因为p是在栈中的一个变量 等号的右边是实实在在的在堆上new了一个student对象

将student对象地址赋给p变量 所有p的本质还是一个student类 是可以强转成student类的

多态的另一种用的比较多的地方是通过接口指向实现类:

  1. // 后者是前者的实现类
  2. Fly fly = new Flying()