Java继承

继承

悄悄话

哪管什么真理无穷,进一寸有一寸的欢喜。
实践是检验真理的唯一标准。
学技术的确要找捷径,但脚踏实地的古训依然成立,不循规蹈矩,但要按部就班。学习中难免会遇到坎,但要相信这终将过去,当你站在更高的视角俯瞰,这不过培塿罢了。
比如这次的继承,我初学觉得自己懂了,做个练习检验一下,处处有问题,尽管最终还是搞定了,但其实并未真正理解。今天碰巧又和后来的小伙伴一起听了继承,再理了一遍思路,终于豁然开朗,快哉快哉!

预备知识

1.类与对象
2.参数

继承简介

面向对象的三大特征之一(另两个为 封装 和 多态)
只能是单继承,即一个子类至多有一个父类
引入继承是为了实现软件复用
继承的关键字 extends

继承案例剖析及效果分析

场景:王者荣耀
对线英雄:妲己 vs 鲁班
then 胜方打主宰
采取回合制
主宰实际攻击值为其设定攻击值的两倍,实现暴击
其余按设定攻击值攻击。
要求 每个类中至多有一个方法; 输出战斗过程及结果

分析:
我们需要英雄类,主宰因为在这个情景中与英雄的属性、方法并无不同,可归为英雄类。
但主宰的攻击方法是两倍攻击值,这是不同之处,可采取子类方法重写来实现。

上手:
继承的格式为

修饰符 class SubClass(子类) extends SuperClass(父类)
{
	//定义类
}

首先我们来创建Hero类
妲己 鲁班 主宰都有的属性和方法是啥?
名字,初始血量,攻击值,(普通)攻击方法

public class Hero
{
	int blood;
	int attacknum;
	String name;
	public void attack(Hero h)
	{
	    if(h.blood>0) {
	    	h.blood=h.blood-attacknum;
	    	System.out.println(h.name+"的血量还剩"+h.blood);
	    }
	    else{
		System.out.println(h.name+"阵亡");
	    }
	}
}

then 我们来创建主宰特有的一个类,让它继承Hero类
重写attack方法

public class Boss extends Hero
{
	public void attack(Hero h)
	{
	    if(h.blood>0){
  	        h.blood=h.blood-attacknum*2;
   	        System.out.println(h.name+"的血量还剩"+h.blood);
  	    }
  	    else{
 		 System.out.println(h.name+"阵亡");
   	    }
	}
}

最后在任意一个主方法中写出

public static void main(String[] args) 
{
  // TODO Auto-generated method stub
 	 Hero c1=new Hero();
 	 Hero c2=new Hero();
  	 Boss c3=new Boss();
 	 c1.name="妲己";c1.attnum=3;c1.blood=20;
 	 c2.name="鲁班";c2.attnum=2;c2.blood=24;
 	 c3.name="主宰";c3.attnum=1;c3.blood=30;
 	 System.out.println(c2.name+"的血量为"+c2.blood);
 	 System.out.println(c1.name+"的血量为"+c1.blood);
 	 System.out.println("攻击开始!");
//回合制
     while(c1.blood>0 && c2.blood>0)
     {
  	 c1.attack(c2);
   	 c2.attack(c1);
     }
//  判断胜负
     if(c1.blood>0)
     {
   	System.out.println(c1.name+"win!");
   	//增加回血效果
  	c1.blood=c1.blood+10;
        while(c3.blood>0 && c1.blood>0)
        {
   	    c1.attack(c3);
            c3.attack(c1);
        }
     }
     else
     {
   	System.out.println(c2.name+"win!");
   	//回血效果
   	c2.blood=c2.blood+10;
 	while(c3.blood>0 && c2.blood>0)
  	{
   	    c2.attack(c3);
   	    c3.attack(c2);
  	}
     }
} 

重写方法的几点要求

有口诀:两同两小一大

两同: 方法名相同 (如都是attack);
形参列表相同(如都是Hero类的形参)
两小: 子类方法返回值类型应比父类方法返回值类型小或相等;
子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等.
一大: 子类方法的访问权限应比父类方法的访问权限大或相等(当父类方法为private时,不可重写).

访问权限: 由大到小为 public ,protected, 缺省 ,private

最后
希望有志于在大学期间掌握良好编程技能,或希望日后入职大型互联网公司或金融行业的同道中人能和我互关,交交朋友,毕竟,1+1>2嘛,大家一起进步啊!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值