簡體   English   中英

對象的區域 - 抽象類 - Java

[英]Area of an object- Abstract Class - Java

我正在使用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());
  }
}

它也提供了與第一個程序相同的輸出。

任何人都可以解釋使用抽象類引用調用“區域方法”的需要。

它只是作為一個演示 ,即使您將變量聲明為抽象類型,您也可以為其分配一個具體子類的實例,並從子類中獲取重寫行為。

實際使用示例是,如果您需要它們的集合

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

在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實現。

嘿,你在這里使用UPCAST​​ING的概念,也稱為子對象的父引用 您編寫的上述代碼程序正在執行UPCAST​​ING 讓我們來看看什么是UPCAST​​ING

向上轉換是一種使用父類引用來引用子類對象的機制

每當使用Upcasting時,您只能訪問父類成員 (包括變量和方法)和父類重寫方法

在您的示例中,方法area()已在子類RectangleTriangle中被覆蓋,因此可以使用父引用figref訪問它們。

UPCAST​​ING的一個優點是我們可以實現動態方法調度動態多態 ,這在編寫具有復雜類層次結構的復雜應用程序時非常必要。

因為你提到你正在使用完整參考檢查方法覆蓋之后的動態方法調度部分。

希望這個答案有助於:)

是的,你可以得到相同的答案但是總是首選使用抽象類或接口來調用任何api。 area()是一個在Rectangle或Triangle中重寫的api。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM