抽象class和方法,为什么?

Abstract class and methods, Why?

希望任何人都可以提供帮助,我正在学习 Java 并且与这个论坛中的其他人相比,我想我也是编程的新手。

我看过关于抽象 class 和方法的一章,但并不真正完全理解它们的用途和原因,我想我会从经验丰富的程序员那里得到解释。

下面是我一直在使用的示例代码,在本书的帮助下,我不确定的是为什么在 class Dims 中我必须有 abstract double area() 时每个子 class 无论如何都使用一个区域方法,或者它是从超级 class 调用区域方法,为什么你必须有覆盖的方法?

    // Using abstract methods and classes
    package Training2;

    abstract class Dims {
    double dim1;
    double dim2;

    Dims(double a, double b) {
        dim1 = a;
        dim2 = b;
    }
    // area is now an abstract method
    abstract double area();
}
class Rectangles extends Dims {
    Rectangles(double a, double b) {
        super(a, b);
    }

    // Override area for Rectangles
    double area() {
        System.out.println("Inside Area for Rectangle.");
        return dim1 * dim2;
    }
} 
class Triangles extends Dims {
    Triangles(double a, double b) {
        super(a, b);
    }

    // Override area for right Triangles
    double area() {
        System.out.println("Inside Area for Triangle.");
        return dim1 * dim2 /2;
    }
}
public class AbstractAreas {
    public static void main(String args[]) {
        // Dims d = new Dims(10, 10); // Illegal now
        Rectangles r = new Rectangles(9, 5);
        Triangles t = new Triangles(10, 8);
        Dims dimref; // This is OK, no object is created

        dimref = r;
        System.out.println("Area is " + dimref.area());

        dimref = t;
        System.out.println("Area is " + dimref.area());}

}

抱歉胡扯,但我真的需要一些指导。

提前致谢。

我们这样做是为了说 "This class has a complete (ish) API, but it does not have a complete implementation." 除其他外,这意味着您可以这样做:

public void doSomething(Dims d) {
    System.out.println("The area is " + d.area());
}

// ...using it somewhere:

doSomething(new Triangle(4.0, 6.0));

doSomething 中,即使我们对对象的引用是 Dims,而不是 Triangle,我们也可以调用 area(我们最终调用 Triangle#area) 因为它是在 Dims API 中定义的(有时称为 "contract")。只是 Dims 实现 推迟到 subclasses。这就是为什么你不能创建抽象 classes 的实例。 doSomething 方法并不知道它给出的是 Triangle 还是 Rectangle,只是它是 一些 类型的 Dims.

而如果 Dims 没有定义 areadoSomething 将不会编译。我们必须声明一个 doSomething 接受 Triangle 和另一个接受 Rectangle 等等。我们无法获得能够在公共代码中对所有 Dims 事物进行操作的好处。

在 Java 中接口和抽象 classes 之间有很多交叉。从根本上说,您可以将抽象 class 视为具有部分实现的接口(需要注意的是 class 可以实现多个接口,但只能从单个抽象 class).现在接口可以定义 "default" 方法的实现,这条线变得更加模糊。 (有些人认为现在接口可以有默认方法,它们是 "new" 抽象 classes 并使真正的抽象 classes 作为语言特性过时,但是 there are still arguments ,主要是句法,有时围绕使用抽象 classes。)

每个形状的展开Dims需要不同的算法来计算面积,矩形的面积与三角形的面积不同。因此,我们在 Dims 中声明方法抽象,以强制每个形状实现自己的算法以正确计算面积。

Dims 中声明抽象方法强制形状覆盖它,否则它们本身将是抽象对象。这样我们就可以确保在任何 Dims 上调用 .area 都会得到正确的计算结果。

抽象class 强制您显示它作为抽象方法的行为。所以你必须在你的 subclasses 中覆盖抽象方法。

它作为一个界面。你必须执行。

在这里你不能从你的矩形中删除区域方法class

参考 Java™ 来自 Oracle 的教程;深入理解的好例子。

抽象 class 是声明为抽象的 class——它可能包含也可能不包含抽象方法。 Abstract classes不能被实例化,但是可以被subclassed.

当抽象 class 被子class 时,子class 通常为其父class 中的所有抽象方法提供实现。但是,如果不是,则 subclass 也必须声明为抽象的。

https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html