Java 中的抽象类

目录

1. 概念

2. 理解抽象类

3. 总结


1. 概念

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

抽象类使用 abstract 定义,并且抽象类是普通类的超集,除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。抽象类只是比普通类多了一些抽象方法而已。

2. 理解抽象类

class Shape {
    public void draw() {
    }
}

class Cycle extends Shape {
    @Override
    public void draw() {
        System.out.println("○");
    }
}

class Rect extends Shape {
    @Override
    public void draw() {
        System.out.println("□");
    }
}

class Flower extends Shape {
    @Override
    public void draw() {
        System.out.println("♣");
    }
}

public class Demo1 {
    public static void main(String[] args) {
        Shape s1 = new Cycle();
        Shape s2 = new Rect();
        Shape s3 = new Flower();
        drawShape(s1);
        drawShape(s2);
        drawShape(s3);
        drawShapes();
        drawShapes2();
    }

    private static void drawShape(Shape shape) {
        shape.draw();
    }
}

在上面代码中可以发现父类 Shape 类中的 draw 方法并没有实际的内容,绘制图形都是由 Shape 的各种子类的 draw 方法来完成的,像这种没有足够信息来描绘一个具体的对象的方法就可以设计成一个抽象方法,包含抽象方法的类我们就可以称为抽象类。

abstract class Shape {
    abstract public void draw();
}

注意:在 draw 方法前加上 abstract 关键字,表示这是一个抽象方法,抽象方法没有方法体{},只有方法的声明,不能执行代码。

抽象类代码:


/**
 * 抽象类
 */
abstract class Shape2 {
    abstract public void draw();
}

class Cycle2 extends Shape2 {
    @Override
    public void draw() {
        System.out.println("○");
    }
}

 class Rect2 extends Shape2 {
    @Override
    public void draw() {
        System.out.println("□");
    }
}

 public class Demo1 {
    public static void main(String[] args) {
        Shape2 shape2 = new Cycle2();
        Shape2 shape21 = new Rect2();
        shape21.draw();
        shape2.draw();
    }
}

示例中: Shape2 为抽象类,draw 为抽象方法,Cycle2 和 Rect2 类都继承自 Shape2 父类,并且都覆写了 Shape2 中的抽象方法。

3. 总结

1. 抽象类不能被实例化,抽象类无法直接实例化对象,也就是无法直接 new 一个抽象。所以抽象类必须被继承才能被使用。

2. 抽象类中父类包含了子类集合常见的方法,但是由于父类本身是抽象的,所以父类不能使用这些方法。

3. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

4. 抽象类必须有子类,并且子类必须覆写抽象类中所有的抽象方法,或者声明自身为抽象类,否则从最初的子类到最终的子类都不能用类实例化对象。

5. 抽象类中的抽象方法只是声明,不包含方法体。

6. 抽象类有构造方法,因为虽然抽象类无法直接实例化,但是抽象类是普通类的超集(普通类有的,抽象类都有),而且抽象类中依然遵循对象实例化流程,产生子类时,先调用抽象类的构造方法。

7. abstract 关键字和 final 关键字不能同时出现,也不能和 private 关键子同时出现。

8. 在 Java 中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类可以实现多个接口。

猜你喜欢

转载自blog.csdn.net/AlinaQ05/article/details/125703545