18. 抽象类

1.抽象分析

  需求:定义一个狗类和鸟类,并且具备叫的方法,例如 汪汪  叽叽喳喳

 

  方案:定义一个父类(基类)Animal,并且有动物的名字和叫法。

  再定义2个子类继承父类

 

  苦恼:动物一般都有叫的行为,但是叫法又不同,那我在父类如何定义叫的成员函数呢?

 

  解决1:不写叫的行为(成员函数),但是如果不写是不是可以认为动物没有叫的能力呢?

  违背我们类的定义,否定方案。

 

  解决2:定义行为,但不写具体的实现------抽象方法。

 

  例如:

    abstract class Animal {

      //定义抽象方法

      abstract void shout();

    }

 

  解决2可行的原因分析:

    1. 没有违背类的定义标准,动物都有叫的行为。
    2. 因为父类没写具体的实现,所以子类有更多的可变性。

  例如:

    class Dog extends Animal {

      void shout() {

      System.out.println("旺旺");

      }

    }

2. 使用abstract

 

  1)定义:

    当描述一个类的时候,如果不能确定功能函数如何定义,那么该类就可以定义为抽象类,功能函数应该描述为抽象函数。

 

  2)语法:

    abstract public void shout();

 

3. 定义抽象方法时注意事项:

 

  1)抽象类中不一定要有抽象函数,但有抽象方法的类,一定时抽象类。

 

  2)抽象类不能使用new创建对象

 

    原因:创建对象是因为我们要调用类里面的方法,但是抽象方法没有具体的实现,不能调用。

 

  3)如果子类继承的父类是抽象类,那么子类要实现父类的全部抽象方法

 

    注意:可以不实现,前提是子类的也要声明为抽象的。

    

  4)final与abstract不能共存:

 

    final:它的作用  修饰类代表不可以继承  修饰方法不可重写

    abstract修饰类就是用来被继承的,修饰方法就是用来被重写的。

 

  5)static 修饰的方法可以用类名调用,

 

    对于abstract修饰的方法没有具体的方法实现,所有不能直接调用,也就是说不可以与static共存。

 

  6)private

    private修饰的只能在本类中使用,

    abstract方法是用来被子类进行重写的,有矛盾所有不能共存.

 

  7)抽象方法一定有构造方法

 

    因为要初始化成员变量

4.抽象方法优点

  1)提高代码复用性

  2)强制子类实现父类中没有实现的功能

  3)提高代码的扩展性,便于后期的代码维护

原文地址:https://www.cnblogs.com/zjdbk/p/8877743.html