一、继承概念
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使的子类具有父类相同的行为。
二、首先新建一个父类,名为Cars
package introduction7; public class Cars { int speed; //创建一个构造方法 public Cars(int startSpeed) { speed = startSpeed; } //创建一个名为increaseSpeed的方法 public void increaseSpeed() { speed++; System.out.println("cars 类的加速。。。"); } //创建一个名为idcreaseSpeed的方法 public void idecreaseSpeed() { speed--; System.out.println("cars 类的减速。。。"); } }
二、创建一个名为BMW的类,此类继承Cars,因此Cars是BMw的父类
package introduction7; //extends关键字:继承父类时使用 public class BMW extends Cars{ public BMW(int startSpeed) { //super关键字,用于访问父类中的方法或变量 super(startSpeed); } @Override public void increaseSpeed() { super.increaseSpeed(); } public void hesdupDisplayBavigation() { System.out.println("bmw特有方法"); } }
此类中应用到两个关键字,extends和super:
extends表示继承,子类BMW继承了父类Cars中所有的方法和变量。
super关键字,用于访问父类中的方法或变量。
访问了父类中的构造方法,访问格式为:super(参数),实例如下(调用父类中的increaseSpeed方法):
public BMW(int startSpeed) { //super关键字,用于访问父类中的方法或变量 super(startSpeed); }
在子类的构造方法的第一行都有一个默认的隐私语句super(),调用时必须写在子类构造方法的第一行,否则编译不通过;
super()是指对象,不可以在static环境中使用,包括:static变量,static方法,static语句块。
调用父类中的方法,变量,格式为:super.变量名,super.方法名(),实例如下(调用父类中的increaseSpeed方法):
public void increaseSpeed() { super.increaseSpeed(); }
eclipse中有一种可以直接调用父类方法中的功能,和前面直接调用get和set方法一样:
工具栏source---》Override/Implement Methonds...---》勾选要调用的父类方法,如下图:
调用后显示为:
三、再新建一个类InheritanceDemo,方便演示:
package introduction7; public class InheritanceDemo { public static void main(String[] args) { int speed = 0; //cars类自己对自己调用 Cars c1= new Cars(speed); c1.increaseSpeed(); BMW bmw1 = new BMW(speed); bmw1.increaseSpeed(); bmw1.hesdupDisplayBavigation(); } }
打印结果为:
根据结果可见,BMW实例化的对象bmw1对方法increaseSpeed的打印和父类Cars中的方法IincreaseSpeed一致,打印的结果都为"Cars 类的加速",因此可见BMW成功调用的父类Cars的方法。
四、重写
子类在继承父类方法的同时,相对该方法中的功能做一些修改,此时就需要用到重写。
列如我们修改BMW中继承的父类方法,将原本打印输出为“Cars 类的加速”修改为打印“BMW加速”,修改如下:
打印结果为:
五、重写和重载的区别
重写(也可以叫方法覆盖):方法名相同,参数列表相同
一般在父类和子类当中,子类重写了父类的一个方法。
子类将父类继承过了的方法重新定义一次,重新填写方法中的代码。
不能改变父类方法中的返回值,如父类中返回是String,子类重写后想返回一个int,这样是不成功的,必须返回为String。
重写是子类的访问权限必须大于父类的访问权限。
如果父类方法抛出异常,那么在子类中重写父类的该方法也会抛出异常。
重载:方法名相同,参数列表不同。
出现在同一个类中。