Java接口方法通过对象调用

时间:2013-09-13 12:16:22

标签: java oop interface call implementation

我的主要方法如下:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package excercise.pkg5;

/**
 *
 * @author Azraar
 */

    public class TestResizable {

    public static void main(String[] args) {

        Shape obj[] = new Shape[4];
        obj[0] = new Circle(10);
        obj[1] = new Rectangle(10, 20);
        obj[2] = new ResizableCircle(10);
        obj[3] = new ResizableRectangle(10, 20);

        for (int i = 0; i < obj.length; i++) {

            if (obj[i] instanceof ResizableCircle) {
                ResizableCircle r = (ResizableCircle) obj[i];
                obj[i].equals(r);

            }

            if (obj[i] instanceof ResizableRectangle) {
                ResizableRectangle r = (ResizableRectangle) obj[i];
                obj[i].equals(r);

            }

            System.out.println("");
            System.out.print("Object is - " + obj[i].name());
            System.out.print("\nObject Area is - " + obj[i].area());
            System.out.print("\nObject Perimeter is - " + obj[i].perimeter());
        }

    }
}

我正在使用ResizableRectangle r = (ResizableRectangle) obj[i];,因为resizable是一个工具,ResizableRectangle和ResizableCircle正在扩展它并覆盖方法调整大小。

如果是instanceof resizbleRectange或resizableCircle ..我需要运行这个resize()方法..

obj[i].resize(0.5)然后它将循环并打印。但问题是我没有得到调整大小的方法真正的知识产权,当我输入它说无法找到sympbol ...

下面的

是类层次结构......

enter image description here

修改

shape是ROOT CLASS,如附图所示。当对象是ResizeableClass和ResizeableRectangle的实例时,我正在考虑一种访问resize方法的方法。但仍然无法。

4 个答案:

答案 0 :(得分:2)

您需要在resize()引用上致电Resizeable

也就是说,如果obj[i]Resizeable,那么您需要进行投射然后再调用它。仅仅断言obj[i]引用这样的对象是不够的,因为编译器只是将它视为基类引用。

e.g。

if (obj[i] instanceof Resizeable) {
   ((Resizeable)obj[i]).resize(..);
}

答案 1 :(得分:1)

您将obj声明为

Shape obj[]

所以obj[i]将返回Shape对象,我猜测该对象不会延伸Resizeable

答案 2 :(得分:1)

并非Shape方法的所有子类都实现Resizable接口。所以你需要检查obj[i]是否是Resizeable类的实例,然后调用它上面的resize。

答案 3 :(得分:0)

这终于奏效了......

    if (obj[i] instanceof ResizableCircle) {
        Resizable c = (ResizableCircle) obj[i];
        c.resize(5);

    }

    if (obj[i] instanceof ResizableRectangle) {
        Resizable r = (ResizableRectangle) obj[i];
        r.resize(10);

    }