Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多个选项选择重写方法java_Java_Overriding - Fatal编程技术网

使用多个选项选择重写方法java

使用多个选项选择重写方法java,java,overriding,Java,Overriding,为了澄清-据我所知,以下方法都是覆盖对象的。它们是否超载,而我没有正确理解 我正在运行以下代码: public class AA { private int _val=0; public AA() { _val=5; } } public class BB extends AA { public BB() { .... } public boolean equals(BB ob)

为了澄清-据我所知,以下方法都是覆盖
对象的。它们是否超载,而我没有正确理解

我正在运行以下代码:

public class AA
{
    private int _val=0;
    public AA()
    {
    _val=5;
    }
}


public class BB extends AA
{
    public BB()
        {
            ....
        }
    public boolean equals(BB ob)
        {
           return false;
        }
    public boolean equals(Object ob)
        {
            return true;
        }
    public boolean equals(AA ob)
        {
            return true;
        }

public static void main(String args[])
    {
        AA a2=new BB();
        BB b1=new BB();
        if((a2.equals(b1)))
        System.out.println("hi");

    }
}
AA类没有
equals
方法

我想知道第二种方法是触发的,而不是第一种。我的理解是:

  • 由于类AA没有
    equals
    方法,我假设 编译时编译器希望从
    对象运行
    等于
    班级
  • 在运行时,编译器发现a2实际上是一个BB对象 因此具有
等于方法,这些方法重写了
对象
但是,我不清楚的是,如果发送的对象已定义且实际上是BB对象,为什么选择第二种方法
(对象ob)
,而不是第一种方法
(BB ob)


非常感谢您的反馈

重载不是在运行时选择的,而是在编译时选择的,此时编译器只知道对象是
AA
。根据对象的实际运行时类型,仅在运行时选择覆盖,但仍使用在编译时选择的重载。

当调用
a.equals(b)
时,编译器会查看AA中的
equals
方法。如果它在那里找到合适的,它就会使用它。在这种情况下,AA没有称为“equals”的方法。因此,它将沿着继承链前进,并再次查看。这一次,它正在查看对象,并找到
Object.equals(Object)
。在运行时,它会找到最重写的版本并调用它

因此,如果它仍在寻找一个名为“equals”的方法,为什么它在运行时找不到更具体的版本
equals(BB)

BB.equals(BB)
不被视为对
Object.equals(Object)
的重写。它有一个更具体的参数,不能处理普通对象。假设类型是名称的一部分:

  • 等于对象
  • 等于BB

编译器选择了
equals_Object
方法,因此在运行时JVM将找不到
equals_BB
方法,因为它没有寻找它。

如果您能向我们展示class
AA
,这将非常有帮助。目前我们能看到的唯一覆盖是
equals(Object)
。其余的都超载了。我们不知道重载
AA
还提供了什么。还要注意,“在运行时编译器发现…”假设编译器正在运行时执行。事实并非如此。是虚拟机在运行时做事情。@ctst:No,
a2
的编译时类型是
AA
,而不是
BB
。编译器只关心这些。AA没有一个equals方法,编辑它是为了澄清。@Rony:与其说明
AA
没有什么,为什么不给我们提供一个完整的例子?@ctst:是的,它覆盖了
equals
。。。但重载是在编译时根据编译时类型执行的。如果
AA
没有提供任何额外的
equals
方法,那么对
a2.equals(…)
的任何调用都将调用
equals(Object)
重载。