Java中类的继承学习小结

Java中类的继承学习小结

 

 一、Java中什么是继承?
         java是面向对象的编程语言,是类构成了java语言,而继承又是java 必不可少的,继承就是当你写一个类时,虽然这个类满足了某些功能但是你又想拓展它的功能,此时你就可以使用继承机制在写一个该类的子类,来完成你需要的功能;

 

二、继承的格式:  public 子类名 extends 父类名(){}
                        注: Java中子类是单根继承的,即一个子类只能有一个父类,但一个父类可以有多个子类。
三、为什么需要继承?
      子类继承父类时,子类会继承父类的所有行为和属性,子类可以复用父类的代码通过继承,可以不用重写父类中已有的属性和行为。在类与对象的学习总结中,战士类和怪兽类都具有相同的属性:血量和姓名,具有相同的方法:战斗方法,因此可以让它们都继承同一个父类,课提高代码的利用效率。

 

四、子类继承到了父类的哪些属性和方法
        子类继承到了父类所有的属性和方法(public,protected,private,默认的)。
        子类不能继承父类中访问权限为private的成员属性和方法。
    

       1. 子类和父类在同一个包下,能调用的方法和属性:
            只有私有的属性和方法不能在子类中和子类的对象调用。
        2 .子类和父类不同包,能调用的属性和方法:
            子类中:  公有的,受保护的属性和方法
            子类的对象:公有的属性和方法
          注:super关键字指父类对象,一般用来调用父类中方法

 

五、子类重写父类的方法

    1 条件:1.已经继承到的方法
                  2.返回值数据类型 ,方法名,参数个数,参数类型, 参数顺序必须要和父类的完全一致。
                  3.子类重写方法时可以扩大访问修饰符的范围(但是不能缩小)。
    2.什么情况要使用方法重写
       当父类的方法不能满足实际的需求时
    3.怎么调用重写的方法
      优先调用子类的方法,如果子类没有,则调用父类的。

 

六、自动转型

     要实现自动转型就必须要存在继承关系。
 
 格式:
  父类名 对象名 = new 子类构造方法();
  Student stu = new UNStudent();
  
 格式二:
  public 返回值数据类型  方法名(父类名 对象名){
   对象名.调用父类中定义过的方法();
  }
  
  父类名 对象名A = new 子类构造方法();
  子类名 对象名B = new 子类构造方法();
  
  方法名(对象名A);
  方法名(对象名B);
  
  
 自动转型引起编译错误的原因是:
  1.编译机制的问题。
  2.Java在编译的的时候,只会根据对象名的类型进行编译。
  会将你调用的方法,拿到父类中进行一一比较,如果发现没有在父类中
  定义的方法,则直接抛出编译错误。
  
  注:程序运行时,还是会优先执行子类的方法,如果子类没有,才会执行父类的。
 

七、程序示例

      通过改写类与对象学习总结中的战士与怪兽的程序达到:战士可以攻击怪兽,战士可以攻击其他的战士,怪兽也可以攻击其它的怪兽,知道一方的血量为0的时候结束战斗,输出谁胜利了!(战斗双方自行定义)。

 

/**
 * 定义一个Normal类
 * @author huas
 *
 */
public class Normal {
	//定义属性
	String name;
	int blood;
	//设置和调用属性值的方法
	public void setName(String name){
		this.name = name;
	}//设置姓名
	public String getName(){
		return name;
	}//得到姓名
	public void setBlood(int x){
			blood = x;
	}//设置血量
	public int getBlood(){
		return blood;
	}//得到血量
	/**
	 * 定义一个战斗方法
	*/
	public void Attack(Normal n){
		n.blood--;
		System.out.println(this.getName()+"  攻击了  "+n.getName()+"  ");
			

       }
}


/*
 * 定义一个战士类继承Normal类
 */
public class Soldier extends Normal{
	/**
	 * 构造函数
	 */
	public Soldier(String name,int i){
		this.name = name;
		blood = i ;
	}
	/**
	 * 重写父类中的战斗方法
	*/
	public void Attack(Normal n){
		n.blood--;
		System.out.println(this.getName()+"  攻击了  "+n.getName()+"  ");
		System.out.println(n.getName()+" 血量减一    ");
		System.out.println(n.getName()+"  血量为  "+n.getBlood()+"   "+this.getName()+"   的血量为  "+this.getBlood());
		System.out.println("----------------------------------------------------------------------------");

	}


}



/*
 * 定义一个怪兽类继承Normal类
 */
