一、继承的语法格式
public
class 类名(子类名,超类名,派生类名) extends (
父类、基类){ }
**Java的单继承性,只有一个直系子类
**如果父类中存在一个构造方法,则子类中必须存在一个跟他
相同的构造方法
二、能够继承与能够调用的区别
1、子类可以继承到父类的所有属性和方法
2、但是由于访问修饰符的问题,导致只有一部分属性和方法
能被子类和子类的对象调用,其中,调用规则如下:
//同包下,在子类中能调用的方法:public公有的、
protected受保护的和默认的属性方法
//不同包下,在子类中能调用的方法:public公有的,
protected受保护的属性方法
三、方法重写
当子类的某些方法中的元素与父类不同时需要方法重写。比如
public void study(){
//super.study();//调用父类的方法
System.out.println(this.getName()+"的
学习方式不同啦!");
}
重写的条件
1.必须要存在继承关系。
2.方法的返回值数据类型、方法名、参数个数、参数类型、参
数顺序都必须要和父类的完全一致。
3.子类重写方法时的访问修饰符范围可以大于或者等于父类方
法的访问修饰符。
**关于访问值大小比较的问题
重写父类的
学习方法时,扩大访问值,void<pravit<public
四、super
关键字和this关键字的区别
super:用于调用父类的方法
eg:super.study();
this:用于区分形参名跟属性名,或者调用具有某种类型和数
量的参数的方法
五、自动转型
自动转型来自于生活,往往是用大的范围来表示小的范围
在Java中要实现自动转型必须要存在继承关系
byte b = 10;
int i = b;
int的范围大于byte
格式:
父类名 对象名 = new 子类构造方法();
**在使用自动转型后,要注意,不能调用子类中自己定义的方
法,若存在方法重写,会自动调用重写后的方法
**我们曾经用到过的自动转型
.add(组件)
所以我们用的add()都是同一个~~~组件是JLable神马的父类
,已经用到了自动转型
六、关于练习
这次练习估计是最困扰的一次,希望这真的是最困扰的一次,
没有之一。
通过这一次的练习,我
发现了自己思维上的几个漏洞
第一,分析问题时容易把问题搞得复杂化,本来精短的代码,
总是搞得很长
第二,在处理问题前没有一个清晰的思路和方法,总是摸索着
修改,不能一步到位,还丢三落四
第三,对于知识的
理解不深入,浮于浅表,都是应试教育的恶
果。。。。。。
第四,思维惰性,自己下苦心
研究的意志不够
坚定。
**总结思路:
1 首先要清楚该分成几个部分,主函数部分,父类,两个子类,
同时由于有四个技能,所以可以写成一个技能类。
2 接着,分析父类。父类要写清楚属性与方法,其中属性包括血
量,名称,技能,技能要用一个数组来表示Skill[],Skill类
在另一个类中写明;方法则包括常规的,获取与设置名称、血
量、技能,还有对战方法,如下
public void fight(Hero hero){
//随机获取一个技能 length是10,随机
的就是0~9
int index = random.nextInt
(skill.length);
//让hero英雄的血量减少 hero受到攻击
hero.setBlood(hero.getBlood() - skill
[index].getAttack());
if(hero.getBlood()<0){
hero.setBlood(0);
}
System.out.print(hero.getName()+"受
到"+name+"使用"+skill[index].getName()+"技能攻击。");
System.out.println("\t"+hero.getName
()+"剩余的血量是"+hero.getBlood());
}
这是最核心的部分,尤其传入的参数的类型是Hero,而不是德
玛或者卡牌;随机获取技能也是核心,他避免了像我当初所想
,将每个技能都用一遍导致代码过长,思路混乱的问题。
3 然后,分析子类,两个子类有什么方法需要重写?有什么方法
需要自己创建?都是需要思考的问题举例德玛类
public Garen(String name, int blood, Skill[]
skill) {
super(name, blood, skill);
// System.out.println("Garen的构造方法");
}
public void fight(Hero hero){
super.fight(hero);//这并没有重写方法而是直接调用了父类的方法
}
}
4 关于Skill类就是基本的定义攻击力与技能名称属性还有设置与获取属性的方法
5 最后就是主函数,主函数一定要思路清楚,什么方法在
何处调用,怎么是用
循环控制,现贴出代码如下
package cn.netjava.lesson06_2;
public class Game {
/**
* @param args
*/
public static void main(String[] args) {
Skill [] gSkill = {new Skill("普通攻击",10),new Skill("致命打击",100),new Skill("勇气",200),new Skill("审判",300),new Skill("德玛西亚正义",400)};
Garen garen = new Garen("德玛",1000,gSkill);
Skill [] tSkill = {new Skill("普通攻击",20),new Skill("万能牌",150),new Skill("选牌",250),new Skill("卡牌骗术",350),new Skill("命运",450)};
Twisted twisted = new Twisted("卡牌",1000,tSkill);
while(garen.getBlood() > 0 && twisted.getBlood() > 0){
garen.fight(twisted);
if(win(twisted)){
System.out.println(garen.getName()+"胜利!");
break;
}
twisted.fight(garen);
if(win(garen)){
System.out.println(twisted.getName()+"胜利!");
break;
}
}
}
/**
* 判断输赢的方法
* @param hero被攻击的对象
* @return 返回true表示hero对象挂了
*/
public static boolean win(Hero hero){
if(hero.getBlood() <= 0){
return true;
}
return false;
}
}