继承是面向对象三大特征(封装、继承、多姿)之一,Java的继承具有单继承的特点,每个子类都只有一个直接父类,但不仅限于一个父类,这点在下文会提到。
继承的特点
Java继承的关键字是extends,实现继承的类被称为子类,被继承的称为父类,子类就是父类的特别版,类似于水果与苹果的关系,水果就是父类,而水果中的苹果便被称为子类。 Java里子类继承父类的语法格式如下:
修饰符 class Apple(子类) extends Fruit(父类)
子类继承了父类,可以获得父类的全部属性和方法,但值得注意的是:Java的子类不能获得父类的构造器。
下面展示Fruit类的代码:
public class Fruit
{
public String colour;
public void info()
{
System.out.println("这个水果的颜色是"+colour);
}
}
public class Apple extends Fruit
{
public static void main(String[] args)
{
Apple a = new Apple();
//Apple本身没有colour的属性,但因为Apple继承了Fruit,也可以访问Fruit的属性
a.colour = "黄色";
a.info();
}
}
因为Java继承的单继承的特性,所以Java没有办法像C++在一个extends后加好几个父类,仅仅只有一个直接父类, 但可以通过叠加的方式间接继承。
class Fruit extends Plant
class Apple extends Fruit
上述Plant称为Apple的间接父类。
重写父类的方法
子类继承了父类的全部属性和方法,作为特殊的一种父类,但有一种特殊情况:子类需要重写父类的方法。例如大部分人头发的颜色是黑色的,但有些人的头发却染成了黄色,我们不能再把黑色头发的属性加在黄色头发上,为此我们需要重写黄色头发类的方法。
下面程序先定义了一个Hair类:
public class Hair
{
public void colour()
{
System.out.println("我的头发颜色是黑色的");
}
}
下面又定义了一个YelloHair类,这个类extends了Hair类,我们需要重写YellowHair类的colour方法,程序如下:
public class YellowHair extends Hair
{
public void colour()
{
System.out.println("我的头发颜色不是黑色的,是黄色的");
}
public static void main(String[] args)
{
YellowHair a = new YellowHair();
a.colour();
}
}
执行上面程序,YellowHair的colour不在调用Hair的colour,而是被重写,类似于优先级,重写的优先级大于继承的优先级。
这种子类包含与父类同名方法的现象被称为方法重写,也被称为方法覆盖(Override)。需要注意的是:覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个类方法,一个实例方法。