【问题标题】:How to create an instance that belongs to an interface and implement it如何创建属于接口的实例并实现它
【发布时间】:2016-04-17 05:11:10
【问题描述】:

我目前正在学习 Java,所以请原谅我的无知。这是我当前的代码

Shape.java

public interface Shape {
    public abstract void draw();
}

Rectangle.java

public abstract class Rectangle implements Shape {

    private final double width, length;

    public Rectangle() {
        this(1,1);
    }
    public Rectangle(double width, double length) {
        this.width = width;
        this.length = length;
    }

    public void draw() {
        System.out.println("A rectangle of sides " +  length + " by " + width + " will be drawn");
    }

}

TestPolymorph.java

public class TestPolymorph implements Shape {

    public static void main(String[] args) {
        Shape[] drawObject = { new Rectangle(40, 60) };
        drawObject[0].draw();
    }

    @Override
    public void draw() {
        // TODO Auto-generated method stub

    }

}

我当前的代码有什么问题吗,因为它不起作用。我的问题是如何创建一个属于Shape 类的drawObject 实例,并且在运行时drawObject 将使用两个参数创建,长度和宽度(例如给出40 和60),Rectangle 的绘制方法然后将被调用。

【问题讨论】:

  • 你能详细说明“不工作”吗?给出例外还是不打印你所期望的?

标签: java inheritance polymorphism


【解决方案1】:

你已经接近了,真的没有任何必要让你的 TestPolymorph 实现 Shape。那是您的驱动程序,而不是实现接口的模型,因此您可以取消它。

最后,从 Rectangle 类中删除抽象。这不是一个抽象类,因为您实际上想要一个该类型的实例。

【讨论】:

    【解决方案2】:

    尝试从Rectangle 对象中删除abstract 修饰符。你也不需要在TestPolymorph.java中实现Shape接口

    【讨论】:

    • @Vui La Chinh 是的,abstract 修饰符似乎有问题。你不能在抽象类中实例化 obj。如果你想创建 abj,你必须使用匿名类实现。
    【解决方案3】:
    Shape[] drawObject = { new Rectangle(40, 60) };
    

    上面是你的代码

    Shape[] drawObject = { new Rectangle(40, 60) {} };
    

    这是正确的代码

    因为您正在创建 objects of abstract 类,所以您必须使用这个 方法。或者你可以从Rectangle classremove abstract modifier

    如果你正在创建一个抽象类的对象,你必须实现它的所有抽象方法,因为你的抽象矩形类中没有任何抽象方法,你只需要new Rectangle(40, 60) {} 如果您的类在括号内有抽象方法,则在末尾传递空括号,您必须实现抽象方法

    【讨论】:

    • 或者由于 Rectangle 似乎没有理由是抽象的,也许更好的解决方案是将其具体化。匿名内部类似乎不太可能是这个初学者准备或目前感兴趣的主题。
    【解决方案4】:
    1. 改进界面

    接口主体中的每个方法声明都是隐式公共和抽象的。

    参考:http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.4

    【讨论】:

      【解决方案5】:

      让它变得简单。而不是把事情复杂化。 只需以有效的继承方式进行即可。 从 Rectangle 类中删除抽象,也不需要 TestPolymorph 来实现 Shape 接口。 Rectangle 实现了 Shape 接口,只是在 TestPolymorph 中测试多态性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-30
        • 1970-01-01
        • 2018-04-25
        相关资源
        最近更新 更多