理解代码的困难

时间:2014-02-10 19:57:24

标签: java

以下代码的最后四行究竟是做什么的?

class Money {

    private int fAmount;
    private String fCurrency;

    public Money(int amount, String currency) {
        fAmount = amount;
        fCurrency = currency;
    }

    public int amount() { return fAmount; }
    public String currency() { return fCurrency; }

    public Money add(Money m) {
        return new Money(amount() + m.amount(), currency());
    }

    public boolean equals(Object anObject) {
        if (anObject instanceof Money) {
            Money aMoney= (Money)anObject;
            return aMoney.currency().equals(fCurrency) && aMoney.amount() == fAmount;
        }
        return false;
    }

4 个答案:

答案 0 :(得分:1)

他们检查两个货币对象是否相等。它检查传递给equals的参数是否确实是货币对象,然后检查值和货币是否相等

答案 1 :(得分:1)

  • if (anObject instanceof Money) {

对象是Money对象吗? truefalse

  • Money aMoney= (Money)anObject;

该对象是Money对象。将对象转换为Money对象,以便我们可以访问所有类似Money的字段和方法

  • return aMoney.currency().equals(fCurrency) && aMoney.amount() == fAmount;

比较一些Money内容并返回truefalse

  • return false;

该对象不是Money对象。返回false

答案 2 :(得分:1)

我会从这里接受它:

 public boolean equals(Object anObject) {
   if (anObject instanceof Money) {
     Money aMoney= (Money)anObject;
     return aMoney.currency().equals(fCurrency) && aMoney.amount() == fAmount;
   }
   return false;
 }

这里有一个方法。

public boolean equals(Object anObject) {

声明这个方法是publilc,应该返回一个布尔值,并将一个Object作为一个争论。

if (anObject instanceof Money) {

此行将作为参数传入的对象与您创建的名为Money的类进行比较。调用“instanceof”返回true或false,并确定Objecct是否是Money类的实例。

Money aMoney= (Money)anObject;

此行分配一部分内存,并将该空间中的Object标识为Class Money的对象。然后它将对象传递给Method并将其转换为Money类。仅当前一行(instanceof)返回true时才会发生这种情况。如果您在没有事先检查的情况下执行此操作,则可能会出现异常,例如,如果您传入了字符串。

return aMoney.currency().equals(fCurrency) && aMoney.amount() == fAmount;

现在您有一个Money类型的对象,您可以使用Money类中声明的方法。其中包括方法currency()amount()。你在这里做的是将传入的对象中的货币值转换为某个常量值(fCurrencY),将amount()转换为其他值(fAmount)。您检查以确定它们的等效性,并将两个比较的结果与AND的真实结果一起返回。

您可以将此行重写为:

boolean currencyEqual = aMoney.currency().equals(fCurrency); // string and or object comparison for equivlance
boolean amount = aMoney.amount() == fAmount; // numeric comparison
boolean bothEqual = currencyEqual && amount;  //boolean AND operation (1 && 1 = 1, 1&&0 = 0, 0 && 0 = 0)
return bothEqual;

最后一行:

return false;

仅在传入的参数不是Money的实例时运行,因此返回false。

有关instanceof的非常好的描述:

What is the 'instanceof' operator used for?

关于方法声明的讨论:

http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html

用于继承树和转换:

http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

答案 3 :(得分:0)

当比较非原始数据类型(不是int,double,boolean等)与==时,您不是要比较它们的值,而是它们的引用。这意味着你基本上是在比较它们是否指向相同的内存块。要比较这些对象的值,您需要覆盖其类中的方法equals

您可以在示例代码中看到String也使用equals,而不是==,因为String也不是原始类型。