我的问题是:为什么a4.equals(a2)
导致method1
执行而不是method2
?
a2
指向AA
,它是参数。
关于a2.equals(b1)
也一样。
似乎当它没有指向BB
(对于所有equals
方法所在的类)时,它将仅导致method1
执行,并且方法得到的参数类型无关紧要
public class AA
{
public int getVal()
{
return 5;
}
}
public class BB extends AA
{
private String _st = "bb";
public boolean equals(Object ob) //method1
{
System.out.println("Method 1");
if((ob != null) && (ob instanceof BB))
{
if(_st.equals(((BB)ob)._st) && (getVal() == ((BB)ob).getVal()))
return true;
}
return false;
}
public boolean equals(AA ob) //method2
{
System.out.println("Method 2");
if((ob != null) && (ob instanceof BB))
{
if(_st.equals(((BB)ob)._st) && (getVal() == ((BB)ob).getVal()))
return true;
}
return false;
}
public boolean equals(BB ob) //method3
{
System.out.println("Method 3");
if(ob != null)
if(_st.equals(((BB)ob)._st) && (getVal() == ((BB)ob).getVal()))
return true;
return false;
}
}
public class Driver
{
public static void main(String[] args)
{
AA a2 = new BB();
AA a4 = new BB();
BB b1 = new BB();
System.out.println(a4.equals(a2));
System.out.println(a2.equals(b1));
}
}
答案 0 :(得分:7)
equals
类已知的唯一AA
方法是Object
' s equals
,它接受Object
个参数。因此,在调用public boolean equals(Object ob)
或a4.equals(a2)
时,只能调用a2.equals(b1)
,因为a2
和a4
的编译时类型都是AA
。
在运行时调用的方法是" method1",因为它会覆盖Object
' s equals
。只能为编译时类型为public boolean equals(AA ob)
的引用调用public boolean equals(BB ob)
和BB
重载,因为方法重载是基于方法的对象的编译时类型来解决的。调用。如果您致电b1.equals()
,您将看到正在选择其他方法,因为将使用方法重载。