面向对象
什么是面向对象
- 面向过程:根据解决问题的过程,直接设计系统。如 C 语言。
- 面向对象:将问题分解成多个对象,设计模块化、低耦合的系统。如 java 语言。
- 特性:封装、继承、多态。
- 优点:使系统更加灵活,易维护、易复用、易扩展。
封装
封装是什么,一般封装怎么体现出来?
1. 面向对象的三大特征之一,合理隐藏,合理暴露。
2. 一般会把成员变量使用private隐藏起来。
3. 通过getter和setter方法暴露其访问。
封装的好处?
1. 加强了程序代码的安全性。
2. 适当的封装可以提升开发效率,同时可以让程序更容易理解与维护。
继承
类的继承
子类继承父类后,无需定义也可使用父类定义好的 public/protected 方法和属性。也可以进行扩展和方法的重写。
- 子类不能继承父类的静态成员, 但以直接使用父类的静态成员(共享并非继承)
- 父类的私有成员可以被子类继承,不能直接访问, 但子类可以通过父类提供的方法得到父类的属性值。
- 父类的 static 方法不会被子类继承,子类的 static 方法会隐藏父类的同名 static 方法。
- 父类的构造方法不会被子类继承,子类必须在构造方法首行调用父类构造方法(先构造父类,再构造子类)
- Jva是单继承模式一个类只能继承一个直接父类, Java不支持多继承、但是支持多层继承。
- Java中所有类,要么直接继承了Object,要么默认继承了Object,要么间接继承了Object,Object是祖宗类。
- 在子类方法中访问成员(成员变量、成员方法)满足就近原则,先子类局部范围找,然后子类成员范围找,然后父类成员范围找,如果父类范围还没有找到侧报错。

继承后:方法重写
什么是方法重写?
在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。
方法重写的应用场景:
当子类需要父类的功能,但父类的该功能不完全满足自己的需求时。
子类可以重写父类中的方法。
@Override重写注解
- @Override是放在重写后的方法上,作为重写是否正确的校验注解。
- 加上该注解后如果重写错误,编译阶段会出现错误提示。
- 建议重写方法都加@Override注解,代码安全,优雅!
方法重写注意事项和要求
- 重写方法的名称、形参列表必须与被重写方法的名称和参数列表一致。
- 私有方法不能被重写。
- 子类重写父类方法时,访问权限必须大于或者等于父类(暂时了解:缺省<protected<public)
- 子类不能重写父类的静态方法,如果重写会报错的。
继承后:子类构造器的特点
子类中所有的构造器默认都会先访问父类中无参的构造器,再执行自己。
为什么?
子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。
子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化。
怎么调用父类构造器的?
子类构造器的第一行语句默认都是:super(),不写也存在。
继承后:子类构造器访问父类有参构造器
super调用父类有参数构造器的作用:
初始化继承自父类的数据。
如果父类中没有无参数构造器,只有有参构造器,会出现什么现象呢?
会报错。因为子类默认是调用父类无参构造器的。
如何解决?
子类构造器中可以通过书写super(... ),手动调用父类的有参数构造器
this和super使用详情
this:代表本类对象的引用;super:代表父类存储空间的标识。

this(…)和super(.…)使用注意点:
- 子类通过this()去调用本类的其他构造器,本类其他构造器会通过super去手动调用父类的构造器,最终还是会调用父类构造器的。
- 注意:this(...)super(...)都只能放在构造器的第一行,所以二者不能共存在同一个构造器中。
接口继承
和类的继承类似。但 Java 类只能单继承,而 Java 接口可以多继承。
interface Charge extends Move, Fight{
public abstract void kill(int num);
}
多态
什么是多态?
同类型的对象,执行同一个行为,会表现出不同的行为特征。
多态的常见形式

多态中成员访问特点
方法调用:编译看左边,运行看右边
变量调用:编译看左边,运行看左边 (多态侧重行为多态)
多态的前提
有继承/实现关系;有父类引用指向子类对象;有方法重写。
优势
- 在多态形式下,右边对象可以实现解耦合,便于扩展和维护。

- 定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的一切子类对象,体现出多态的扩展性与便利
多态下会产生的一个问题:
多态下不能使用子类的独有功能
多态下引用数据类型的类型转换
自动类型转换(从子到父):子类对象赋值给父类类型的变量指向。
强制类型转换吗(从父到子)
- 此时必须进行强制类型转换:子类 对象变量 =(子类)父类类型的变量
- 作用:可以解决多态下的劣势,可以实现调用子类独有的功能。
- 注意:如果转型后的类型和对象真实类型不是同一种类型,那么在转换的时候就会出现ClassCastException

Java建议强转转换前使用instanceof判断当前对像的真实类型,再进行强制转换


浙公网安备 33010602011771号