Java中的类可以作为子类继承父类中的所有public属性和方法,继承的关键字为:extends。值得注意的是,子类可以调用父类中的属性和方法,而父类无法调用子类中的属性和方法(就如我们可以说儿子的眼睛像父亲的眼睛,但如果说父亲的鼻子像儿子的鼻子就有些不妥了)。
类的继承格式:
class 父类 {
}
class 子类 extends 父类 {
}
类可以继承多个父类的属性和方法(就如一个孩子的特点可以来自他的父亲、母亲、爷爷、奶奶等)。同样的,一个父类也可以被多个多个子类继承。
下面为一个例题,可以体现继承的优点:
以王者荣耀为背景,假设有三个英雄,三者之间两两按顺序攻击,判断最后谁获得胜利。如若没有继承,那三个英雄两两攻击时,过程很繁琐,需要重复的代码很多,每一个类里面都要包含两个方法(分别对其他两个英雄进行攻击)。但如果用了继承,则可以把每个子类当中的方法放在同一个父类当中,这样六个方法就可以整合为一个。
代码如下:
父类Hero
package herit;
public class Hero {
String name;
int hp;
int ad;
public void ack(Hero hero){
hero.hp-=ad;
System.out.println("玩家"+name+"对"+hero.name+"发动攻击"+hero.name+"的剩余血量值为"+hero.hp);
}
}
三个子类,分别表示了三个英雄:
英雄一:
package herit;
public class A extends Hero{
}
英雄二
package herit;
public class B extends Hero{
public void ack(Hero hero,Hero hero2){
hero.hp=hero.hp-hero2.ad-50;
System.out.println("玩家"+name+"对"+hero.name+"发动攻击"+hero.name+"的剩余血量值为"+hero.hp+"(含50额外暴击)");
}
public int back(Hero hero,int i){
if(i==3){
hero.hp +=100;
System.out.println("玩家"+hero.name+"三回合后回血100,其剩余血量为:"+hero.hp);
i=0;
}
return i;
}
}
英雄三
package herit;
public class C extends Hero{
}
最后,含有主函数的类
package herit;
public class Manage {
public static void main(String []args){
A a=new A();
a.name="【王昭君】";
a.hp=3546;
a.ad =564;
B b=new B();
b.name="【鲁班】";
b.hp=4987;
b.ad =257;
C c=new C();
c.name="【诸葛亮】";
c.hp=4367;
c.ad =365;
for(int i=0;a.hp>0&&b.hp>0;i++){
a.ack(b);
if(b.hp<=0){
System.out.println("玩家"+a.name+"获得胜利");
break;
}
b.ack(a,b);
i=b.back(b, i);
}
if(b.hp>0)
System.out.println("玩家"+b.name+"获得胜利");
if(a.hp>0){
for(;a.hp>0&&c.hp>0;){
a.ack(c);
if(c.hp<=0){
System.out.println("玩家"+a.name+"获得胜利");
break;
}
c.ack(a);
}
if(c.hp>0)
System.out.println("玩家"+c.name+"获得胜利");
}
else{
for(int i=0;b.hp>0&&c.hp>0;i++){
b.ack(c,b);
if(c.hp<=0){
System.out.println("玩家"+b.name+"获得胜利");
break;
}
c.ack(b);
i=b.back(b, i);
}
if(c.hp>0)
System.out.println("玩家"+c.name+"获得胜利");
}
}
}
仔细看源代码,会发现B英雄中不仅改变的父类中的函数,还定义了新的函数。在Java中这样做是完全合法的。
结果如下:
- 玩家【王昭君】对【鲁班】发动攻击【鲁班】的剩余血量值为4423
玩家【鲁班】对【王昭君】发动攻击【王昭君】的剩余血量值为3239(含50额外暴击)
玩家【王昭君】对【鲁班】发动攻击【鲁班】的剩余血量值为3859
玩家【鲁班】对【王昭君】发动攻击【王昭君】的剩余血量值为2932(含50额外暴击)
玩家【王昭君】对【鲁班】发动攻击【鲁班】的剩余血量值为3295
玩家【鲁班】对【王昭君】发动攻击【王昭君】的剩余血量值为2625(含50额外暴击)
玩家【王昭君】对【鲁班】发动攻击【鲁班】的剩余血量值为2731
玩家【鲁班】对【王昭君】发动攻击【王昭君】的剩余血量值为2318(含50额外暴击)
玩家【鲁班】三回合后回血100,其剩余血量为:2831 玩家【王昭君】对【鲁班】发动攻击【鲁班】的剩余血量值为2267
玩家【鲁班】对【王昭君】发动攻击【王昭君】的剩余血量值为2011(含50额外暴击)
玩家【王昭君】对【鲁班】发动攻击【鲁班】的剩余血量值为1703
玩家【鲁班】对【王昭君】发动攻击【王昭君】的剩余血量值为1704(含50额外暴击)
玩家【王昭君】对【鲁班】发动攻击【鲁班】的剩余血量值为1139
玩家【鲁班】对【王昭君】发动攻击【王昭君】的剩余血量值为1397(含50额外暴击)
玩家【鲁班】三回合后回血100,其剩余血量为:1239 玩家【王昭君】对【鲁班】发动攻击【鲁班】的剩余血量值为675
玩家【鲁班】对【王昭君】发动攻击【王昭君】的剩余血量值为1090(含50额外暴击)
玩家【王昭君】对【鲁班】发动攻击【鲁班】的剩余血量值为111
玩家【鲁班】对【王昭君】发动攻击【王昭君】的剩余血量值为783(含50额外暴击)
玩家【王昭君】对【鲁班】发动攻击【鲁班】的剩余血量值为-453 玩家【王昭君】获得胜利
玩家【王昭君】对【诸葛亮】发动攻击【诸葛亮】的剩余血量值为3803
玩家【诸葛亮】对【王昭君】发动攻击【王昭君】的剩余血量值为418
玩家【王昭君】对【诸葛亮】发动攻击【诸葛亮】的剩余血量值为3239 玩家【诸葛亮】对【王昭君】发动攻击【王昭君】的剩余血量值为53
玩家【王昭君】对【诸葛亮】发动攻击【诸葛亮】的剩余血量值为2675
玩家【诸葛亮】对【王昭君】发动攻击【王昭君】的剩余血量值为-312 玩家【诸葛亮】获得胜利