理解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.equalas()
调用文本内部的equalas()
,在那里它只获取文本作为参数谢谢 您已经在
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
methodSystem.out.println(“Word equals调用”)代码>然后运行测试。看看会发生什么。把这一行放进你的Word.equals
methodSystem.out.println(“Word equals被调用”)代码>然后运行测试。看看会发生什么。