如何以及何时使用抽象类

2022-09-01 05:22:06

这是我在Java中的测试程序。我想知道有多少抽象类在这里更重要,以及为什么我们使用抽象类。

这是强制性的还是最好的方法;如果是这样,如何?

class Shape1 {
    int i = 1;
    void draw() {
        System.out.println("this is shape:" + i);
    }
}

class Shape2 {
    int i = 4;
    void draw() {
        System.out.println("this is shape2:" + i);
    }
}


class Shape {
    public static void main(String args[]) {
        Shape1 s1 = new Shape1();
        s1.draw();

        Shape2 s2 = new Shape2();
        s2.draw();
    }
}

答案 1

您可以在此处使用抽象类或接口,以便创建提供该方法的公共基类/接口,例如void draw()

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

class Circle extends Shape {
   void draw() { ... }
}

...

Shape s = new Circle();
s.draw();

我通常使用接口。但是,在以下情况下,您可以使用抽象类:

  1. 您需要/希望提供通用功能或类成员(例如,您案例中的成员)。int i
  2. 您的抽象方法除了公共访问(这是接口允许的唯一访问类型)之外,还有其他任何东西,例如,在我的示例中,将具有包可见性。void draw()

答案 2

抽象类是一个类,它至少有一个未实现的方法,或者关键字 abstract。例如,抽象方法可能如下所示:

public abstract String myMethod(String input);

(请注意,该方法以分号结尾)。

一个类可能看起来像这样:

public abstract class MyClass {

    public abstract String myMethod(String input);

    public String anotherMethod(String input) {
        return intput + " additional text";
    }
}

抽象类不能实例化。抽象类需要一个子类来实现缺失的行为,以便可以对其进行实例化。

抽象类的主要目标是提供公共行为的共享实现 - 促进代码的重用。

在Java中,通过使用类的组合而不是从广泛定义的抽象类继承,可以实现相同的效果。这允许更多模块化的,特定于函数的类来促进代码重用,从而提高可维护性。

我的建议是只在绝对必要时才使用抽象类,特别是避免将其用作充满各种功能的技巧包。

在Scala中,人们会使用特征,这是解决这个问题的优雅方法。但是,它确实需要很多关注才能正确完成。

编辑:从Java 8开始,接口中的默认方法是添加常见行为的另一种方法。