Java复习笔记(十二)抽象类

抽象类

一、为什么使用抽象类

人类的认知的过程实际就是从具体到抽象的过程。人们为了方便的批处理对象而从众多的对象中抽象出类这一概念,为了更好的管理类,所以需要在类的概念上再次抽象。例如:学生类,医生类,教师类,律师类之间仍有许多共同的属性(如:名字,身份证号,性别等)和共同的方法(如:吃饭,睡觉,移动等),所以便可用将这些属性抽象出来使用一个总的抽象的类(人类)来表示。

二、什么时候使用抽象类

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

三、抽象类的实现方式

1.使用abstract对类进行修饰;
2.定义的无法确定方法体的方法,不写方法体;
3.使用abstract对无方法体的方法进行修饰;

四、抽象类的特点

1:有抽象函数的类,该类一定是抽象类。
2:抽象类中不一定要有抽象函数。
3:抽象类不能使用new创建对象
4:抽象类主要为了提高代码的复用性,让子类继承来使用。
5:编译器强制子类实现抽象类父类的未实现的方法。(若不实现,则子类的也要声明为抽象的。)

五、抽象的优点

1:提高代码复用性(强制子类实现父类中没有实现的功能)
2:提高代码的扩展性,便于后期的代码维护

六、注意

1.抽象类不能直接使用类名创建实例,但是有构造方法,构造方法是让子类进行初始化。
2.final和abstract一定不能同时修饰一个类。
3.抽象类可以没有抽象方法(java.awt.*的类就是这样子操作的)。
4.抽象类可以继承普通类与抽象类。

七、abstract与其他修饰符的关系:

1.final与abstract不能共存:
  final:它的作用 修饰类代表不可以继承 修饰方法不可重写,
  abstract修饰类就是用来被继承的,修饰方法就是用来被重写的。
2.static与abstract不能共存:
  static修饰的方法可以用类名调用,
  abstract修饰的方法没有具体的方法实现,所有不能直接调用,
  所以abstract不可以与static共存。
2.private与abstract不能共存:
  private修饰的只能在本类中使用,
  abstract方法是用来被子类进行重写的,有矛盾,
  所以不能共存。

/*练习: 描述一个图形、圆形、 矩形三个类。不管哪种图形都会具备计算面积
与周长的行为,但是每种图形计算的方式不一致。*/

abstract class MyShape{
    String name;

    public MyShape(String name){
        this.name = name;
    }

    public abstract void getArea();

    public abstract void getLength();
}

class Circle extends MyShape{
    double r;
    public static final double pi =3.14;

    public Circle(String name,double r){
        super(name);
        this.r = r;
    }
    @Override
    public void getArea() {
        System.out.println(name+"的面积是:"+r*r*pi);
    }

    @Override
    public void getLength() {
        System.out.println(name+"的周长是:"+2*r*pi);
    }
}

class Rect extends MyShape{

    int width;

    int height;

    public Rect(String name,int width, int height){
        super(name);
        this.width = width;
        this.height = height;
    }

    public  void getArea(){
        System.out.println(name+"的面积是:"+width*height);
    }

    public  void getLength(){
        System.out.println(name+"的周长是:"+2*(width+height));
    }
}

class Main
{
    public static void main(String[] args)
    {
        Circle c = new Circle("圆形",4.0);
        c.getArea();
        c.getLength();

        //矩形
        Rect r = new Rect("矩形",3,4);
        r.getArea();
        r.getLength();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_29615991/article/details/80229033