继承是JAVA对象面向对象的三大特性之一,即子类可以继承父类的属性和方法,从而使子类对象具有父类的特征和行为。
继承的原理:以动物为例子,动物可分为食肉动物,食草动物,杂食动物,我们可以去思考它们是否具有相同的特征,比如都有腿,眼睛,能够去进食等相同属性和方法,我们完全可以用一个父类去进行归纳总结,而不必去为每个动物单独设置共同的属性和方法,大大减少了工作量,极大的提高了效率。
继承的关键字为extends,通过它确定了子类与父类的关系
具体用法:public class 子类 extends 父类{},当然继承的前提是父类存在。
子类继承父类也是有要求的,与权限有关,权限符号:public(公共的),protected(受保护的),private(私有的),缺省的。
public:在整个项目下可以使用。
protected:同一个包下以及子类类中。
private:在本类中使用,只能自己使用。
缺省的:通常是不写的,同一个包内可以使用
子类继承父类的好处在于,减少了代码的代码量,不需要反复去写。另外在工作的时候,如果需要添加功能或者是修改,主要修改父类就可以了。不好的地方也是有的,假如父类错了,那么整个项目自然而然就出错了,牵一发而动全身。
- 注意:
- 子类不能选择性继承父类;
- 子类只能继承一个父类,但是可以声明多个接口
- 构造方法不会被子类去继承,但可以在子类中去调用父类的构造方法。
重写是子类非常重要的方法,重写父类的方法具有与父类方法相同的名称,参数数量,方法类型和方法,大概只有参数值可以不同了,哈哈。(如果在重写父类的方法之后,还要调用父类的方法,使用super.就可以了。
来简单举一个例子,相信大家都玩过游戏,游戏人物都会有自己的一些属性和行为,类似于生命值,攻击等等。
首先建立一个父类
public class hero {
String nameId;
int ad;
int lv;
int hp;
}
父类可以看作为一个公共类,现在去建立几个子类
import game0331.hero;
public class HouYi extends hero {
public void ack_q(hero h){
int num = (int) (400 + ad * 0.8 + lv * 20);
h.hp -= num;
System.out.println(nameId + "攻击了" + h.nameId + "使其失去了" +
num + "点生命值,其还剩下" + h.hp
);
}
}
import game0331.hero;
public class LuBan extends hero {
public void ack_q(hero h){
int num = (int) (400 + ad * 0.8 + lv * 20);
h.hp -= num;
System.out.println(nameId+ "攻击了" + h.nameId+ "使其失去了" +
num + "点生命值,其还剩下" + h.hp);
}
}
import game0331.hero;
public class ZhangFei extends hero {
public void ack_q(hero h){
int num = (int) (400 + ad * 0.8 + lv * 20);
h.hp -= num;
System.out.println(nameId+ "攻击了" + h.nameId+ "使其失去了" +
num + "点生命值,其还剩下" + h.hp);
}
}
别忘了还需要设置一个主类,用以运行。
import game0331.HouYi;
import game0331.LuBan;
public class PK {
public static void main(String args[]){
HouYi HY=new HouYi();
ZhangFei ZF=new ZhangFei();
HY.nameId="后羿";
HY.hp=4000;
HY.ad=10;
HY.lv=10;
ZF.nameId="张飞";
ZF.ad=10;
ZF.hp=3400;
ZF.lv=10;
HY.ack_q(ZF);
ZF.ack_q(HY);
LuBan LB=new LuBan();
LB.nameId="鲁班";
LB.ad=40;
LB.hp=5000;
LB.lv=10;
LB.ack_q(HY);
LB.ack_q(ZF);
}
}
运行效果图如下
基本就是这样了。