对象的区域 - 抽象类 - Java

时间:2014-01-10 06:06:34

标签: java abstract-class

我正在使用 Java:The Complete Reference 这本书学习Java。目前我正在研究抽象类的主题。

请注意:stackoverflow上有类似的问题。我搜查了他们,但我无法理解这个概念。

如果我运行以下程序,它会产生正确的输出,但我不明白这个概念。

  

这里对Abstract类的引用变量有什么需求。我可以在没有抽象类的引用变量的情况下获得输出。

首先,我运行了以下程序并获得了所需的输出。

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

它也提供了与第一个程序相同的输出。

任何人都可以解释使用抽象类引用调用“区域方法”的必要性。

4 个答案:

答案 0 :(得分: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));

答案 1 :(得分:1)

在Abstract类中,您可以定义抽象方法和非抽象方法。但是,Abstract类的第一个具体子类必须实现那些抽象方法。您不能创建抽象类的实例,并且必须将它们子类化为某个具体类。

另请注意,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(),它将根据实际实例类型调用TraingleRectangle的相应实现。

答案 2 :(得分:1)

嘿,你在这里使用的是 UPCAST​​ING 的概念,也称为对子对象的父引用。您编写的上述代码程序正在执行 UPCAST​​ING 。让我们看一下 UPCAST​​ING

向上转换是一种使用父类引用来引用子类对象的机制。

每当您使用Upcasting时,您都可以访问仅父类成员(包括变量和方法)和重写的父类方法。

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

UPCAST​​ING 的一个优势是我们可以实现动态方法调度动态多态,这在编写复杂应用程序时非常必要复杂的类层次结构。

因为你提到你正在使用完整参考检查方法覆盖之后的动态方法调度部分。

希望这个答案有助于:)

答案 3 :(得分:0)

是的,你可以得到相同的答案但是总是首选使用抽象类或接口来调用任何api。 area()是一个在Rectangle或Triangle中重写的api。