public class Monster extends Normal{
	/**
	 * 构造函数
	 */
	public Monster(String name,int i){
		this.name = name;
		blood = i;
	}
	/**
	 * 重写父类中的战斗方法
	 */
	public void Attack(Normal n){
		n.blood--;
		System.out.println(this.getName()+"  攻击了  "+n.getName()+"  ");
		System.out.println(n.getName()+" 血量减一    ");
		System.out.println(n.getName()+"  血量为  "+n.getBlood()+"   "+this.getName()+"   的血量为  "+this.getBlood());
		System.out.println("----------------------------------------------------------------------------");

	}

}


/*
 * 定义一个Test类
 */
public class Test {

	/**定义程序入口
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//实例化一个战士对象和怪兽对象(自动转型)
		Normal sd1 = new Soldier("雷欧",13);
		Normal sd2 = new Soldier("泰罗",10);
		Normal ms1 = new Monster("哥斯拉",5);
		Normal ms2 = new Monster("玛伊王",7);
		//确定攻击对象
		VS(sd1,ms2);
				
	}
	/**
    * 定义战斗平台
    */
	public static void VS( Normal n1,Normal n2){
	//攻击前判断双方血量是否均大于零
	while((n1.blood>0)&&(n2.blood>0)){
		n1.Attack(n2);//n1攻击n2	
		if(n2.blood<=0){
			System.out.println(n1.getName()+"   胜利了 !");
			break;
			}//若n2血量为零,则n2胜利,跳出循环
							
		n2.Attack(n1);
		if(n1.blood<=0){
			System.out.println(n2.getName()+"   胜利了 !");
			break;
			}//若n2血量为零,则n1胜利,跳出循环
							
		}
	}
}

 

 

//程序运行的结果为


雷欧  攻击了  玛伊王  
玛伊王 血量减一    
玛伊王  血量为  6   雷欧   的血量为  13
----------------------------------------------------------------------------
玛伊王  攻击了  雷欧  
雷欧 血量减一    
雷欧  血量为  12   玛伊王   的血量为  6
----------------------------------------------------------------------------
雷欧  攻击了  玛伊王  
玛伊王 血量减一    
玛伊王  血量为  5   雷欧   的血量为  12
----------------------------------------------------------------------------
玛伊王  攻击了  雷欧  
雷欧 血量减一    
雷欧  血量为  11   玛伊王   的血量为  5
----------------------------------------------------------------------------
雷欧  攻击了  玛伊王  
玛伊王 血量减一    
玛伊王  血量为  4   雷欧   的血量为  11
----------------------------------------------------------------------------
玛伊王  攻击了  雷欧  
雷欧 血量减一    
雷欧  血量为  10   玛伊王   的血量为  4
----------------------------------------------------------------------------
雷欧  攻击了  玛伊王  
玛伊王 血量减一    
玛伊王  血量为  3   雷欧   的血量为  10
----------------------------------------------------------------------------
玛伊王  攻击了  雷欧  
雷欧 血量减一    
雷欧  血量为  9   玛伊王   的血量为  3
----------------------------------------------------------------------------
雷欧  攻击了  玛伊王  
玛伊王 血量减一    
玛伊王  血量为  2   雷欧   的血量为  9
----------------------------------------------------------------------------
玛伊王  攻击了  雷欧  
雷欧 血量减一    
雷欧  血量为  8   玛伊王   的血量为  2
----------------------------------------------------------------------------
雷欧  攻击了  玛伊王  
玛伊王 血量减一    
玛伊王  血量为  1   雷欧   的血量为  8
----------------------------------------------------------------------------
玛伊王  攻击了  雷欧  
雷欧 血量减一    
雷欧  血量为  7   玛伊王   的血量为  1
----------------------------------------------------------------------------
雷欧  攻击了  玛伊王  
玛伊王 血量减一    
玛伊王  血量为  0   雷欧   的血量为  7
----------------------------------------------------------------------------
雷欧   胜利了 !

 

 

    此程序的战斗双方可随意定义,VS(Normal n1,Normal n2)中的战斗双方子要满足时Normal类或其子类都可以进行回合制战斗!

 

注:在写程序的过程中发现父类中的构造方法一般是不能被子类继承的,由此百度:要使得父类的构造方法能够被子类继承:有一个B类继承A类      public B(){
    super();  //如果A类的构造方法没有参数    这句就可以省略    如果A类没有无参数的构造方法,你还必须写出来,并且把要传递的参数也写到super(参数);
    ......
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值