第五次总结
类的继承
优点: 提高代码重用性
语句:
public class 子类名 extends 父类名{}//java 中是单继承,即extends后边只能加一个类名
子类能继承到的:父类所有的属性和方法。
子类能够调用的:
1.当子类和父类同包:默认的、受保护的、公有的属性和方法能被子类的对象和子类{}中调用。
2.当子类和父类不同包:子类对象能调用的只有公有的属性和方法
子类的{}中能调用的属性和方法有:公有的、受保护的
方法重写:
实现方法重写的条件:
1.必须要存在继承关系
2.返回值数据类型、方法名、参数个数、参数类型和参数顺序必须要和父类方法的完全一致。
3.子类重写方法时,方法的访问修饰符可以大于或者等于父类方法的访问修饰符。//默认<protected<public
调用方法:
会优先执行子类的方法,子类没有的时候才会执行父类的方法。
如果想调用父类的方法,那么可以使用super.方法名();
super(name,score);//调用父类中带两个参数的构造方法
自动转型:
值传递中,将一个范围较小的类型的变量的数值赋给一个范围较大的类型的变量。如int a=byte b;
引用传递中,将子类对象赋予一个父类对象也属于自动转型。
##对于引用传递,java中自动转型造成的问题,无法调用子类自己定义的方法。
##那么这种自动转型存在的意义为何?
##答:扩大类的使用范围。
例子:如果一个老师是大学老师,那么他也将足以胜任高中、初中、小学课程的授课。
.练习
1.回合制游戏:奥特曼和小怪兽要战斗,直到一方的血量为0的时候结束战斗,输出谁胜利了!
奥特曼除了可以打小怪兽外,还可以攻击其他的奥特曼对象。
小怪兽除了可以打奥特曼外,还可以攻击其他的小怪兽对象。
####################先定义一个表示参与者的Player类######################
public class Player {
private int blood ;
private String name;
//初始化血量的方法
public int initBlood(int bl)
{
this.blood=bl;
return this.blood;
}
public void setName(String na){
name = na;
}
//查看名字方法
public String getName(){
return this.name;
}
//掉血方法
public void setBlood(int de){
this.blood = this.blood-de;
}
//查看血量方法
public int getBlood(){
return this.blood;
}
//戰鬥方法
public void fight(int n,Player p){
switch(n){
case 48:
System.out.println(this.name+"Miss.. "+p.name+"血槽:"+this.blood);
break;
case 49:
p.setBlood(100);
System.out.println(this.name+"给了"+p.name+"一击,伤害100! "+p.name+"血槽:"+this.blood);
break;
case 50:
p.setBlood(200);
System.out.println(this.name+"给了"+p.name+"一!!暴击!!伤害200!!! "+p.name+"血槽:"+this.blood);
break;
}
}
}
#####################定义一个表示奥特曼的Ultraman子类继承Player####################
public class Ultraman extends Player{
public Ultraman(String na) {
setName(na);
}
}
#####################定义一个表示怪兽的Monster子类继承Player###################
public class Monster extends Player{
public Monster(String na) {
setName(na);
}
}
#####################定义程序入口主函数###################
package cn.myy.study0720;
public class Game {
public static void main(String [] args){
Ultraman ul=new Ultraman("奧特曼");//定义一个奥特曼类型的对象
Monster mo=new Monster("小怪兽");//再定义一个怪兽类型的对象
Ultraman ulb=new Ultraman ("坏的奥特曼");//再定义一个奥特曼类型的对象
Monster mo2=new Monster("大怪兽");//再定义一个大怪兽
ul.initBlood(1000);
mo.initBlood(1000);
Game.begin(ul,mo);//奥特曼打小怪兽
ul.initBlood(1000);
ulb.initBlood(1000);
Game.begin(ul,ulb);//奥特曼打坏的奥特曼
mo.initBlood(1000);
mo2.initBlood(1000);
Game.begin(mo, mo2);//小怪兽打大怪兽
}
static void begin(Player p1,Player p2)
{
String s="10121112011121111111112";//以一个字符串模拟随机的格斗 状态
for(int i=0;i<s.length();i++){
if(p1.getBlood() > 0 && p2.getBlood() > 0){//血槽均不为0的状态 下
if((i % 2 )== 0){//奇偶数体现轮流的回合制
p1.fight((int)s.charAt(i),p2);}
else{
p2.fight((int)s.charAt(i),p1);}
}
}
if(p1.getBlood() <= 0){System.out.println(p1.getName()+"挂了,"+p2.getName()+"胜利%>_<%");}
if(p2.getBlood() <= 0){System.out.println(p2.getName()+"挂了,"+p1.getName()+"胜利O(∩_∩)O");}
}
}