封装、继承、重写、多态
封装、继承、重写、多态
封装
封装(数据的隐藏)
- 通常,应禁止直接访问一个对象中数据的实际表示,而应该通过操作接口来访问,这称为信息隐藏。
封装的操作
- 将类中属性私有,利用修饰符private
- 给私有属性写get/set方法一次来获取/修改属性
在idea中,可以使用alt+Insert快捷键来快速生成私有属性的get/set方法
封装的好处
- 提高程序的安全性,保护数据
- 隐藏代码实现细节
- 统一接口
- 增加系统可维护性
继承
继承的本质就是使子类能够使用其父类的(有权限的)属性或方法
注:如果拿二叉树来类比,叶子节点则可以使用所有其祖先节点的属性和方法。
- 继承的关键字时extends
- JAVA中,只有单继承,没有多继承,一个父类可以有多个子类,一个子类只能有一个父类(类似于树的结构)
- 在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进行重写
多态
同一方法可以根据发送对象的不同 而采用多种不同的行为方式
多态存在的条件:
-
有继承关系:只有继承关系才能多态,否则会类型转换异常(ClassCastException)
-
子类重写父类的方法
-
父类引用指向子类对象
Father f1 = new Son();
多态的实现本质也是类型转换,是子类转成父类(低转高自动转换),在转换时无法使用子类独有方法(丢失方法)。而如果想用父类引用调用子类方法,也需要类型转换,是父类转子类(高到低强制类型转换),才能使用子类方法。
注:被static、private、final修饰的方法不能重写,所以也不能多态
instanceof (类型转换)
A instanceof B 是用来判断A是否是B的实例对象或者B子类的实例对象
instanceof的返回值为布尔类型,但是应该分为三种情况讨论
-
返回值为true:A是B类的(及其子类)的实例对象
-
返回值为false:A不是B类(及其子类)的实例对象
-
在编译时报错:
- A使用了多态,A的引用类型与B类(及其子类)没有继承关系时就会在编译时报错。