抽象类和方法,为什么?

时间:2015-06-04 15:51:42

标签: java class methods override abstract

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

我遇到过关于抽象类和方法的章节,但是并没有真正完全理解它们的用途和原因,并且认为我会从经验丰富的程序员那里得到解释。

下面我有一些我一直在研究的示例代码,在本书的帮助下,我不确定为什么在Dims类中我必须使用抽象双区域()当每个子类使用一个区域时无论如何,或者是从超类调用area方法,为什么你必须有覆盖的方法?

    // 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());}

}

为胡言乱语道歉,但我真的需要一些指导。

提前致谢。

4 个答案:

答案 0 :(得分:2)

我们这样做是为了说“此类有一个完整的(ish) API ,但它没有完整的实现。”除此之外,它意味着你可以这样做:

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(我们最终会调用{ {1}})因为它是在Triangle#area API(有时称为“合同”)中定义的。只是Dims实现推迟到子类。这就是为什么你不能创建抽象类的实例。 Dims方法不知道它的内容是doSomething还是Triangle,只是它是某些Rectangle

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

Java中的接口和抽象类之间存在很多交叉。从根本上说,您可以将抽象类视为具有部分实现的接口(需要注意的是,类可以实现多个接口,但只能从单个抽象类派生)。由于接口可以定义方法的“默认”实现,因此该行甚至变得更加模糊。 (有些人认为,现在接口可以有默认方法,它们是“新”抽象类,并使真正的抽象类作为语言特征过时,但there are still arguments,主要是语法,有时使用抽象类。)< / p>

答案 1 :(得分:1)

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

Dims中声明方法abstract会强制形状覆盖它,否则它们将成为抽象对象。这样,我们确信在任何.area上调用Dims都会导致正确的计算。

答案 2 :(得分:0)

Abstract类强制您显示它作为抽象方法的行为。因此,您必须覆盖子类中的抽象方法。

它作为一个界面。你必须要实施。

这里你不能从你的Rectangles类中删除区域方法

答案 3 :(得分:0)

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

抽象类是一个声明为abstract的类 - 它可能包含也可能不包含抽象方法。抽象类不能被实例化,但它们可以被子类化。

当抽象类被子类化时,子类通常为其父类中的所有抽象方法提供实现。但是,如果没有,那么子类也必须声明为abstract。

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