繁体   English   中英

抽象类和方法,为什么呢?

[英]Abstract class and methods, Why?

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

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

在本书的帮助下,我下面一直在研究示例代码,我不确定的是为什么在Dims类中,当每个子类仍然使用area方法时,我必须具有抽象double area(),还是从超类中调用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());}

}

抱歉,但我确实需要一些指导。

提前致谢。

我们这样说是:“此类具有完整的(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方法没有任何的想法是什么给予是否是TriangleRectangle ,只是它的某种 Dims

如果Dims没有定义area ,则doSomething不会编译。 我们必须声明一个doSomething接受一个Triangle ,另一个接受Rectangle ,依此类推。 我们无法获得能够在通用代码中对所有Dims进行操作的好处。

Java中的接口和抽象类之间有很多交叉。 从根本上讲,您可以将抽象类视为具有部分实现的接口(要注意的是,一个类可以实现多个接口,但只能从单个抽象类派生)。 现在,接口可以定义方法的“默认”实现,这条线变得更加模糊。 (现在有人争论说接口可以具有默认方法,它们是“新”抽象类,并且使真正的抽象类作为一种语言功能而过时了,但是仍然有一些参数 ,主要是句法,有时会使用抽象类。)

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

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

抽象类迫使您显示它具有的行为作为抽象方法。 因此,您必须在子类中覆盖抽象方法。

它用作接口。 而且您必须执行。

在这里,您不能从矩形类中删除Areas方法

请参阅Oracle的Java™教程。 深入了解的好例子。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM