Java基础之面向对象三大特征

268 阅读4分钟

这是我参与更文挑战的第3天,活动详情查看:更文挑战

1、面向对象三大特征

1.1 继承

  不同类型的对象,相互之间经常有一定数量的共同点。同时,每一个对象还定义了额外的特性使得他们与众不同。继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承,可以快速地创建新的类,可以提高代码的重用,程序的可维护性,节省大量创建新类的时间 ,提高我们的开发效率。

关于继承需要注意以下3点

  • 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有
  • 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
  • 子类可以用自己的方式实现父类的方法(方法重写)。

1.2 封装

  类描述的是一类对象的属性和行为,封装就是把这些属性和行为隐藏到对象内部,不允许外部对象直接访问对象的内部信息,同时屏蔽行为的具体实现。

封装的优点

  • 良好的封装能够减少耦合。
  • 类内部的结构可以自由修改。
  • 可以对成员变量进行更精确的控制。
  • 隐藏信息,实现细节。

1.3 多态

多态,顾名思义,表示一个对象具有多种的状态。具体表现为父类的引用指向子类的实例。

多态的特点:

  • 对象类型和引用类型之间具有继承(类)/实现(接口)的关系;
  • 引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定;
  • 多态不能调用“只在子类存在但在父类不存在”的方法;
  • 如果子类重写了父类的方法,真正执行的是子类覆盖的方法,如果子类没有覆盖父类的方法,执行的是父类的方法.

1.4 对象实例化过程

  一个类中的静态变量、静态代码块、普通变量、代码块、构造器在对象示例化过程中,也存在着调用顺序。具体顺序如下。

对象初始化代码执行顺序.png

  对象实例化过程,就是执行类的构造函数,对应class文件中的 <init>() 方法。由于继承与多态的特性,子类在执行构造函数时,总会优先调用其父类的构造函数。<init>() 方法中的代码执行顺序为:父类变量初始化,父类代码块,父类构造器,子类变量初始化,子类代码块,子类构造器。考虑父类的子类实例化过程如下。

继承中的实例化过程.png

2、重载与重写的区别

2.1 重载(overload)

  重载发生在一个类里面,是让类以统一的方式处理不同类型数据的一种手段,表现为允许一个类中具有不同参数个数或参数类型的同名方法,是一个类多态性的表现。注:不能以返回类型作为方法重载的区分标准。

方法重载的规则

  • 必须具有不同的参数列表
  • 可以有不同的返回类型
  • 可以有不同的访问修饰符
  • 可以抛出不同的异常
  • 发生在编译期
  • 重载的方法在同一个类中

2.2 重写(override)

  重写发生在父类与子类之间,是父类与子类之间的多态性,实质是子类对父类同名方法的重新实现。子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数列表,则新方法将覆盖原有的方法,如需调用父类中原有的方法可使用super关键字调用。

方法重写的规则

  • 重写的方法之间参数列表必须完全相同
  • 访问修饰符的限制一定要大于等于被重写方法的访问修饰符
  • 重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常,比如父类方法声明了一个检查异常 IOException,在重写这个方法时就不能抛出 Exception,只能抛出 IOException 或其子类异常
  • 如果方法的返回类型是 void 和基本数据类型,则返回值重写时不可修改。但是如果方法的返回值是引用类型,重写方法返回类型应比父类返回类型更小或相等。