继承性
继承性的概念
所谓继承,就是程序猿在保持原有类特性的基础上进行扩展,增加新功能,这样的类被称为派生类或者子类,原有类被称为超类或者基类。
在对于继承性概念进行书写前,我曾查阅许多资料来保证对其表达的通俗性和准确性,但是发现貌似都是晦涩的,不像继承性和多态性一样。虽然定义是晦涩的,但是其含义还是很好理解的。
通俗的说,继承就是A类继承B类所有属性和方法,在B类的基础上进行扩展,增加一些新的功能,从而减少代码的书写。
继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。
继承解决的主要问题是:共性的抽取、实现代码复用、实现多态。
为什么需要继承性
Java中使用类来对现实世界中的实体进行描述,类经过实例化之后产生的对象,则就能用来表示现实中的实体。但是现实世界错综复杂,事物之间可能会存在一些关联,那在程序设计时就需要进行考虑。
例如现实世界中的猫和狗,他们都属于动物,自然也就会拥有年龄及体重等属性。因此在将其抽象化为类时,就要考虑把这些属性进行抽取。面向对象程序设计就提出了继承的概念,专门用来进行共性抽取,实现代码复用。
如何实现继承性
使用关键字extends来实现继承性。
public class A { // 父类、超类、基类// 属性和方法
}public class B extends B { // 子类、派生类// 属性和方法
}
继承性的好处
1. 继承的出现减少了代码的冗余,提高了代码的复用性。
2. 继承性的出现,有利于功能的扩展。
3. 继承描述事物之间的关系是“is-a”的关系,可见父类更通用,子类更具体。
4. 继承为多态的使用提供了前提。
细节说明
1. Java中声明的类,如果没有显式的声明其父类时,则默认继承于java.lang.Object类。
2. A类继承B类之后,A类拥有B类所有的属性和方法,但是由于权限修饰符的存在,可能一些属性和方法无法使用,但是它确实在内存中有,只不过是无法使用而已。
3. A类继承B类之后,除了继承B类的所有属性和方法之外,他还可以增加自己的属性和方法。
4. 对于继承性而言,它支持多层继承,但是只支持单继承。也就是说,A类可以继承B类,B类可以继承C类,C类可以继承D类,这就是多层继承;但是A类不能同时继承B类和C类,只能继承其中的一个类,这就是单继承(单继承属于Java语言的一个局限性,后续通过类实现接口的方式,来解决单继承的局限性)。
方法重写
方法重写的概念
子类对父类继承过来的方法进行覆盖、重写的操作。
通俗的说,子类在继承父类之后,子类就获取了父类中声明的所有方法,但是子类认为父类的某些方法并不适合自己进行调用,因此就会在子类中重写方法的内容。
方法重写的规则
1. 子类重写父类的方法时,两个方法的方法名与参数列表必须相同。
2. 子类在重写父类的方法时,其子类重写方法的权限修饰符必须不小于父类被重写方法的权限修饰符。并且对于父类中private权限修饰的方法,子类是不能重写的。
3. 子类在重写父类的方法时,当父类被重写方法的返回值是void或者基本数据类型时,子类重写方法必须与父类被重写方法的返回值类型相同。当父类被重写方法的返回值是引用数据类型时,其子类重写方法的返回值类型是对应引用数据类型或引用数据类型的子类。
4. 子类在重写父类方法时,子类重写方法抛出的异常类型必须是父类抛出异常类型对应类或者子类。
super关键字
super的理解
父类的,表示当前类在使用时,直接去直接父类中寻找,如果没有找到,再去直接父类的直接父类寻找,追根溯源,直到找到或者到Object类中也没找到,而不在当前类中查找需要调用的结构。如果没有super,那么就先在本类中进行寻找,如果没有找到再去继承类中找。
在【JavaSE】类和对象一文中,曾对this关键字进行过简单介绍。this表示当前对象或者当前正在创造的对象,而super表示当前对象对父类的调用或者当前正在创造的对象对父类的调用。在实例化时,本质上没有子父类一说,属性都创建在同一个内存环境中,但是便于理解和调用,使用super表示父类的属性和方法。
super和this在使用上的结构基本上相同,只是含义不同。
super可以调用的结构
属性、构造器、方法。
在构造器中,super可以调用属性、构造器和方法。但是在普通方法中,super只能调用属性和方法,不能调用构造器。
super调用属性、方法
结构:" super. "
子类在继承父类之后,我们就可以在子类的方法或者构造器中,调用父类的属性或者方法。一般情况下,都可以省略“super.”的结构,但是如果出现了子类重写了父类的方法或者子类的属性和父类的属性名相同的情况下,还想要调用父类的方法和属性,那么就要使用“super.”的结构了。
super调用构造器
结构:" super(形参列表) "
1. 子类继承父类之后,不会继承父类的构造器,只能通过“super(形参列表)”的形式来调用父类指定的构造器。
2. ”super(形参列表)“必须声明在构造器的首行,而前面的”this(形参列表)“也必须声明在构造器的首行。因此两者在调用时,只能选其一,不能同时存在。
3. 当在构造器中,没有声明“super(形参列表)”和“this(形参列表)”时,默认会调用“super()”,也就是当两者都不存在时,默认会调用父类中空参的构造器。
4. 根据上述可知,在对象实例化时,一个构造器中要么会调用本类重载的构造器,要么会调用父类的构造器。总之一定会直接或间接的调用到父类的构造器,也正是因为调用过父类的构造器,才会把父类中声明的属性或方法加载到内存中,供子类对象使用。
5. 一个类中声明n个构造器,最多有n-1个构造器中使用了this,则剩下的一个构造器一定使用了super。
继承性,就是子类通过extends关键字来继承父类,从而得到父类中的属性和方法。通过继承性,在子类中扩展新的功能,使得代码的复用性提高,同时也体现了面向对象程序设计中的层次结构。由于继承性使得子类拥有父类所有的属性和方法,但是可能父类的某些方法并不适合子类的功能,因此就出现了方法重写这一概念。