Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解java编译器_Java_Compiler Errors - Fatal编程技术网

理解java编译器

理解java编译器,java,compiler-errors,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 ((oth

假设我有这两个类,在不同的文件中:

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));
编译器尖叫“句子不能转换成文本”

两个问题:

  • 为什么它适用于相等,但不适用于测试?y1是文本,因此调用
    y1.equalas()
    调用文本内部的
    equalas()
    ,在那里它只获取文本作为参数
  • 如果它确实有效,为什么输出为假?两个“单词”都设置为“abc”

  • 谢谢

    您已经在
    Text
    中定义了
    equals(Text)
    方法。但是,它不会覆盖从
    Object
    继承的现有
    equals(Object)
    方法。因此,您的
    equals(Text)
    方法重载
    Object
    中的
    equals(Object)
    方法。因此,您可以调用
    y1.equals(z1)
    。因为
    z1
    是一个
    句子
    ,所以调用
    equals(Object)
    方法。
    语句
    对象与
    对象
    匹配,但与
    文本
    不匹配。比较对象引用以查看它们是否相同

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

    它们不是,因此它返回
    false

    您已经在
    Text
    中定义了
    测试(Text)
    方法。没有其他可用的重载,而且
    语句
    文本
    根本不匹配,因此编译器抱怨


    顺便说一句,您在
    语句中定义的
    equals(Object)
    方法是对
    equals
    的正确重写,检查
    null
    和参数类。

    您在
    文本中定义了
    equals(Text)
    方法。但是,它不会覆盖从
    Object
    继承的现有
    equals(Object)
    方法。因此,您的
    equals(Text)
    方法重载
    Object
    中的
    equals(Object)
    方法。因此,您可以调用
    y1.equals(z1)
    。因为
    z1
    是一个
    句子
    ,所以调用
    equals(Object)
    方法。
    语句
    对象与
    对象
    匹配,但与
    文本
    不匹配。比较对象引用以查看它们是否相同

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

    它们不是,因此它返回
    false

    您已经在
    Text
    中定义了
    测试(Text)
    方法。没有其他可用的重载,而且
    语句
    文本
    根本不匹配,因此编译器抱怨


    顺便说一句,您在
    语句中定义的
    equals(Object)
    方法是对
    equals
    的正确重写,检查
    null
    和参数的类。

    我认为在Text.java中您想要重写
    Object.equals(Object other)
    ,但是您没有重写,而是创建了一个具有相同名称(
    equals(Text other)
    )但具有不同参数类型的其他方法

    这就是为什么
    System.out.println(y1.equals(z1))编译:该equals调用匹配签名
    equals(Object)
    ,该签名是方法文本从
    Object
    继承的


    另一方面,
    System.out.println(y1.test(z1))
    无法编译,因为
    Text
    只有一个名为
    test
    的方法,其形式参数类型为
    Text
    ,与实际参数(
    语句
    )的类型不匹配。

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

    这就是为什么
    System.out.println(y1.equals(z1))编译:该equals调用匹配签名
    equals(Object)
    ,该签名是方法文本从
    Object
    继承的

    另一方面,
    System.out.println(y1.test(z1))
    无法编译,因为
    Text
    只有一个名为
    test
    的方法,其形式参数类型为
    Text
    ,与实际参数的类型(
    语句
    )不匹配。

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

    公共布尔等于(对象obj)

    在您的例子中,
    y1.equals(z1)
    实际上作为
    y1.equals((Object)z1)
    执行,这是一个有效的强制转换,因为所有对象都继承
    对象。然后调用上述方法。

    根据类定义,在所有类中都继承该方法

    公共布尔等于(对象obj)


    在您的例子中,
    y1.equals(z1)
    实际上作为
    y1.equals((Object)z1)
    执行,这是一个有效的强制转换,因为所有对象都继承
    对象。然后调用上述方法。

    将这一行放入
    Word.equals
    method
    System.out.println(“Word equals调用”)然后运行测试。看看会发生什么。把这一行放进你的
    Word.equals
    method
    System.out.println(“Word equals被调用”)然后运行测试。看看会发生什么。