Java继承性详解
继承性
先看这样一段代码
class Animal{
public void breath(){}
public void eat(){}
public void excrete(){}
public void stressResponse(){}
public void multiply(){}
public void system(){}
}
class Person extends Animal{
public void breath(){
System.out.println("进行有氧呼吸");
}
}
我们知道所有动物都有这几种特性:都能呼吸,都能摄取食物以补充能量,都能排出废物,都能对外界刺激做出反应,都能产生繁殖后代,都有系统(植物无系统)。
我们在Java中定义动物类时定义了这六种特性。当我们还需要定义人类,定义狗、猫等动物时,所有动物都具有这些特性。如果没有继承性我们将要重复不断地定义一些相同的方法,这就造成了代码的冗余。当我们使用继承性时代码便会简略很多,如上所示。不同的动物呼吸方式也不相同,我们可以还通过方法的重写对不同动物的呼吸方式进行定义。这样既提高了代码的复用性,也便于功能的扩展。
继承性的格式
在Java中我们使用关键词extends表示继承,格式如下:
class Person extends Animal{}
Person类被称为子类、派生类、subclass
Animal类被称为父类、超类、基类、superclass
继承性的性质
当子类Person继承了父类Animal时,Person类就可以重用Animal中已经编写的代码,也保留了Animal类中所有的属性。即Person获取了Animal类中声明的结构:属性和方法。
特别说明,父类中声明为private的属性和方法,子类继承父类后,仍获取了父类的私有结构,只是因为封装性的影响,使得子类不能直接调用父类的私有结构。
在Java中一个类只能有一个父类,但能够有多个子类。并且所有的类都直接或间接地继承于java.lang.Object类。
继承性的优点:
1、减少了代码的冗余
2、便于功能的扩展
3、为多态性的使用提供了前提
方法的重写
在Java中子类可以对从父类中继承而来的方法进行改造,即方法的重写。在程序执行时,子类方法将覆盖父类方法。
方法重写的要求
1、子类重写的方法名和形参列表与父类被重写的方法的方法名和形参列表相同
2、子类重写的方法的权限修饰符不小于父类方法的权限修饰符(子类不能重写父类的私有方法)
3、返回值类型
父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void
父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或者A类的子类
父类被重写的方法的返回值类型是基本数据类型,则子类重写的方法的返回值类型必须是基本数据类型
子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型
关键词super
在Java中如果我们像在子类中调用父类的结构可以使用关键词super。super可以理解为父类的,与this的作用类似,我们可以通过super调用父类的属性、方法、构造器。
super的使用
- 我们可以在子类的方法或构造器中,通过“super.属 性”或“super.”的方式,显式地调用父类中声明的属性或方法。但是,通常情况下,我们习惯省略“super.”。
- 特殊情况,当子类和父类中定义了同名的属性时,我们想在子类中调用父类中声明的属性,我们就要使用“super.”。
- 当子类重写了父类中的方法以后,我们在子类方法中调用被重写的方法式,必须使用“super.方法”的格式调用父类中被重写的方法。
- 我们可以在子类的构造器中显式地使用“super(形参列表)”的方式,调用父类中声明的指定构造器。“super(形参列表)”的使用必须声明在子类构造器的首行。当我们在构造器的首行,没有显式地声明“this(形参列表)”和“super(形参列表)”,则默认调用父类中的空参构造器。