0

我刚刚开始使用 Java,并且正在通过以下网址在线查看示例: http: //docs.oracle.com/javase/tutorial/java/IandI/usinginterface.html

然后我开始实现一个接口,虽然我理解它背后的概念,但这对我来说似乎很奇怪,因为在接口声明中你只定义了它,而在实现这个接口的类中你仍然需要编写它的函数. 那么为什么要使用它呢?

我尝试了示例代码,然后更改代码以删除接口,它们的工作方式相同。所以我的问题是什么时候使用实现接口?这对我来说似乎没有必要。提前致谢!

在线示例代码:

public class RectanglePlus 
    implements Relatable {
    public int width = 0;
public int height = 0;
public Point origin;

// four constructors
public RectanglePlus() {
    origin = new Point(0, 0);
}
public RectanglePlus(Point p) {
    origin = p;
}
public RectanglePlus(int w, int h) {
    origin = new Point(0, 0);
    width = w;
    height = h;
}
public RectanglePlus(Point p, int w, int h) {
    origin = p;
    width = w;
    height = h;
}

// a method for moving the rectangle
public void move(int x, int y) {
    origin.x = x;
    origin.y = y;
}

// a method for computing
// the area of the rectangle
public int getArea() {
    return width * height;
}

// a method required to implement
// the Relatable interface
public int isLargerThan(Relatable other) {
    RectanglePlus otherRect 
        = (RectanglePlus)other;
    if (this.getArea() < otherRect.getArea())
        return -1;
    else if (this.getArea() > otherRect.getArea())
        return 1;
    else
        return 0;               
}
}

我改成的代码,去掉界面,还是一样

public class RectanglePlus {
public int width = 0;
public int height = 0;
public Point origin;

// four constructors
public RectanglePlus() {
    origin = new Point(0, 0);
}
public RectanglePlus(Point p) {
    origin = p;
}
public RectanglePlus(int w, int h) {
    origin = new Point(0, 0);
    width = w;
    height = h;
}
public RectanglePlus(Point p, int w, int h) {
    origin = p;
    width = w;
    height = h;
}

// a method for moving the rectangle
public void move(int x, int y) {
    origin.x = x;
    origin.y = y;
}

// a method for computing
// the area of the rectangle
public int getArea() {
    return width * height;
}

// a method required to implement
// the Relatable interface
public int isLargerThan(RectanglePlus otherRect) {

    if (this.getArea() < otherRect.getArea())
        return -1;
    else if (this.getArea() > otherRect.getArea())
        return 1;
    else
        return 0;               
}

public static void main( String[] args )
{

    RectanglePlus newRect = new RectanglePlus(20, 30);
    RectanglePlus somerect = new RectanglePlus(50, 100);

    System.out.println("Area of newRect is " + newRect.getArea());

    System.out.println("Area of somerect is " + somerect.getArea());

    if((newRect.isLargerThan(somerect))==1)
    {
        System.out.println("newRect is bigger");
    }
    else
    {
        System.out.println("somerect is bigger");
    }

}

}
4

3 回答 3

2

两个原因:

  1. 如果您将有多个接口实现。假设你有Shape,子类型是Rectangle,Oval等等。如果你想编写可以对形状做一些事情的代码,你需要一个所有子类型都实现的接口——接口是你知道任何人Shape都会有的一组方法。

  2. 如果您正在编写 API - 您正在编写其他人将使用的库。你为其他人提供接口——这是他们可以调用的东西。您将实现接口,并且实现类可能有更多方法 - 您希望以后能够更改这些方法,但您的用户应该能够选择新版本的库并将其与旧代码一起使用. 通过将接口与实现分离,您可以为公众提供他们可以使用的东西,但为自己保留一些您可以更改而不会伤害现有用户的东西。

于 2013-10-14T07:07:35.663 回答
0

如果您实现Relatable它,您可以在一对对象中找到最大的对象,对于从实现 Relatable 的类实例化的任何对象。否则,您只能在从同一类实例化的一对对象中找到最大的对象。

于 2013-10-14T06:58:21.397 回答
0

这是为了便于类型/接口重用。您可以在需要父类型对象的地方传递子类型的对象。您可以参考http://www.oodesign.com/liskov-s-substitution-principle.html

这基本上允许您以抽象的方式进行处理。您的程序可以处理不同类的对象,只要它们实现某些行为(或实现接口或从类扩展)

于 2013-10-14T06:52:00.523 回答