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),然后在运行时调用Chilequals(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),所以它执行Chilequals (Object ob)

【讨论】:

当我看到这样的问题时,我开始寻找重复的问题 ;-)

以上是关于Java中的多态和等式[重复]的主要内容,如果未能解决你的问题,请参考以下文章

java:从具有多态性的未知类调用静态方法[重复]

2个城市之间的经度和纬度距离等式是啥[重复]

在java中转换对数方程[重复]

SQL Server不等式比较运算符,为啥有两个[重复]

在 AppEngine 查询中使用两个不等式 [重复]

为啥以及何时使用多态性将基类指向 C++ 中的派生类 [重复]