Java中面向对象编程部分同样具有三大特性:封装继承多态
面向对象编程三大特性———封装、继承、多态 - 掘金


一、封装

封装的思想:将一个类的属性和方法封装起来。可以暴露的部分就对外暴露出去,不能暴露的就保护起来
类的组成:属性和方法

1. 四种访问权限

Java中的四种访问权限:public、protected、包访问、private - 掘金
Java中一共有四种访问权限,分别是「public、protected、包访问权限(默认)、private」。如果省略了修饰符,那么默认的访问权限就是「包访问权限」。
这四种权限从「最大权限」「最小权限」分别是: public> protected>包访问权限>private


权限控制:对于方法和属性,有4种权限控制符

  1. public 被public修饰的成员对任意一个类都是可用的,任何一个类都可以访问到,通过操作该类的对象随意访问「public」成员
  2. private 除了包含这个成员的类之外,所有类都无法访问这个成员,相当于自我封闭,防止其他类改变或删除这个方法
  3. protected 在相同的class内部,同一个包内和其他包的子类中能被访问。要理解「protected」权限,就需要了解「继承」,因为这个权限处理的就是继承相关的概念,继承而来的子类可以访问「public、protected」
  4. 缺省(包访问权限) 没有任何修饰符的权限就是「包访问权限」,意味着当前包的所有类都可以访问这个成员,如表中所示,对于本包之外的类,这个成员就变成了「private」,访问不了。

二、继承

示例Student继承Person

1. 好处

  1. 减少代码的冗余
  2. 方便功能上的拓展

    1. 子类继承了父类之后,还可以在父类的基础之上定义自己的属性和方法

      2. 注意点

  3. 一旦子类A继承了父类B之后,子类A就获取到了B类中声明的所有属性和方法,但是由于封装上权限的影响,无法调用到父类的部分结构。

  4. 子类是父类的一个拓展,功能上可以比父类更加强大

    3. 特点

  5. 一类父类可以被多个子类继承

  6. 一个子类有且仅有一个直接父类,但是可以有多个间接父类

    4. Object类

  7. 如果没有显式指明一个类的直接父类,那么此类继承于Object

  8. Java中所有的类都有Object类中的功能

    5. 方法的重写

  9. 特点:子类可以对继承过来的父类中的方法进行覆盖,实现自己的需求

  10. 注意
    1. 子类重写的方法的方法名和形参列表与父类中被重写的方法的方法名和形参列表相同
    2. 子类重写方法的权限修饰符不可以小于(大于等于)父类方法的权限修饰符
    3. 子类不可以重写父类中private的方法
    4. 假设父类中被重写方法的返回值类型是A类,那么子类中重写方法的返回值类型只能是A类或者是A类的子类
      1. 如果返回的是基本数据类型,那么返回值类型必须相同
    5. 子类重写的方法抛出的异常类型不大于父类被重写方法抛出的异常类型。子类抛出的异常类型是父类被重写方法抛出异常的子类
    6. 不可以重写父类中的静态方法
  11. 重写和重载的区别
    1. 重载:Java中的重载就是在一个类中可以创建多个方法,他们有相同的名字,根据调用函数的时候传递的参数来确定具体调用的是哪一种参数
      1. 重载的条件:参数的类型不同、个数不同。(函数的返回值类型不可以作为函数重载的条件)
    2. 重写:重写体现了父类和子类之间的多态性。如果在子类中定义了和父类相同的方法,那么我们就称之为方法的重写。重写可以使用注解@Override来进行检查

      6. 子类对象实例化的全过程

  • 结果上:创建子类的对象,就会加载出所有父类中声明的属性
  • 过程上:通过子类构造器创建子类对象的时候,会直接或者间接的调用父类的构造器,进而链式的调用构造器,直到调用到Object类的构造器,从而加载出父类的所有属性
  • 注意:虽然链式的调用了父类的构造器,但是从始至终都只创建过子类一个对象

    三、多态

    特点多态是一种运行时的行为,是一种参数的晚绑定。编译看左边,运行看右边
    理解:事物的多态性,一种事物可以有多种形态
    实现:父类的引用指向子类的对象。**Person person = new Man();**但person始终还是Person类的对象
    使用:当调用与父类同名同参数的方法的时候,实际调用的是子类中重写后的方法。但是也只能调用子类重写父类的方法
  1. 运行过程中,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明的时候是父类类型,导致编译时只能调用到父类中声明的属性和方法,子类中特有的属性和方法是不能调用的。
  2. 调用到子类重写的方法是在运行过程中动态绑定的行为

适用:多态只适用于方法,而不适用于属性
前提:具有继承关系并且子类有重写父类中定义的方法
其他

  1. 向下转型
    1. 方法:适用类型强制转换符
    2. 注意:只能是父类转型为子类。转换的过程中可能会出现类型转换异常
    3. 个人分析:能不能进行强制类型转换其实要看new的那个类加载的时候有没有加载转换后的类型(大概是子类可以转换成父类,因为父类有的子类中一定也有,但是子类中有的父类不一定有)
    4. instance:用于判断对象A是否是类B的一个实例