5
interface Shape {
    public double area();  
}

class Circle implements Shape {
      private double radius;

      public Circle(double r){radius = r;}

      public double area(){return Math.PI*radius*radius;}
}

class Square implements Shape {
      private int wid;

      public Square(int w){wid = w;}

      public double area(){return wid *wid;}
}

public class Poly{
     public static void main(String args[]){
               Shape[] s = new Shape[2];
               s[0] = new Circle(10);
               s[1] = new Square(10);

               System.out.println(s[0].getClass().getName());
               System.out.println(s[1].getClass().getName());
      }
}

为了理解多态性的概念,我找到了以下帖子 ( https://stackoverflow.com/a/4605772/112500 ),但我注意到 Charlie 使用未实现的方法创建了 Shape 类。

从我的代码中可以看出,我将该类转换为一个接口,然后用它实例化一个匿名类,然后调用适当的方法。

有人可以告诉我我的解决方案是否合理吗?你会以不同的方式编写代码吗?为什么在等号两边使用一个接口会起到这样的作用?

谢谢。

凯特琳

4

3 回答 3

5

Java 中的匿名类是没有给定名称的类,它在单个语句中声明和实例化。每当您需要创建一个只实例化一次的类时,您应该考虑使用匿名类。

匿名类必须始终实现接口或扩展抽象类。但是,您不要使用 extends 或 implements 关键字来创建匿名类。相反,您使用以下语法来声明和实例化匿名类:

new interface-or-class-name() { class-body } 

一个例子是:

Shape s = new Shape() // no square brackets here
{
    public double area()
    {
        return 10.0;
    }
};

在您发布的代码中,您没有创建任何匿名类。

阅读Oracle 教程,了解更多信息。


当你这样做时:

Shape[] s = new Shape[2] // notice the square brackets : "[2]"

您实际上是在创建一个数组,该数组可以引用对象Shape及其子类型。所以,这个数组可以包含对任何实现类的对象的引用Shape

s[0] = new Circle();
s[1] = new Square();
于 2013-07-18T09:21:57.450 回答
4

这对我来说看起来不错 - 尽管您没有在任何地方使用匿名类,但它确实显示了基本多态性是如何工作的。

一般来说,在代码中

Shape s1 = new Circle(2);
Shape s2 = new Square(2);

上面的两条线都有效,因为CircleSquare实现了 Shape,这实际上是在说“圆形是一个形状”和“方形是一个形状”。通过将 's1' 声明为类型Shape,您是在说它可以引用任何 is-a Shape,即。任何实现Shape。请注意,您只能通过和调用Shape接口中定义的方法。假设 Circle 有一个方法:s1s2diameter

Shape s1 = new Circle(2);
s1.diameter();

将失败,因为接口diameter上不存在Shape:声明变量的类型定义了可以看到的方法,而不是变量引用的实例的实际类。但是被调用的实现是所引用实例的实际类决定的——这是多态的核心。

于 2013-07-18T09:22:01.817 回答
4

您的方法很好 - 始终建议对接口(形状)而不是具体实现(圆形)进行编程。多态性意味着形状的每个具体实现都可以作为一个形状发生。

例如(更像是伪 java)

Circle c = new Circle(10); // not polymorph, as c = new Square(10) will throw an error

Shape s = new Circle(10);
... some other code
s = new Square(10) // totaly fine

您可以通过使用工厂来创建您的形状来改进您的代码,例如

    public class ShapeFactory {
    public Shape createCircle(int param) { 
return new Circle(param);
}

public Shape createRectangle(int param, int param2) {
return new Rectangle(param, param2) };

and so on

http://en.wikipedia.org/wiki/Factory_method_pattern

总结一下:你走对了!

于 2013-07-18T09:20:41.297 回答