一. 继承的概述
在Java中,一个类可以继承另一个类,前者(继承类)一般叫做子类(派生类),而相对应的后者(被继承的类)叫做父类(超类,基类)。
在同包下,子类可以继承父类中的属性和方法(但不能直接使用私有属性和私有方法),这样大大减少了代码量,避免一些重复的代码。
继承的格式是 public class 子类 extends 父类 {} ,使用 extends
关键字进行继承。例如:
public class Animal { public void eat(){ System.out.println("eat something"); } } public class Tiger extends Animal{ }
在上面例子里,Tiger 类继承了 Animal类,Tiger类的对象可以使用Animal类的eat方法。
二.子类重写父类中的方法
子类继承父类,子类的对象可以使用父类中的方法。
但有时父类中的方法不能完全满足子类的要求:比如上述的Tiger子类继承的eat方法是吃肉,而如果有另一个sheep子类的eat方法就应该是吃草,两个子类不能都完全使用父类中的方法,要根据自己的需求进行改写。
在子类中重新定义父类中的方法,这个过程就叫做子类重写父类中的方法。
重写需要满足两个要求:
-
两个类具有继承关系
-
重写的方法和父类的方法返回值类型,方法名,参数类型(个数,顺序)完全一样,子类方法的访问修饰符要大于等于父类
例如:
public class Animal { public void eat(){ System.out.print("eat something"); } public void makesound(){ System.out.print("The animal is making a sound."); } } public class Tiger extends Animal{ public void eat(){ System.out.println("eat meat"); } public void makesound(){ System.out.println("The tiger is roaring."); } }
三.super关键字
在子类中,我们有时候需要使用父类中的方法,如果说子类已经覆盖父类方法时,此时采用super
完成对父类方法的调用,这样做可以保留父类中原有的功能。
例如:
public class Animal { public void eat(){ System.out.print("eat something"); } public void makesound(){ System.out.print("The animal is making a sound."); } } public class Tiger extends Animal{ public void eat(){ super.eat(); System.out.println("eat meat"); } public void makesound(){ super.makesound(); System.out.println("The tiger is roaring."); } }
在上述例子中,子类重写方法时首先使用super关键字对父类方法进行了调用。
四.继承的层次结构
与实现接口不同,Java中类的继承只能是单继承,即一个子类只能继承一个父类,不能继承多个父类。如同一个儿子只能有一个父亲。
但一个类可以间接的继承多个类,例如如果类C继承了类B,类B又继承了类A,那么类C就间接地继承了类A。在这种情况下,类C可以访问类A和类B的属性和方法。
五.自动转型与强制转型
自动转型(也叫向上转型),如果子类继承了父类,可以把子类自动转型成父类:
B extends A
A a = new B();
调用看左边,执行看右边。
也就是先从左边的父类对象中找到方法,看右边的子类有没有重写过该方法,如果有就优先执行子类中重写的方法。
自动转型后该对象只能调用子类中重写的方法
使用强制转型(向下转型)来调用子类中特有的方法,前提:该对象先进行了自动转型。