2013-04-17 30 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

不用担心,我们都从某个地方开始 –