3.2.2 方法的重写 & 3.2.3 super关键字

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()调用父类构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值