继承就是子类继承父类的特征和行为
有时候单一划分某个类别并不能处理所有情况,某些类别下有明显不同的子类,这些子类虽然拥有类似的行为和属性,但是他们各自发生的这些行为的方式或者属性对某些结果的影响是不一样的,这就需要划分出更多细致的类别。
比如之前类和对象笔记中,球员这个类别,球员都有球衣,号码,得分这些属性,打球的行为,但是很明显,篮球运动员和足球运动员在这些属性和行为上是有区别的。篮球运动员打球可以用手,胳膊。足球运动员打球可以脚踢头顶。篮球运动员一场得分两位数很正常,足球运动员显然不可能一场得分两位数。
基于这个分析。我们有必要把这个类拆分成篮球运动员类和足球运动员类。首先我们把所有球员的公共属性和公共行为抽象出来,形成一个类。然后通过继承,让两个子类都去享有这个类的公共属性和行为,但是具体行为依靠自己来实现。(测试框架中的测试基类)
java提供了extends关键字来实现继承功能
首先新建一个球员类Player:
packagelesson;public classPlayer {public int number; //号码
public int score; //得分
public String position; //司职
public String name; //姓名
public voidplayBall(){
System.out.println("姓名:"+this.name);
System.out.println("号码:"+this.number);
System.out.println("得分:"+this.score);
System.out.println("司职:"+this.position);
}
}
接下来创建篮球运动员类和足球运动员类
packagelesson;public class BasketBallPlayer extendsPlayer{public static voidmain(String[] args){
BasketBallPlayer player1= newBasketBallPlayer();
player1.name= "jordan";
player1.number= 23;
player1.position= "得分后卫";
player1.score= 33;
player1.playBall();
}
}
packagelesson;public class FootBallPlayer extendsPlayer {public static voidmain(String[] args){
FootBallPlayer player2= newFootBallPlayer();
player2.name= "齐达内";
player2.number= 10;
player2.position= "中场";
player2.score= 2;
player2.playBall();
}
}
虽然这两个类中没有任何属性和方法,但是能点出Player类的属性,还能调用父类的方法。说明它继承到了父类的属性和方法。
需要注意的是:子类并不能继承父类的构造方法
创建子类对象时,会先调用父类的构造方法,然后调用自己的构造方法。
由于每个类都默认有一个默认的无参数的构造方法,所以为了看出效果。需要显示的创建这几个类的构造方法。
packagelesson;public classPlayer {public int number; //号码
public int score; //得分
public String position; //司职
public String name; //姓名
publicPlayer(){
System.out.println("我是Player");
}public voidplayBall(){
System.out.println("姓名:"+this.name);
System.out.println("号码:"+this.number);
System.out.println("得分:"+this.score);
System.out.println("司职:"+this.position);
}
}
packagelesson;public class BasketBallPlayer extendsPlayer{publicBasketBallPlayer(){
System.out.println("我是BasketBallPlayer");
}public static voidmain(String[] args){
BasketBallPlayer player1= newBasketBallPlayer();
player1.name= "jordan";
player1.number= 23;
player1.position= "得分后卫";
player1.score= 33;
player1.playBall();
}
}
packagelesson;public class FootBallPlayer extendsPlayer {publicFootBallPlayer(){
System.out.println("我是FootBallPlayer");
}public static voidmain(String[] args){
FootBallPlayer player2= newFootBallPlayer();
player2.name= "齐达内";
player2.number= 10;
player2.position= "中场";
player2.score= 2;
player2.playBall();
}
}
结果说明:在创建子类对象时,会先调用父类的构造方法,然后调用自己的构造方法
这个结果并不能说明子类在继承父类时,也继承了父类的构造方法,只能说默认会调用而已。