一、Java继承的语法格式
1.继承的关键字:extends 避免重写代码的麻烦
2.格式:
public class 类名(子类、超类、派生类) extends 类名(父类、基类){
}
注:Java的继承是单继承,extends后边只能加一个类名。
二、子类继承到什么?能使用什么?
子类能继承到父类所有的属性和方法。
子类能调用的方法:
1.当子类和父类同包时:默认的、受保护的、公有的属性和方法能被子类的对象和子类{}中调用。
2.当子类和父类不同包时:子类的对象能调用的只有公有的属性和方法。
子类{}中能调用的有公有的、受保护的属性和方法。
Java的访问修饰符:private、默认的、protected、public
三、方法的重写(OverWrite)
1.实现方法重写的条件:
1.必须存在继承关系
2.返回值数据类型、方法名、参数类型、参数个数、参数顺序必须要和父类完全一致
3.子类重写方法时,访问修饰符可以大于或者等于父类方法的访问修饰符
默认-->protected-->public
2.调用方法
会优先执行子类的方法,子类没有时才会继承父类的方法。
如果想调用父类的方法,那么可以使用super.方法名();
super用法和this基本类似。重载构造方法中super(属性1,属性2,。。。。)
四、自动转型
举例:byte b = 1; int i = b;
JTextField jte = new JPasswordField();
写法: 父类 对象名 = new 子类();
一个大学生是一个学生,但不能反过来说。相当于“ is a ”
问题:无法调用子类自己定义的方法。
问题:Java为什么保留自动转型?
扩大使用范围。避免重写代码,减小工作量。
五、多态的实现
多态指相同类型的对象调用相同的方法时,由于继承和重写机制,得到的结果不一定相同。
六、代码
回合制游戏:奥特曼和小怪兽要战斗,直到一方的血量为0的时候结束战斗,输出谁胜利了!
奥特曼除了可以打小怪兽外,还可以攻击其他的奥特曼对象。
小怪兽除了可以打奥特曼外,还可以攻击其他的小怪兽对象。
分析:1.设置Man类,定义各种属性、方法
2.设置Outman类、Monster类,继承自Man类
3.在主函数中实例化outman、monster时用自动转型的方法可以直接使用父类的方法
4. 完成编写
注:(一方面为了显示方便、一方面对上节课的复习,把最终结果放到一个窗体上显示出来。其中使用了JTextArea类。
jte.setColumns(23);//设置JTextArea的列数
jte.setRows(19);//设置JTextArea的行数
jte.setEditable(false);//不可编辑
append 将给定文本追加到文档结尾 insert 将指定文本插入指定位置)这些都不是重点,重点是类的继承和自动转型的使用
/**
* 定义一个Man类
* @author Administrator
*
*/
public class Man {
private String name;
private int hp;
private int atp;
//重载一个构造方法
protected Man(String name,int hp,int atp){
this.name = name;
this.hp = hp;
this.atp = atp;
}
//设置名字属性的方法
public void setName(String name){
this.name = name;
}
//获取名字属性的方法
public String getName(){
return name;
}
//设置血量属性的方法
public void setHp(int hp){
this.hp = hp;
}
//获取血量属性的方法
public int getHp(){
return hp;
}
//设置攻击力点数属性的方法
public void setATP(int atp){
this.atp = atp;
}
//获取攻击力点数的方法
public int getATP(){
return atp;
}
//设置对对手造成伤害的方法
public int fight(Man newman){
newman.setHp(newman.getHp() - atp);
newman.getHp();
// System.out.print(name+" 对 "+newman.getName()+" 造成 "+atp+" 点伤害。");
return newman.getHp();
}
}
/**
* 定义一个Monster类,该类继承自Man类
* @author Administrator
*
*/
public class Monster extends Man{
//构造方法的重载
protected Monster(String name,int hp,int atp){
super(name,hp,atp);
}
}
/**
* 定义一个奥特曼类,该类继承自Man类
* @author Administrator
*
*/
public class Outman extends Man{
//重载一个构造方法
protected Outman(String name,int hp,int atp){
super(name,hp,atp);
}
}
import java.awt.Color;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JTextArea;
/**
* 定义一个Fight类
* @author Administrator
*
*/
public class Fight {
/**
* 入口主函数
* @param args
*/
public static void main(String[] args) {
//实例化两个Outman类的对象、两个Monster类的对象
Man outman1 = new Outman("杰克奥特曼",500,200);
Man outman2 = new Outman("艾斯奥特曼",600,160);
Man monster1 = new Monster("怪兽一",400,220);
Man monster2 = new Monster("怪兽二",550,170);
//实例化一个窗体
Fight showFrame = new Fight();
showFrame.initGUI(outman1,outman2,monster1,monster2);
//实例化三次战斗
//new Fight().twoFight(outman1, monster1);
//outman1.setHp(5000);
//monster1.setHp(4000);
//new Fight().twoFight(outman1, outman2);
//new Fight().twoFight(monster1, monster2);
}
//定义一个窗体
public void initGUI(Man outman1,Man outman2,Man monster1,Man monster2) {
JFrame jf = new JFrame();
jf.setTitle("PK界面");//设置窗体的标题
jf.setSize(800, 400);//设置窗体的大小
jf.setLocation(300,150);//设置窗体位置
jf.setDefaultCloseOperation(3);//设置关闭时退出程序
jf.setResizable(true);//设置能调整窗口大小
jf.setLayout(new FlowLayout());//设置窗体布局
//调用战斗函数
new Fight().twoFight(outman1,monster1,jf);
outman1.setHp(500);monster1.setHp(400);
new Fight().twoFight(outman1,outman2,jf);
new Fight().twoFight(monster1,monster2,jf);
//设置窗体可见
jf.setVisible(true);
}
//定义战斗函数
public void twoFight(Man m1,Man m2,JFrame jf){
//实例化一个JTextArea类的对象
JTextArea jte = new JTextArea("\n"+m1.getName()+" 和 "+m2.getName()+" 开始PK"+"\n"+m1.getName()+" 血量为 "+m1.getHp()+" "+m2.getName()+" 血量为 "+m2.getHp()+"\n"+m2.getName()+" 率先攻击\n");
jte.setColumns(23);//设置JTextArea的列数
jte.setRows(19);//设置JTextArea的行数
jte.setEditable(false);//不可编辑
jf.add(jte);
//战斗方法
while(m1.getHp()>0&&m2.getHp()>0){
m2.fight(m1);
jte.append(m2.getName()+" 对 "+m1.getName()+" 造成 "+m2.getATP()+" 点伤害\n");
if(m1.getHp()<=0)
break;
else{
jte.append(m1.getName()+" 血量减少 "+m2.getATP()+" 点,血量剩余 "+m1.getHp()+" 点\n");
m1.fight(m2);
jte.append(m1.getName()+" 对 "+m2.getName()+" 造成 "+m1.getATP()+" 点伤害。\n");
jte.append(m2.getName()+" 血量减少 "+m1.getATP()+" 点,血量剩余 "+m2.getHp()+" 点\n");
}
}
if(m2.getHp()<=0)
jte.append(m2.getName()+" 血量为零 "+"\n"+m1.getName()+" 取得胜利\n");
else
jte.append(m1.getName()+" 血量为零 "+"\n"+m2.getName()+" 取得胜利\n");
}
}