覆盖和过载

时间:2016-10-25 07:20:33

标签: java

我的问题是:为什么a4.equals(a2)导致method1执行而不是method2a2指向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));
    }
}

1 个答案:

答案 0 :(得分:7)

equals类已知的唯一AA方法是Object' s equals,它接受​​Object个参数。因此,在调用public boolean equals(Object ob)a4.equals(a2)时,只能调用a2.equals(b1),因为a2a4的编译时类型都是AA

在运行时调用的方法是" method1",因为它会覆盖Object' s equals。只能为编译时类型为public boolean equals(AA ob)的引用调用public boolean equals(BB ob)BB重载,因为方法重载是基于方法的对象的编译时类型来解决的。调用。如果您致电b1.equals(),您将看到正在选择其他方法,因为将使用方法重载。