前一篇:
这一篇,我们开始去分享抽象类
由于多态的存在,每个子类都可以覆写父类的方法。
class yuebing extends Food{
@Override
public double getTax(){
return super.getTax();
}
}
class Mantou extends Food{
@Override
public double getTax(){
return income*0.8;
}
}
class Food {
protected double income=100;
public double getTax() {
return income * 0.1;
}
}
从Food
类派生的Mantou和yuebing都可以覆写getTax()
方法。
如果父类Food
的getTax()
方法没有实际意义,能否去掉方法的执行语句?
答案是不行,会导致编译错误,因为定义方法的时候,必须实现方法的语句。
能不能去掉父类的getTax()方法?
答案还是不行,因为去掉父类的getTax()方法,就失去了多态的特性。
如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法,目的是让子类去覆写它,那么,可以把父类的方法声明为抽象方法:
abstract class Food {
public abstract void getTax() ;
}
二者都必须是抽象的才可以。即 类抽象,下面一个只定义抽象类的方法。
定义的抽象类,是不能直接去实例化的
public class Main {
public static void main(String[] args) {
Food food=new Food() ;
}
}
abstract class Food {
public abstract void getTax() ;
}
运行报错如下
那么这样的类,能做什么呢?只能被继承。那么如何继承呢?
class Manto extends Food{
@Override
public void getTax() {
}
}
abstract class Food {
public abstract void getTax() ;
}
很简单,但是继承后必须实现getTax方法。
定义了抽象类,抽象类方法,在继承的时候,必须重写抽象类的抽象方法。
如果抽象类有非抽象的方法,继承的时候,不用复写的
class Manto extends Food{
@Override
public void getTax() {
}
}
abstract class Food {
public abstract void getTax() ;
public void say(){
System.out.println("sss");
}
}
当我们定义了抽象类Food,以及具体的Manto子类的时候,我们可以通过抽象类Food类型去引用具体的子类的实例.
这种引用抽象类的好处在于,我们对其进行方法调用,并不关心Food类型变量的具体子类型.
尽量引用高层类型,避免引用实际子类型的方式,称之为面向抽象编程。
面向抽象编程的本质就是:
上层代码只定义规范(例如:abstract class Food);
不需要子类就可以实现业务逻辑(正常编译);
具体的业务逻辑由不同的子类实现,调用者并不关心。
到这里抽象类就分享完毕。