继承的定义:
使用继承的目的:当一个类与另一个类有很多相同的属性时,用继承类可以省去反复写代码的麻烦。
继承的语法格式
关键字:extends
格式:
public class 类名(子类,超类,派生类) extends 类名(父类,基类) {
}
子类的继承方式
属性和方法的类型包括:public,protected,private,默认的。
1.当子类和父类在同一个包下时,只有私有属性和方法不能在子类中调用。
2.子类和父类不在同一个包下时,公有的,受保护的方法和属性能在子类中调用;公有的属性和方法能在子类的对象中调用。
方法的重写
条件:
1.必须要存在继承关系;
2.返回值的数据类型,方法名,参数个数,参数类型,参数顺序必须要和父类中的方法完全一致.
3.子类中的访问修饰符范围可以大于父类中的。
(左边出现一个绿色箭头,表示方法是重写的。)
什么情况下使用方法的重写?
子类和父类都有同一个方法,但是做的方式不同。
怎样调用重写的方法?
优先调用子类的方法。如果子类没有,则调用父类的方法。
例子:书的重写;父与子的继承,都看书,但是方法不同,用重写。
自动转型
要实现自动转型,就必须要存在继承关系。
格式一:
父类名 对象名=new 子类构造方法();
ex:Student stu1=new UNStudent();
格式二:
public 返回值数据类型 方法名(父类名 对象名){
对象名.调用父类中定义过的方法();
}
父类名 对象名A=new 子类构造方法();
子类名 对象名B=new 子类构造方法();
方法名(对象名A);
方法名(对象名B);
自动转型引起 编译错误的原因是:
1.编译机制的问题
2.Java在编译的时候,只会根据对象的类型进行编译。
会将你调用的方法,拿到父类中一一比对,如果没有发现,则 直接抛出报错。
运行:还是优先执行子类的方法,如果子类没有,才会执行父类的。
子类中新定义的方法不能使用。
应用举例:
add方法;
用父母的名字称呼你:你是不是某某的儿子女儿。
**是大学生,说他是学生。
举例:大学老师教各种学生。
不使用自动转换就要定义多个方法。
6.多态
多态是由方法重载,继承,方法重写,自动转型等技术的组合。
7.练习
1.回合制游戏:奥托曼可以攻击小怪兽,奥托曼可以攻击其他的奥托曼,
知道一方的血量为0的时候结束战斗,输出谁胜利了!
[code="java"][/code]
package exe;
public class Fighter{
String name;
public int hp;
@SuppressWarnings("unused")
public int ep;
public Fighter(String name){
this.name=name;
}
public void setName(String name){
this.name=name;
}
public void setHp(int hp){
this.hp=hp;
}
public void setEp(int ep){
this.ep=ep;
}
public String getName(){
return name;
}
public int getHp(){
return hp;
}
public void fight(Fighter fig){
fig.setHp(fig.getHp()-5);
System.out.println( name+" hurts "+fig.getName()+" by 5 points.");
}
public void fight(Fighter fig,int blood){
fig.setHp(fig.getHp()-blood);
System.out.println( name+" hurts "+fig.getName()+" by "+blood+" points.");
}
}
package exe;
public class NEWFighter extends Fighter {
public void fight(Fighter fig){
fig.setHp(fig.getHp()-10);
System.out.println(this.name+"使用新的攻击方法攻击了"+fig.getName()+"。打掉了10点血.");
}
public void fight(Fighter fig,int blood){
fig.setHp(fig.getHp()-blood*2);
System.out.println(this.name+"使用魔法攻击了"+fig.getName()+"。打掉了"+blood*2+"点血");
}
}
package exe;
public class Manager{
public static void main(String [] args){
Fighter f1=new Fighter("no name");
f1.setName("Outerman1");
f1.setHp(100);
f1.setEp(20);
Fighter b1=new Fighter("no name");
b1.setName("Boss");
b1.setHp(50);
b1.setEp(100);
Fighter m1=new Fighter("no name");
m1.setName("Monster");
m1.setHp(10);
m1.setEp(5);
Fighter f2=new NEWFighter("no name");
f2.setName("Outerman2");
f2.setHp(100);
f2.setEp(50);
while(f1.getHp() > 0 && m1.getHp() > 0){
f1.fight(m1);
if(m1.getHp() <= 0){
System.out.println(f1.getName()+" wins "+m1.getName());
break;
}
m1.fight(f1);
if(f1.getHp() <= 0){
System.out.println(m1.getName()+" wins "+f1.getName());
break;
}
}
while(f1.getHp() > 0 && b1.getHp() > 0){
f1.fight(b1,5);
if(b1.getHp() <= 0){
System.out.println(f1.getName()+" wins "+b1.getName());
break;
}
b1.fight(f1,10);
if(f1.getHp() <= 0){
System.out.println(b1.getName()+" wins "+f1.getName());
break;
}
}
f1.setHp(100);
f1.setEp(20);
while(f1.getHp() > 0 && f2.getHp() > 0){
f1.fight(f2,5);
if(f2.getHp() <= 0){
System.out.println(f1.getName()+" wins "+f2.getName());
break;
}
f2.fight(f1,10);
if(f1.getHp() <= 0){
System.out.println(f2.getName()+" wins "+f1.getName());
break;
}
}
}
}
使用继承的目的:当一个类与另一个类有很多相同的属性时,用继承类可以省去反复写代码的麻烦。
继承的语法格式
关键字:extends
格式:
public class 类名(子类,超类,派生类) extends 类名(父类,基类) {
}
子类的继承方式
属性和方法的类型包括:public,protected,private,默认的。
1.当子类和父类在同一个包下时,只有私有属性和方法不能在子类中调用。
2.子类和父类不在同一个包下时,公有的,受保护的方法和属性能在子类中调用;公有的属性和方法能在子类的对象中调用。
方法的重写
条件:
1.必须要存在继承关系;
2.返回值的数据类型,方法名,参数个数,参数类型,参数顺序必须要和父类中的方法完全一致.
3.子类中的访问修饰符范围可以大于父类中的。
(左边出现一个绿色箭头,表示方法是重写的。)
什么情况下使用方法的重写?
子类和父类都有同一个方法,但是做的方式不同。
怎样调用重写的方法?
优先调用子类的方法。如果子类没有,则调用父类的方法。
例子:书的重写;父与子的继承,都看书,但是方法不同,用重写。
自动转型
要实现自动转型,就必须要存在继承关系。
格式一:
父类名 对象名=new 子类构造方法();
ex:Student stu1=new UNStudent();
格式二:
public 返回值数据类型 方法名(父类名 对象名){
对象名.调用父类中定义过的方法();
}
父类名 对象名A=new 子类构造方法();
子类名 对象名B=new 子类构造方法();
方法名(对象名A);
方法名(对象名B);
自动转型引起 编译错误的原因是:
1.编译机制的问题
2.Java在编译的时候,只会根据对象的类型进行编译。
会将你调用的方法,拿到父类中一一比对,如果没有发现,则 直接抛出报错。
运行:还是优先执行子类的方法,如果子类没有,才会执行父类的。
子类中新定义的方法不能使用。
应用举例:
add方法;
用父母的名字称呼你:你是不是某某的儿子女儿。
**是大学生,说他是学生。
举例:大学老师教各种学生。
不使用自动转换就要定义多个方法。
6.多态
多态是由方法重载,继承,方法重写,自动转型等技术的组合。
7.练习
1.回合制游戏:奥托曼可以攻击小怪兽,奥托曼可以攻击其他的奥托曼,
知道一方的血量为0的时候结束战斗,输出谁胜利了!
[code="java"][/code]
package exe;
public class Fighter{
String name;
public int hp;
@SuppressWarnings("unused")
public int ep;
public Fighter(String name){
this.name=name;
}
public void setName(String name){
this.name=name;
}
public void setHp(int hp){
this.hp=hp;
}
public void setEp(int ep){
this.ep=ep;
}
public String getName(){
return name;
}
public int getHp(){
return hp;
}
public void fight(Fighter fig){
fig.setHp(fig.getHp()-5);
System.out.println( name+" hurts "+fig.getName()+" by 5 points.");
}
public void fight(Fighter fig,int blood){
fig.setHp(fig.getHp()-blood);
System.out.println( name+" hurts "+fig.getName()+" by "+blood+" points.");
}
}
package exe;
public class NEWFighter extends Fighter {
public void fight(Fighter fig){
fig.setHp(fig.getHp()-10);
System.out.println(this.name+"使用新的攻击方法攻击了"+fig.getName()+"。打掉了10点血.");
}
public void fight(Fighter fig,int blood){
fig.setHp(fig.getHp()-blood*2);
System.out.println(this.name+"使用魔法攻击了"+fig.getName()+"。打掉了"+blood*2+"点血");
}
}
package exe;
public class Manager{
public static void main(String [] args){
Fighter f1=new Fighter("no name");
f1.setName("Outerman1");
f1.setHp(100);
f1.setEp(20);
Fighter b1=new Fighter("no name");
b1.setName("Boss");
b1.setHp(50);
b1.setEp(100);
Fighter m1=new Fighter("no name");
m1.setName("Monster");
m1.setHp(10);
m1.setEp(5);
Fighter f2=new NEWFighter("no name");
f2.setName("Outerman2");
f2.setHp(100);
f2.setEp(50);
while(f1.getHp() > 0 && m1.getHp() > 0){
f1.fight(m1);
if(m1.getHp() <= 0){
System.out.println(f1.getName()+" wins "+m1.getName());
break;
}
m1.fight(f1);
if(f1.getHp() <= 0){
System.out.println(m1.getName()+" wins "+f1.getName());
break;
}
}
while(f1.getHp() > 0 && b1.getHp() > 0){
f1.fight(b1,5);
if(b1.getHp() <= 0){
System.out.println(f1.getName()+" wins "+b1.getName());
break;
}
b1.fight(f1,10);
if(f1.getHp() <= 0){
System.out.println(b1.getName()+" wins "+f1.getName());
break;
}
}
f1.setHp(100);
f1.setEp(20);
while(f1.getHp() > 0 && f2.getHp() > 0){
f1.fight(f2,5);
if(f2.getHp() <= 0){
System.out.println(f1.getName()+" wins "+f2.getName());
break;
}
f2.fight(f1,10);
if(f1.getHp() <= 0){
System.out.println(f2.getName()+" wins "+f1.getName());
break;
}
}
}
}