抽象类
抽象类被定义为永远不会也不能被实例化为具体的对象。它往往用于定义一种抽象上的概念,在类的继承关系中它往往被定义在较上层的位置。
(在程序设计的实践活动中,抽象类与接口存在类似的地方,即它更偏重于对共通的方法和属性进行规约。但与接口存在一个非常大的差异则在于,抽象类往往可以规约一个共同的方法和属性时提供一个对他们的实现)
以现实世界为例:“水果”可以算作一个抽象类,而“苹果”、“香蕉”则可以作为它的派生类。区别在于,“水果”是个概念,它不会有实例,但是“苹果”、“香蕉”则会有实例。
抽象类特点
- 抽象方法必须为public和protected,如果是private的话,子类将不能继承。
- 抽象类不能直接实例化,需要由具体子类来实例化,这也是一种多态
- 抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类(但可以实现多个接口)
- 子类(如果不是抽象类)就必须覆写抽象类中的所有抽象方法,如果子类无法实现父类中的抽象方法,则子类也必须定义为抽象类,无法实现的父类中的抽象方法也被定为抽象方法
- 抽象类不一定有抽象方法,有抽象方法的一定是抽象类或者是接口
下面是一个抽象类的例子(定义了一个Hero的抽象类)
package nothing;
public abstract class Hero {
public abstract void move(); //定义一个抽象方法
//Hero的子类必须要实现的方法
public abstract void attack();
}
下面是上述抽象类的一个子类(定义了一个继承与Hero的HanBing子类)
package nothing;
public class HanBing extends Hero{
private String name; //定义英雄名称
private float hp; //定义英雄生命值
private int moveSpeed; //定义英雄移动速度
public void setName(String name) {
this.name=name;
}
public String getName() {
return name;
}
//这个方法是必须要写的,如果不写将报错
@Override
public void move() {
System.out.println("寒冰正在移动");
}
@Override
public void attack() {
System.out.println("寒冰正在攻击");
}
}