接口如何在此代码中工作?

时间:2014-06-23 18:13:04

标签: java interface

我试图了解接口的工作原理。我已经在线阅读了基本界面教程并观看了一些视频,因此我对界面是什么及其优点有了一个很好的了解。但是,我遇到了这段代码,它正在利用界面功能,而我却无法理解其中的一些内容。所以我需要有人来分解究竟发生了什么。到目前为止,我还会写下我对它的理解,所以如果我错了,你可以纠正我。

这是守则。

银行帐户类

package Interface;

public class BankAccount implements Measurable {
    private double balance;

    public BankAccount() {
        balance = 0;
    }

    public BankAccount(double initialBalance) {
        balance = initialBalance;
    }

    public void deposit(double amount) {
        double newBalance = balance + amount;
        balance = newBalance;
    }

    public void withdraw(double amount) {
        double newBalance = balance - amount;
        balance = newBalance;
    }

    public double getBalance() {
        return balance;
    }

    public double getMeasure() {
        return balance;
    }
}

硬币等级

package Interface;

public class Coin implements Measurable {
    private double value;
    private String name;

    public Coin(double aValue, String aName) {
        value = aValue;
        name = aName;
    }

    public double getValue() {
        return value;
    }

    public String getName() {
        return name;
    }

    public double getMeasure() {
        return value;
    }
}

接口

package Interface;

public interface Measurable {

    double getMeasure();

}

数据集类

package Interface;

public class DataSet {
    private double sum;
    private Measurable maximum;
    private int count;

    public DataSet() {
        sum = 0;
        count = 0;
        maximum = null;
    }

    public void add(Measurable x) {
        sum = sum + x.getMeasure();
        if (count == 0 || maximum.getMeasure() < x.getMeasure())
            maximum = x;
        count++;
    }

    public double getAverage() {
        if (count == 0)
            return 0;
        else
            return sum / count;
    }

    public Measurable getMaximum() {
        return maximum;
    }
}

测试类

package Interface;

public class Test {

    public static void main(String[] args) {

        DataSet bankData = new DataSet();

        bankData.add(new BankAccount(100));
        bankData.add(new BankAccount(100000));
        bankData.add(new BankAccount(10));

        Measurable max = bankData.getMaximum();

        System.out.println("Maximum :" + max.getMeasure());

        DataSet coinData = new DataSet();

        coinData.add(new Coin(0.25, "Quarter"));
        coinData.add(new Coin(0.10, "Dime"));
        coinData.add(new Coin(0.05, "Nickel"));

        max = coinData.getMaximum();

        System.out.println("Maximum : " + max.getMeasure());

    }

}

到目前为止我的理解

我完全理解银行类,硬币类和界面。我的问题是我不太了解DataSet类中的一些东西。首先,我不明白 私有Measurable maximum;的使用我的理解是在通常声明一个变量类型(如int或double)之后,但在这种情况下,它为接口分配一个变量名。我想如果有人可以解释我,那么它将帮助我澄清我对DataSet类方法的理解,比如传递Measurable参数的add方法。

最后我很难理解Test类。我不知道bankData.add(new BankAccount(100));是如何工作的。据我所知,我们创建了一个数据集类型的新对象,但我不了解如何在其中创建新的bankaccount对象。

如果有人可以帮我澄清这一点,那将真正帮助我更好地理解界面。我看了很多简单的例子,它们显示了非常基本的代码,比如汽车界面和一些方法,然后由特定的汽车实现。然而,这些原始的例子并没有真正帮助人们理解界面的真正本质。我相信这个例子更实用,它会有所帮助。如果这个问题措辞不好,我很抱歉,因为我是这个java的新手。

2 个答案:

答案 0 :(得分:3)

要回答您的第一个问题,代码private Measurable maximum;只是声明一个名为maximum的变量Measurable。这意味着任何其类实现Measureable接口的对象都可以被指定为变量的值。

要回答第二个问题,每次看到关键字时,都会创建一个对象,所以当您看到这个时:

   DataSet bankData = new DataSet();
   bankData.add(new BankAccount(100));

...第一行是创建一个新的DataSet对象,第二行是在该对象上运行add()方法,并作为参数传入一个新的BankAccount对象

在这种情况下,新对象尚未分配到main方法中的变量,因为除了将其传递给{{{}之外,我们对它没有任何用处。 1}}。

修改

所以,关于这段代码:

BankAccount

这里发生的是我们首先要从 Measurable max = bankData.getMaximum(); // get the max being store by the bank data System.out.println("Maximum :" + max.getMeasure()); // run the appropriate getMeasure method, depending on the actual type of max 对象中获取最大值,然后在其上运行bankData方法。请注意,getMeasure()变量的类型为max,就像它上面的Measureable方法的参数类型一样。

当我们将add()添加到我们的银行数据时,我们不知道真正的类型,只是它已经实现了相应接口的某个类:

Measureable

当我们从public void add(Measurable x) { sum = sum + x.getMeasure(); if (count == 0 || maximum.getMeasure() < x.getMeasure()) maximum = x; // here maximum gets set to the object passed in, but we don't know its type at this point count++; } 获取max时,我们可以在其上运行bankData,即使我们在编译时不知道对象的类型(这被称为多态)。

根据对象的实际类型,将调用相应的getMeasure()方法。在这种情况下,由于我们getMeasure()编辑add(),因此BankAccount的方法将被调用。但是,如果我们添加了BankAccount s,那么Coin类的getMeasure()方法就会被调用。

答案 1 :(得分:1)

第一个问题:

就变量和参数而言,接口可以像任何其他类一样使用。想象一个接口和合同。声明接口类型的变量就像说&#34;此指针中的任何内容都将履行此合同&#34;。只要它符合可衡量的界面,您就不会真正关心它是硬币还是银行账户。

第二个问题:

bankData.add(new BankAccount(100));

类似于

BankAccount newAccount=new BankAccount(100);
bankData.add(newAccount);

现在让我们添加一个implict cast

BankAccount newAccount=new BankAccount(100);
Mesurable bankAccountAsMeasurable = (Mesuarable)newAccount;
bankData.add(bankAccountAsMeasurable);

这样清楚了吗?