2013-04-17 31 views
0

我試着去理解這段代碼...瞭解Java代碼(抽象類,擴展功能)

這裏是原代碼:

public class understanding { 
    public static void main(String[] args) { 
     int n = 5; 
     Shape[] s = new Shape[n]; 
     for (int i = 0; i < n; i++) { 
      s[i] = getShape(i); 
      System.out.println(s[i]); 
     } 
     System.out.println(compute(s)); 
    } 

    public static Shape getShape(int i) { 
     if (i % 2 == 0) { 
      return new Circle(i); 
     } else { 
      return new Polygon(i, i); 
     } 
    } 

    public static double compute(Shape[] a) { 
     double nc = 0; 
     for (int i = 0; i < a.length; i++) { 
      nc += a[i].getMeasure(); 
      System.out.println(a[i].getMeasure()); 
     } 
     return nc; 
    } 
} 

public abstract class Shape { 
    protected abstract double getMeasure(); 
} 

public class Polygon extends Shape { 
    private double x; 
    private double y; 

    Polygon(double x_, double y_) { 
     x = x_; 
     y = y_; 
    } 

    public double getMeasure() { 
     return 2 * (x + y); 
    } 
} 

public class Circle extends Shape { 
    private double r; 

    Circle(double r_) { 
     r = r_; 
    } 

    public double getMeasure() { 
     return 2 * r; 
    } 
} 

是否有人可以幫助我瞭解這個代碼是如何返回28不過也解釋了我在哪裏卡住了一部分......

當幹運行,我深陷其中:

for(int i=0;i<n;i++){ // i=0, i<5, i++ 
    s[i] = getShape[i] // i=0, go to getShape class 
... 

getShape(i) //i=0 
if (i%2==0) //TRUE so.. 
    return new Circle(i); //bc the boolean is True, go to Circle() class 
... 

Circle extends Shape{ 
    private double r; 
    Circle(double r_){ //I get lost here.. is r=0 now (because r_=i and r=r_)? 
     r = r_; 
    } 
+1

我可以問,你有理解類繼承,多態性和相關或只是與此代碼?如果是第一種選擇,我建議你回顧一下這些話題,並從一些簡單的事情開始,然後一步一步來。如果是第二種選擇,請**調試**代碼或使用另一個系統查看逐行發生的事情。 –

回答

2

main循環依次產生:Circle(0),Polygon(1,1), Circle(2), Polygon(3,3),Circle(4);這是因爲i % 2對偶數爲0,奇數爲1。對於多邊形,measure返回2 *(x + y),所以對於(1,1)您有2 *(1 + 1)= 4,對於(3,3)您有2 *(3 + 3)= 12 (2)你有2 * 2 = 4,對於(4)你有2 * 4 = 8 + 4 + 4 + 12 + 8 = 28.

對於您迷失的地方,getShape(i)i的值傳遞給getShape;當i = 0時,這將創建一個圓,所以0傳遞給Circle構造函數,然後Circle(0)r設置爲0.如果i = 2,則r = 2,依此類推。

+0

值得一提的是,每次調用new Circle(i)時,'new'關鍵字會創建一個不同的'Circle',因此您可以得到三個不同的'Circle'對象,每個對象都有自己的'r'變量。 –

+0

oohhh我現在完全明白了。非常感謝您的善意回應。我意識到這個問題現在聽起來有多愚蠢......這麼簡單...... – hhart

+1

不用擔心,我們都從某個地方開始 –