Java学习——面向对象之继承

来源:互联网 发布:mac拷贝文件到ntfs 编辑:程序博客网 时间:2024/06/14 10:38

前言

前面给小伙伴的分享了面向的对象的封装,这里我给大家分享的是面向对象的继承,继承是我们在开发当中很经常用到的。什么是继承呢?

继承

继承是面向对象的第二特征,它的定义是从已有的类派生出新的类,新的类能吸收已有的类属性和行为,并能拓展新的能力。

继承是Java面向对象技术的一块基石,因为它允许创建分等级层次的类。继承可以理解为一个对象从另一个对象获取属性的过程。

继承的实现

在Java语言中继承使用extends关键字来建立联系。

//从形状类派生出矩形类public class Rect extends Shape{}//从矩形类中派生正方形类public class Square extends Rect{}

继承的特点

  1. Java只支持单一继承,但是可以多层继承。
  2. 不能继承父类private的属性和方法。
  3. 子类不能继承父类的构造方法,但是可以通过super关键字去访问。

什么情况使用继承

发现两个类关系是IS-A,一个对象是另外一个对象的一个分类。

使用继承的好处

  • 继承简化了人们对事物的认知和描述,能清晰体现类与类之间的层次结构关系。
  • 继承提供了原件复用功能。若类B继承类A,那么建立类B时只需要在描述与基类(A类)不同的少量特征(数据类型和成员方法)即可。这种做法能减少代码和数据的冗余度,大大增加程序的重用性。
  • 继承通过增强一致性类减少模块间的接口和界面,大大增加了程序的已维护性。

继承中的初始化

从类的结构上而言,其内部可以有如下四种常见形态:属性(包括类的属性和实例属性)、方法(包括类方法和实例方法)、构造器和初始化块(包括类的初始化块和实例的初始化块)。对于继承中的初始化顺序,有具体分为类的初始化和对象的初始化。

类的初始化

在jvm装载类的准备阶段,首先为类的所有类属性和类初始化块分配内存空间。并在类首次初始化阶段中为其进行初始化,类属性和类初始化块之间的定义时的顺序决定了其初始化的顺序。若类存在父类,则首先初始化父类的类属性和类初始化块,一直上溯到Object类最先执行。

对象的初始化

在new创建对象时,首先对对象属性和初始化块分配内存,并执行默认初始化。如果存在父类,则先为父类对象属和初始化块先分配内存并执行初始化。然后执行父类构造器中的初始化程序,接着才开始对子类的对象属性和初始化块执行初始化。

需要注意的是

  1. 在对象初始化阶段,属性和方法均针对子类可以从父类继承过来的属性和方法而言,一般而言,都是针对父类中非private而言的。因为private修饰的为父类所特有的,子类没有继承过来,当new子类时,无须为其分配空间并执行初始化。当然了,父类的构造器子类也是不继承过来的,但构造器另当别论。

  2. 类的初始化只执行一次,当对同一个类new多个对象时,类属性和类初始化块只初始化一次。

继承中的隐藏

隐藏含义:实际上存在,但是对外不可见。

Java类具有三种访问控制符:private、protected和public,同时当不写这三个访问控制符时,表现为一种默认的访问控制状态。因此,一共具有四种访问控制级别。
具体访问控制表现如下:

private修饰的属性或方法为该类所特有,在任何其他类中都不能直接访问;default修饰的属性或方法具有包访问特性,同一个包中的其他类可以访问;protected修饰的属性或方法在同一个中的其他类可以访问,同时对于不在同一个包中的子类中也可以访问;public修饰的属性或方法外部类中都可以直接访问。

当子类继承父类,子类可以继承父类中具有访问控制权限的属性和方法(一般来说是非private修饰的),对于private修饰的父类所特有的属性和方法,子类是不继承过来的。

当子类需要改变继承过来的方法时,也就是常说的重写父类的方法。一旦重写后,父类的此方法对子类来说表现为隐藏。以后子类的对象调用此方法时,都是调用子类重写后的方法,但子类对象中想调用父类原来的此方法时,可以通过如下两种方式:

1.将子类对象类型强制转化为父类类型,进行调用;

2.通过super调用。

同样的,如果在子类中定义父类中相同名称的属性时,父类属性在子类中表现为隐藏。

Super关键字

super代表父类的一个标识,且当作父类对象一个引用,可以使用该关键字调用父类非私有的属性和非私有方法。

如果父类有无参构造方法,那么子类的每一个构造方法可以不显式调用super();

如果父类没有无参构造方法,那么子类的每一个构造方法都必须显式调用父类的有参构造方法。

super()调用父类的构造方法,必须放在第一行。

Object类

Object类是所有Java类的祖先类。每个类的Object作为超类。所有对象(包括数组)都实现这个类的方法。
在不明确的情况下,Java会自动把Object作为定义类的超类。
可以使用Object的变量指向任意类型的对象。(多态)
Object中包含所有类都有的方法,比如比较常用的equals和toString方法。

重写

在Java中,子类可以继承父类的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动的继承父类的方法,而是想做一定的修改,这就是采用方法的重写。方法重写又称方法的覆盖。

若子类中的方法与父类中的某一方法具有相同方法名、返回值类型和参数列表,则新的方法覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用当前类的父类。

注意:子类方法的访问修饰权限不能严于父类;

重载和重写的区别

前面我们有提起Java中的方法重载,这里我们有提到了方法的重写,那么我们来看一下他们的区别。

  1. 重写需要方法名、返回值、参数列表完全相同。重载需要方法名相同,参数列表不同,可以有不同的返回值。
  2. 重写访问权限必须大于父类,而重载没有这个要求。
  3. 重写发生在父类和子类当中,而重载发生在本类当中。
原创粉丝点击