gpt4 book ai didi

java - 覆盖和重载

转载 作者:搜寻专家 更新时间:2023-11-01 01:49:59 24 4
gpt4 key购买 nike

我的问题是:为什么 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));
}
}

最佳答案

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

在运行时调用的方法是您的“method1”,因为它覆盖了Objectequalspublic boolean equals(AA ob)public boolean equals(BB ob) 重载只能为编译时类型为 BB 的引用调用,因为方法重载是根据调用方法的对象的编译时类型来解决的。如果您调用 b1.equals(),您将看到其他方法被选中,因为将使用方法重载。

关于java - 覆盖和重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40233724/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com