【问题标题】:Abstract class and methods, Why?抽象类和方法,为什么?
【发布时间】:2015-06-04 15:51:42
【问题描述】:

希望任何人都可以提供帮助,我正在学习 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());}

}

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

提前致谢。

【问题讨论】:

标签: java class methods overriding abstract


【解决方案1】:

我们这样做是为了说“这个类有一个完整的(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(我们最终调用Triangle#area),因为它是在Dims API(有时称为“合同”)。只是Dims实现 推迟到子类。这就是为什么你不能创建抽象类的实例。 doSomething 方法不知道给出的是Triangle 还是Rectangle,只是它某种类似于Dims

如果Dims 没有定义areadoSomething 将无法编译。我们必须声明一个doSomething 接受Triangle 和另一个接受Rectangle 等等。我们无法使用通用代码对所有 Dims 事物进行操作。

Java 中的接口和抽象类之间有很多交叉。从根本上讲,您可以将抽象类视为具有部分实现的接口(需要注意的是,一个类可以实现多个接口,但只能从一个抽象类派生)。由于接口可以定义方法的“默认”实现,这条线变得更加模糊。 (有些人认为,现在接口可以有默认方法,它们是“新的”抽象类,使真正的抽象类作为一种语言特性已经过时,但there are still arguments,主要是语法,有时会使用抽象类。)

【讨论】:

  • 我要补充一点,如果没有在基类上声明 area 方法,那么在不知道它是三角形还是任何其他形状的情况下将无法调用它。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    抽象类强制你展示它作为抽象方法的行为。所以你必须在你的子类中重写抽象方法。

    它作为一个接口工作。你必须执行。

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-11-29
        • 1970-01-01
        • 1970-01-01
        • 2021-08-07
        • 1970-01-01
        • 2021-04-14
        • 2017-09-26
        • 1970-01-01
        • 2015-10-26
        相关资源
        最近更新 更多