一、继承的基础知识:
1.类的继承的作用:
1)提高代码的重用性。
2)提高程序的扩展性。
简单来说,就是减少代码长度,减少工作量,工程量较小的时候,体现不出继承的优点,但是如果工程量很大的时候,比如,我们要写一个打怪升级的游戏的时候,游戏中存在着很多不同血量,不同技能,不同等级的怪,但是他们都有着一些共同特性,这时,如果每一个怪我们都要单独写一段代码的话,那么工作量就很复杂,但是有了继承,我们只需在他们公共属性上面,对每个不同的怪进行简单的特殊属性增加即可。
2.类的继承的格式:
Java中类继承类的关键字:extends
格式:
public class 类名(子类、派生类、超类) extends 类名(父类、基类) {
}
注意:Java中类的继承是单继承(一个子类只能拥有一个父类,所以 extends 只能继承一个类。)。
3.子类能继承父类的哪些内容?
继承和访问修饰符是没有关系的;
子类继承父类后,子类能继承到父类所有的属性和所有的普通方法(不能继承构造方法)。
访问修饰符是用来限制属性和方法的使用范围:
访问修饰符 同类中 同包不同类中 不同包中 不同包但是有继承关系的子类中
private 可以 不可以 不可以 不可以
默认的 可以 可以 不可以 不可以
protected 可以 可以 不可以 可以
public 可以 可以 可以 可以
关于子类和父类,在main中实现的时候,其实是有优先级的。优先子类内容进行运算、输出等。
而且子类中可以定义父类中没有定义过的属性和方法,这就是一开始举例中,对不同怪进行属性值的修改。
4.方法重写:
1)什么情况下需要使用方法重写?
子类和父类都有同一个方法,但是具体实现又不同时就需要使用方法重写来实现。
同样拿我们的怪来举例。有的怪用刀,有的怪用枪,有的怪用法杖,对不同怪,我们都需要对父类中的原式怪模型进行方法重写,实现不同怪的不同攻击方式。
2)方法重写的条件
1.必须要存在继承关系;
2.子类在重写方法时,子类方法的访问修饰符必须要大于或者等于父类方法的访问修饰符;(这里的大于等于比较级,按上面提到的,private<默认的(int,double等)<protected<public)。
3.子类在重写方法时,子类方法的返回值数据类型,方法名,参数都必须要和父类的完全一致;
3)如何调用重写后的方法
根据new关键字后的类名来决定,如果类名是有子类的,则优先调用子类的方法,如果子类没有才会调用父类的方法。
4)有些方法是不能重写的?
private修饰符的方法不能重写,你定义的是新方法。
final修饰的方法不能重写,重写就会出错。
protected和默认的在特定情况下也不能重写,你定义的是新方法。
5)重写后,优先调用子类的方法,如果想要在调用子类的方法时也能执行父类的方法,要如何处理呢?
使用super关键字,格式:super.方法名(参数值,...);
super表示的是父类的对象。
二、奥特曼打小怪兽(继承)
题目:回合制对战游戏:奥特曼A和小怪兽A进行PK,直到一方的血量为0时结束战斗,输出谁胜利了!
如果奥特曼A胜利,则奥特曼A和奥特曼B进行PK,直到一方的血量为0时结束战斗,输出谁胜利了!
如果小怪兽A胜利,则小怪兽A和小怪兽B进行PK,直到一方的血量为0时结束战斗,输出谁胜利了!
这道题的核心在于写出攻击方式,明白是谁攻击谁。我们构造一个父类Man,由这个父类可以继承出奥特曼类和小怪兽类。由这两个子类,在main中出现奥特曼A、B和小怪兽A、B。下面我们写一个攻击函数attack()。既然是攻击,就要有被攻击的对象,所以我们要添加一个被攻击对象,q。
然后再完善攻击掉血。这里我们设定每受到一次攻击,血量减少1.
子类奥特曼既可以攻击小怪兽又可以攻击奥特曼:
同样的,小怪兽也既可以攻击奥特曼,又可以攻击小怪兽:
接下来,在主函数中实现功能即可。
附main完整代码:
public static void main(String[] args) {
// TODO Auto-generated method stub
Aoteman a1=new Aoteman();
a1.name="奥特曼A";
a1.blood=6;
Aoteman a2=new Aoteman();
a2.name="奥特曼B";
a2.blood=4;
Guaishou g1=new Guaishou();
g1.name="小怪兽A";
g1.blood=2;
Guaishou g2=new Guaishou();
g2.name="小怪兽B";
g2.blood=1;
do{
a1.attackg(g1);
g1.attacka(a1);
}while(a1.blood!=0&&g1.blood!=0);
if(a1.blood==0){
System.out.println("小怪兽A胜利!");
g1.blood=2;
do{
g1.attackg(g2);
g2.attackg(g1);
}while(g2.blood!=0&&g1.blood!=0);
if(g1.blood==0){
System.out.println("小怪兽B胜利!");
}
else{
System.out.println("小怪兽A胜利!");
}
}
else{
System.out.println("奥特曼A胜利");
a1.blood=6;
do{
a1.attacka(a2);
a2.attacka(a1);
}while(a2.blood!=0&&a1.blood!=0);
if(a1.blood==0){
System.out.println("奥特曼B胜利!");
}
else{
System.out.println("奥特曼A胜利!");
}
}
}