??1.继承的作用?
?2.java中继承的格式
????? (1)继承的关键字:extends
?????? (2)继承的语法格式:
pulic class 类名(子类名,派生类名,超类名) extends 类名(父类名,基类名){
}
3.子类继承了父类的那些属性和方法
???? 子类继承了父类的所有的属性和方法,继承了所有的属性和方法并不代表所有的属性和方法都可以被使用.
eg:
a:儿子继承了父亲所有的财产但不可能一下全部都花掉
?? b:假设父类与子类同包
//定义一个父类Student类
public class Student{
//姓名属性的值
private? String name;
//学分属性的值
private int score;
}
//定义一个子类Unstudent类
public class Unstudent extends Student{
}
此时,子类继承的方法就不能用了,应为private只能在类{}中使用
访问修饰符?????????????? 访问修饰符的范围
?private????????????????? 只能在某个类的大括号内使用? 类{private...}
?默认的?????????????????? 算是一种受保护的包(继承中"protected"访问修饰符与"默认的"区别是前者可以出包也能使用)
?protected??????????????? 受保护的在包中使用
?public?????????????????? 一个项目中的任何一个地方都可以使用
?
??? (1)子类与父类同包的情况
???????? 访问修饰符 private 默认的 protected public 类型都可以被子类对象直接使用
??? (2)子类与父类不同包的情况
???????? public protected 访问修饰符类型可以被子类的对象直接调用来使用
4.方法重写
????????
??? (1)为什么要方法重写
???
?对一个对象来说其行为可以有多重不同的表现形式这是就要用到方法重写,比如说同事玩这个行为,
??????? 玩的不仅可以是篮球,还可以是其他东西
?
??? (2)方法重写的条件
???????
??必须是继承中在使用的;
?子类的访问修饰符范围必须大于或等于父类的访问修饰符的范围;
?返回值的类型,方法名,参数的数据类型,参数的个数,以及参数的顺序必须一致
???? (3)方法重写与方法重载的区别:
?????
?前者必须存在继承的关系而后者则不需要;
?前者的访问修饰符的类型可以不同,而后者的访问修饰符的类型必须与之前的一样;
?前者的参数类型,参数个数,参数的顺序必须一致,而后者正是这些不同才能区分是某个对象的方法重载
????? (4)如何调用方法重写的
? ?
?1>主函数的类中判断new的对象,如果new的是子类,那么先执行就是子类的方法
??2>如果没有子类则执行的是父类的方法?
5.自动转型
??
???? 实现自动转型的前提条件必须是:继承关系
?格式:
??? 父类名? 对象名=new 子类名();
??????? 注意:
?但是,在自动转型的时候,对象调用方法必须是父类中存在的方法;
??假如父类中不存在un.play();的方法
??在自动转型的时候? Student un=new UNstudent();
?????un.play();
??????????????? 此操作的结果就会报错.
?
?造成这种现象的原因主要是java变异机制的问题,对象会根据对象的数据类型找对应的方法,不存在
?该类方法就会报错
?自动转型的例子:JFrame.add(JPanel);
??????????????????????
???????????? ??老师教学生 public void teach(Student un){
?? ??????un.study()
??????}
??????UNstudent un=new UNstudent();
??????t.teach(un);
6.多态
??
???? java中的方法重载, 方法重写,自动转型,继承等技术的结合
7.以对战类的游戏为例展现继承:
/** * 定义一个heroVS1hero的包来管理Solider类 */ package heroVS1hero; /** * 定义一个Solider类 * * @author Allen * */ public class Solider { // 定义一个名字属性 private String name; // 设置名字属性的方法 public void setName(String name) { this.name = name; } // 获取名字属性的方法 public String getName() { return name; } // 定义一个血量属性的方法 private int blood; // 设置血量属性的方法 public void setBlood(int blood) { this.blood = blood; } // 获取血量属性的方法 public int getBlood() { return blood; } // 技能属性 private Skill[] skill; // 设置技能属性 public void setSkill(Skill[] skill) { this.skill = skill; } // 获取技能属性 public Skill[] getSkill() { return skill; } // 定义一个攻击方法 public void pk(Solider sl) { // 技能随机 java.util.Random rand = new java.util.Random(); int index = rand.nextInt(skill.length); Skill sk = skill[index]; sl.setBlood(sl.getBlood() - sk.getAttack());// 被攻击英雄的血量设置 System.out.println(name + "攻击" + sl.getName() + "使用了技能" + sk.getName() + sl.getName() + "剩余" + sl.getBlood() + "滴血;"); } }
?
/** * 定义一个heroVS1hero的包来管理Solider1类 */ package heroVS1hero; /** * 定义一个Solider类继承自Solider类 * @author Allen * */ public class Solider1 extends Solider { //定义一个构造方法 public Solider1(String name,int blood){ super.setBlood(blood); super.setName(name); } }
/** * 定义一个heroVS1hero的包来管理Solider2类 */ package heroVS1hero; /** * 定义一个Solider2类继承自Solider * @author Allen * */ public class Solider2 extends Solider{ //定义一个构造方法 public Solider2(String name,int blood){ super.setBlood(blood); super.setName(name); } }
?
/** *定义一个heroVS1hero的包来管理skill类 */ package heroVS1hero; /** * 定义一个Skill类 * * @author Allen * */ public class Skill { /* * 技能的构造方法 */ public Skill(){} public Skill(String name,int attack){ this.name = name; this.attack = attack; } // 技能的名字属性 public String name; // 设置技能名属性 public void setName(String name) { this.name = name; } // 获取技能名的属性 public String getName() { return name; } // 技能伤害的属性 private int attack; // 设置技能伤害的属性 public void setAttack(int attack) { this.attack = attack; } // 获取技能伤害的属性 public int getAttack() { return attack; }
?
/** * 定义一个heroVS1hero的包来管理Vs_game类 */ package heroVS1hero; /** * 定义一个Vs_game类 * * @author Allen * */ public class Vs_game { /** * 定义一个程序的入口主函数 * * @param args */ public static void main(String[] args) { /* * 实例化一个Skill类 */ Skill[] sk = { new Skill("寒冰", 60), new Skill("禁錮", 70),new Skill("回复光环",80),new Skill("极寒领域",100) };//技能数组 Skill[] sk1 = { new Skill("法术箭", 130), new Skill("吼叫", 80),new Skill("命令光环",60),new Skill("换位",0) };//技能数组 // 创建一个Solider1类的对象 Solider1 sol = new Solider1("水晶室女", 1200); sol.setSkill(sk); // 创建一个Solider2对象 Solider2 sol1 = new Solider2("复仇之魂", 1100); sol1.setSkill(sk1); /* * 战斗方法 */ while (sol.getBlood() > 0 && sol1.getBlood() > 0) { sol.pk(sol1); if (sol1.getBlood() <= 0) { System.out.println(sol.getName() + "获得了胜利!"); break; } sol1.pk(sol); if (sol.getBlood() <= 0) { System.out.println(sol1.getName() + "获得了胜利!"); break; }// 判断双方法的血量 } } }