面向对象

什么是面向对象

  • 面向过程:根据解决问题的过程,直接设计系统。如 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判断当前对像的真实类型,再进行强制转换

posted @ 2023-03-04 09:35  晚点心动。  阅读(12)  评论(0)    收藏  举报