抽象类的使用
参考文献《疯狂java讲义》李刚
1、抽象类是什么东西
抽象类可以理解为从多个具有相同特征的类中抽象出来的类,以这个类作为其子类的模板,可以避免子类设计的随意性,子类可以在抽象类(父类)的基础上进行扩展、改造等。
使用abstract修饰符修饰的类。
拥有抽象方法的类必为抽象类。
抽象类还不能使用new关键字实例化,抽象类中的构造器不能用于创造实例,其子类可以调用。
抽象类:
//我们会类中定义一些方法来描述该类的某些行为,有些方法有方法体,又有些方法没有方法体,
//有方法体的方法称为普通方法,没有方法体的需要使用abstract修饰符修饰,这种方法称为抽象方法。子类需要重写父类的抽象方法。
//拥有抽象方法的类是抽象类,抽象类不一定有抽象方法。
//抽象类
public abstract class Animal {
private String typeName;
//无参构造
public Animal() {
}
//有参构造
public Animal(String typeName) {
this.typeName = typeName;
System.out.println("执行了Animal的有参构造");
}
//我们会类中定义一些方法来描述该类的某些行为,有些方法有方法体,又有些方法没有方法体,
//有方法体的方法称为普通方法,没有方法体的需要使用abstract修饰符修饰,这种方法称为抽象方法。
//拥有抽象方法的类是抽象类,抽象类不一定有抽象方法
//例如下面的live()方法有方法体属于普通方法,eat()方法经过abstract修饰符修饰所以就不能再拥有方法体,称为抽象方法。
//抽象方法
public abstract void eat();
//普通方法
public void live(){
System.out.println("生活在地球上");
}
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
}
子类:
//子类
public class Sheep extends Animal {
//无参构造
public Sheep() {
//调用父级有参构造
super("羊");
}
//实现父级的抽象方法
@Override
public void eat() {
System.out.println("小羊跪着吃青草");
}
}
测试:
public class Test01 {
public static void main(String[] args) {
Animal animal = new Sheep();
animal.eat();
}
}
结果:
2、如过父类为抽象类且还没有指定的方法,将父级的引用变量引用到子类的示例,调用子类方法就需要强制类型转换调用子类方法了。程序的灵活性也就降低了。例如
public static void main(String[] args) {
Animal animal = new Sheep();
//父级没有run方法,调用子类方法就需要将父类强制转换成子类
((Sheep) animal).run();
}
3、我们可以利用抽象类更好的发挥多态的优势,使得程序更加灵活。