我试图了解接口的工作原理。我已经在线阅读了基本界面教程并观看了一些视频,因此我对界面是什么及其优点有了一个很好的了解。但是,我遇到了这段代码,它正在利用界面功能,而我却无法理解其中的一些内容。所以我需要有人来分解究竟发生了什么。到目前为止,我还会写下我对它的理解,所以如果我错了,你可以纠正我。
这是守则。
银行帐户类
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的新手。
答案 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);
这样清楚了吗?