Java中的多态和等式[重复]
Posted
技术标签:
【中文标题】Java中的多态和等式[重复]【英文标题】:Polymorphism and equals in Java [duplicate] 【发布时间】:2017-05-04 13:28:12 【问题描述】:类 Paren 仅包含一个 int。
public class Paren
private int _val=0;
public Paren()
_val=10;
public Paren(int val)
_val=val;
public String toString()
return "val=" + _val ;
Chil 类扩展了 Paren 类,还包含一个 String 并重载了 equals 方法 3 次: 1.接受一个对象参数 2.接受Paren参数 3. 采用 Chil 参数
public class Chil extends Paren
private String _st;
public Chil()
_st="child";
public Chil(String st, int val)
super(val);
_st=st;
public String getSt()
return _st;
public boolean equals (Object ob)
if ((ob != null) && (ob instanceof Chil))
if (_st.equals(((Chil)ob)._st) &&
(getVal() == ((Chil)ob).getVal()))
return true;
return false;
public boolean equals (Paren ob) // shita 2
if ((ob != null) && (ob instanceof Chil))
if (_st.equals(((Chil)ob)._st) &&
(getVal() == ((Chil)ob).getVal()))
return true;
return false;
public boolean equals (Chil ob)
if (ob != null)
if (_st.equals(((Chil)ob)._st) &&
(getVal() == ((Chil)ob).getVal()))
return true;
return false;
我就这样实例化了对象:
Paren A = new Chil();
Chil B = new Chil();
一个多态持有一个 Chil 对象。当我打电话时
A.equals(B)
调用跳转到 1.equals() 接受一个 Object 参数
如果 A 是 Chil 而 B 是 Chil,为什么不去接受 Chil 参数的 equals() 呢?
【问题讨论】:
不能调用Chil
中重载的equals
方法,因为该变量是Paren
类型的,并且重载的方法没有为Paren
声明。它解析为equals(Object)
(Paren
继承自Object
),然后在运行时调用Chil
中equals(Object)
的重写实现。
您在 Chill 中声明了所有重载的 equals 方法,但您从 Paren 引用中调用它,因此您的 A 引用只能从 new Chil() 中看到 equals(Object obj);如果你打电话给 B.equals(A);你会得到 equals(Paren obj);
方法签名是在编译时选取的。 Polymoprhism 仅保证将为该方法执行的代码将在运行时根据引用变量中保存的实际对象类型进行搜索。对于Paren A
,当您使用A.equals(B)
时,编译器不能假设A
中的实际类型是什么,所以他只允许Paren
类可用的方法签名,它是equals(Object)
从Object 类继承的。后来你在 Chil
类中覆盖了这个方法,所以通过多态你调用了覆盖的代码。
【参考方案1】:
A
的作用类似于没有 equals (Chil ob)
的 Paren
。它所拥有的是来自Object
类的equals(Object o)
。因此,在编译时,编译器将此调用绑定到 equals(Object o)
并因此被调用。
【讨论】:
【参考方案2】:当编译器看到A.equals(B)
时,它会搜索在Paren
类(A 的编译时类型)或Paren
类的祖先中定义的名为equals
的方法。它在Object
类中找到equals(Object)
。它没有找到Chil
类中定义的equals
方法,因此无法选择具有equals (Paren ob)
或equals (Chil ob)
签名的方法。
这是方法重载,在编译时确定。
在运行时,JVM 看到A
的运行时类型是Chil
,并且Chil
覆盖equals (Object ob)
,所以它执行Chil
的equals (Object ob)
。
【讨论】:
当我看到这样的问题时,我开始寻找重复的问题 ;-)以上是关于Java中的多态和等式[重复]的主要内容,如果未能解决你的问题,请参考以下文章