物体的面积-抽象类-Java

4
我正在使用《Java: The Complete Reference》这本书学习Java。目前,我正在学习抽象类的主题。
请注意:stackoverflow上有类似的问题。我搜索了它们,但是我无法理解这个概念。
如果我运行下面的程序,它会产生正确的输出,但我不理解这个概念。
以下程序可以获得所需的输出,那么在这里抽象类的引用变量的需要是什么?在没有抽象类的引用变量的情况下,我也可以得到输出。
首先,我运行了下面的程序并获得了所需的输出。
abstract class Figure {
  double dim1;
  double dim2; 

  Figure(double a, double b) {
    dim1 = a;
    dim2 = b;
  }

  // area is now an an abstract method 
  abstract double area();
}

class Rectangle extends Figure {
  Rectangle(double a, double b) {
    super(a, b);
  }

  // override area for rectangle
  double area() {
    System.out.println("Inside Area for Rectangle.");
    return dim1 * dim2;
  }
}

class Triangle extends Figure {
  Triangle(double a, double b) {
    super(a, b);
  }

  // override area for right triangle
  double area() {
    System.out.println("Inside Area for Triangle.");
    return dim1 * dim2 / 2;
  }
}

class AbstractAreas {
  public static void main(String args[]) {

    Rectangle r = new Rectangle(9, 5);
    Triangle t = new Triangle(10, 8);

    Figure figref; 

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

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

我尝试了以下代码,没有创建/使用抽象类引用。

class AbstractAreas {
  public static void main(String args[]) {

    Rectangle r = new Rectangle(9, 5);
    Triangle t = new Triangle(10, 8);

    // Figure figref; 

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

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

它也产生了与第一个程序相同的输出。
有人能解释一下使用抽象类引用调用“area方法”的必要性吗?

正如您所验证的那样,没有必要使用抽象类引用来获得预期结果,但这样做只是为了证明在两种情况下都可以获得相同的结果。 - wxyz
1
基本上,它是“运行时多态性”的概念。 - Saurabh Sharma
4个回答

6

这只是一个简单的示例,即使您将变量声明为抽象类型,也可以将具体子类的实例分配给它,并从子类中获得已覆盖的行为。

实际应用示例是如果您需要一个集合:

List<Figure> figureList = new ArrayList<Figure>();
figureList.add(new Rectangle(9, 5));
figureList.add(new Triangle(10, 8));

for (Figure f : figureList) {
    System.out.println(f.area());
}

如果您想将Figure的任何子类传递给使用area()的方法:

public void printArea(Figure f) {
    System.out.println("Area is: " + f.area());
}
...
myObject.printArea(new Rectangle(9, 5));
myObject.printArea(new Triangle(10, 8));

2
使用area()Figure执行某些操作的方法 - user180100

1
在抽象类中,您可以定义抽象方法和非抽象方法。但是,抽象类的第一个具体子类必须实现这些抽象方法。您不能创建抽象类的实例,它们必须被子类化为某个具体类。
另请注意,JLS指出,如果抽象类具有所有抽象方法,则最好使用接口。
Can anyone please explain what is the need of calling "area method" using
abstract class reference.

概念与继承相同。我们使用抽象类来避免重复。

What is the need of reference variable of an Abstract class here. I can get the
output without the reference variable of an abstract class.

抽象类被用作引用类型,因为你可以在这里利用多态性。如果你在运行时调用参考变量上的area(),它将根据实际实例类型调用相应的Triangle或Rectangle实现。

1

嘿,你在使用UPCASTING的概念,也称为父引用子对象。而你编写的上述代码程序正在执行UPCASTING。让我们看看什么是UPCASTING

Upcasting是一种使用父类引用来引用子类对象的机制。

每当您使用Upcasting时,您只能访问父类成员(变量和方法)以及父类的重写方法

在您的示例中,方法area()已在子类RectangleTriangle中被覆盖,因此可以使用父引用figref访问它们。

UPCASTING的优点之一是我们可以实现动态方法分派动态多态性,这在编写具有复杂类层次结构的复杂应用程序中非常必要。

既然你提到了使用完整参考,请查看方法覆盖后的动态方法分派部分。

希望这个答案有所帮助 :)


获取更多信息,请谷歌Java中的向上转型。 - iamyogish

0

是的,你可以得到相同的答案。但是最好使用抽象类或接口来调用任何API。 area()是一个在矩形或三角形中被重写的API。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接