理解java编译器

时间:2016-02-18 17:05:47

标签: java compiler-errors

假设我有两个类,在单独的文件中:

public class Text
{
    public String _word;

    public Text(String w)
    {
        _word = w;
    }

    public String getWord()
    {
        return _word;
    }

    public boolean equals (Text other)
    {
        return ((other!=null)&&(_word.equals(other._word)));

    }
    public boolean test (Text other)
    {
        return 1==1;

    }
}

第二课:

public class Sentence
{
    public String _word;

    public Sentence(String w)
    {
        _word = w;
    }

    public String getWord()
    {
        return _word;
    }

    public boolean equals (Object other)
    {
        return ((other!=null) && (other instanceof Sentence)
                &&  (_word.equals(((Sentence) other)._word)));
    }
}

以下主要内容:

public static void main(String[]args){

     Text y1 = new Text("abc");
     Sentence z1 = new Sentence ("abc");
     **
}

让我们说我运行以下命令,其中**是:

System.out.println (y1.equals(z1));

一切都很好,它会输出" false"。

但是,如果我运行此命令:

System.out.println (y1.test(z1));

编译器尖叫" Sentence无法转换为Text"。

两个问题:

  1. 为什么它适用于平等但不适用于测试? y1是Text,因此调用y1.equlas()调用Text中的equlas(),然后只将Text作为参数。
  2. 如果它可以工作,为什么输出是假的?两个" _word"设置为" abc"。
  3. 谢谢!

3 个答案:

答案 0 :(得分:3)

您已在equals(Text)中定义了Text方法。但是,它不会覆盖它从equals(Object)继承的现有Object方法。因此,您的equals(Text)方法会重载equals(Object)中的Object方法。因此,您可以致电y1.equals(z1)。由于z1Sentence,因此equals(Object)方法就是所谓的方法。 Sentence对象与Object匹配,但与Text不匹配。 equals method in Object比较对象引用以查看它们是否相同。

  

equals的{​​{1}}方法实现了对象上最具辨别力的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象(x == y具有值Object)时,此方法才返回true。 / p>

他们不是,所以它返回true

您已在false中定义了test(Text)方法。没有其他可用的重载,Text根本不匹配Sentence,因此编译器会抱怨。

顺便提一下,您在Text中定义的equals(Object)方法是Sentence的正确覆盖,检查equals和参数的类。

答案 1 :(得分:2)

根据Object类定义,您可以在所有类中继承它

  

public boolean equals(Object obj)

在您的情况下,y1.equals(z1)实际上是y1.equals( (Object) z1)执行的,因为所有对象都继承Object,所以有效。然后,您可以使用上述方法。

答案 2 :(得分:0)

我认为在Text.java中你要覆盖Object.equals(Object other),但是不是覆盖你创建了一个具有相同名称(equals(Text other))但具有不同参数类型的其他方法。

这就是System.out.println (y1.equals(z1));编译的原因:等于调用匹配签名equals(Object),Text从Object继承的方法。

另一方面,System.out.println (y1.test(z1));无法编译,因为Text只有一个名为test的方法,其形式参数类型为Text,而不是Sentence #39; t匹配实际参数的类型(var indexOf = Array.prototype.indexOf)。