3.2.2 方法的重写
在继承关系中,子类会自动继承父类中定义的方法,但有时在子类中需要对继承的方法进行一些修改,即对父类的方法进行重写。在子类中重写的方法需要和父类被重写的方法具有相同的方法名、参数列表以及返回值类型,且在子类重写的方法不能拥有比父类方法更加严格的访问权限。
例1:
class Animal{ //父类,动物类
protected String name;
protected int age;
public void eat(){
System.out.println(name+"正在进食。");
}
}
class Herbivore extends Animal{ //子类,食草动物类
public void eat(){ //重写父类的方法
System.out.println(name+"在吃草和树叶。");
}
}
class Carnivore extends Animal{ //子类,食肉动物类
public void eat(){ //重写父类的方法
System.out.println(name+"在吃捕猎到的动物肉。");
}
}
public class Test{
public static void main(String[] args) {
Herbivore h1=new Herbivore();
h1.name="兔子小白";
h1.eat();
Carnivore c1=new Carnivore();
c1.name="狮子席巴";
c1.eat();
}
}
上面的代码运行结果是:
兔子小白在吃草和树叶。
狮子席巴在吃捕猎到的动物肉。
可以看到,都是继承自Animal类的eat()方法,但是在两个子类中都被重写了,通过子类的对象调用eat()方法也是调用了重写后的方法。
3.2.3 super关键字
当子类重写父类的方法后,子类对象就无法访问父类原先那个没被重写的方法,为了解决这个问题,Java提供了super关键字,super关键字可以在子类中调用父类的普通属性、方法以及构造方法。
将上面的例1修改一下:
class Animal{ //父类,动物类
protected String name;
protected int age;
public void eat(){
System.out.println(name+"正在进食。");
}
}
class Herbivore extends Animal{ //子类,食草动物类
public void eat(){ //重写父类的方法
super.eat(); //调用父类的eat方法
System.out.println(name+"在吃草和树叶。");
}
}
class Carnivore extends Animal{ //子类,食肉动物类
public void eat(){ //重写父类的方法
super.eat(); //调用父类的eat方法
System.out.println(name+"在吃捕猎到的动物肉。");
}
}
public class Test{
public static void main(String[] args) {
Herbivore h1=new Herbivore();
h1.name="兔子小白";
h1.eat();
Carnivore c1=new Carnivore();
c1.name="狮子席巴";
c1.eat();
}
}
上面的代码运行结果是:
兔子小白正在进食。
兔子小白在吃草和树叶。
狮子席巴正在进食。
狮子席巴在吃捕猎到的动物肉。
在子类中访问父类的成员,可以在前面加上super关键字。
格式如下:
访问父类的属性: super.属性名
访问父类的普通方法: super.方法名(参数列表)
访问父类的构造方法: super(参数列表)
注意:通过super()调用父类构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次。