封装、继承、重写、多态

封装、继承、重写、多态

封装

封装(数据的隐藏)

  • 通常,应禁止直接访问一个对象中数据的实际表示,而应该通过操作接口来访问,这称为信息隐藏。

封装的操作

  1. 将类中属性私有,利用修饰符private
  2. 给私有属性写get/set方法一次来获取/修改属性

在idea中,可以使用alt+Insert快捷键来快速生成私有属性的get/set方法

封装的好处

  1. 提高程序的安全性,保护数据
  2. 隐藏代码实现细节
  3. 统一接口
  4. 增加系统可维护性

继承

继承的本质就是使子类能够使用其父类的(有权限的)属性或方法

注:如果拿二叉树来类比,叶子节点则可以使用所有其祖先节点的属性和方法。

  1. 继承的关键字时extends
  2. JAVA中,只有单继承,没有多继承,一个父类可以有多个子类,一个子类只能有一个父类(类似于树的结构)
  3. 在JAVA中,所有的类都将间接或直接的继承object类

super的用法

与this用法类似,super.属性名可以访问到(有权限的)父类的属性

  • super只能出现在子类的构造方法或者方法中

继承的构造方法

实例化对象时,不仅仅调用该类的构造方法,同时调用了其父类的无参构造方法

  • 如果父类没有无参构造方法,需要在子类构造方法中super();加上参数。 一般不这么用,因为如果单独写出有参构造方法时,通常会再写一个无参构造方法
  • 调用父类的构造方法 super(); 一定要在类的构造方法的第一行
  • super和this不能同时调用构造方法
源代码(子类)
public class Teacher extends Person{
    //构造方法:
    public Teacher() {
        super();//该行代码隐藏,调用了父类的无参构造方法
    }
}

在idea中,用户可使用快捷键 ctrl+h 层次结构 可以观察到类的所有父类

重写(Override)

  • 重写需要有继承关系,是子类继承父类的方法
  • 方法名和参数列表必须相同。(不相同则为方法的重载)
  • 重写都是方法的重写,和属性无关
  • 重写只跟非静态方法有关
  • 修饰符:范围可以扩大但不能缩小
  • 抛出的异常:范围可以缩小但不能扩大
为什么要重写

父类的方法子类不一定需要或者不一定满足

在idea中,可以通过快捷键alt+Insert选择Override进行重写

多态

同一方法可以根据发送对象的不同 而采用多种不同的行为方式

多态存在的条件:

  1. 有继承关系:只有继承关系才能多态,否则会类型转换异常(ClassCastException)

  2. 子类重写父类的方法

  3. 父类引用指向子类对象

    Father f1 = new Son();
    

多态的实现本质也是类型转换,是子类转成父类(低转高自动转换),在转换时无法使用子类独有方法(丢失方法)。而如果想用父类引用调用子类方法,也需要类型转换,是父类转子类(高到低强制类型转换),才能使用子类方法。

注:被static、private、final修饰的方法不能重写,所以也不能多态

instanceof (类型转换)

A instanceof B 是用来判断A是否是B的实例对象或者B子类的实例对象

instanceof的返回值为布尔类型,但是应该分为三种情况讨论

  1. 返回值为true:A是B类的(及其子类)的实例对象

  2. 返回值为false:A不是B类(及其子类)的实例对象

  3. 在编译时报错:

    • A使用了多态,A的引用类型与B类(及其子类)没有继承关系时就会在编译时报错。