java中的虚拟方法调用多态性

java中的虚拟方法调用多态性,java,polymorphism,Java,Polymorphism,我是Java新手,正在研究多态性 该代码的输出结果是: 这就是动物 这就是动物 事实上,我期待着这样的结果: 这是猫 这是蝙蝠 代码中似乎有什么错误。将private void ganim更改为public void ganim。无法以这种方式重写私有方法。将私有void ganim更改为公共void ganim。不能以这种方式重写私有方法。基类中的方法是私有的: 因此,您无法覆盖它。将其公开或受保护,它将工作。基类中的方法是私有的: 因此,您无法覆盖它。将其公开或受保护,它就会工作。将方法ga

我是Java新手,正在研究多态性

该代码的输出结果是:

这就是动物

这就是动物

事实上,我期待着这样的结果:

这是猫

这是蝙蝠


代码中似乎有什么错误。

将private void ganim更改为public void ganim。无法以这种方式重写私有方法。

将私有void ganim更改为公共void ganim。不能以这种方式重写私有方法。

基类中的方法是私有的:


因此,您无法覆盖它。将其公开或受保护,它将工作。

基类中的方法是私有的:


因此,您无法覆盖它。将其公开或受保护,它就会工作。

将方法ganim公开而不是私有

您不能重写私有方法,但可以在派生类中引入私有方法而不会出现问题。这很好:

private void ganim()
我们不能在Java中重写私有方法,就像我们不能在Java中重写静态方法一样

与静态方法一样,Java中的私有方法也在编译时通过类型信息使用静态绑定进行绑定,而不依赖于特定引用变量所持有的对象类型

由于方法重写在动态绑定上工作,所以在Java中不可能重写私有方法


private关键字在Java中提供了最高级别的封装。尽管您可以通过声明另一个具有相同名称和不同方法签名的私有方法来隐藏Java中的私有方法

将方法ganim设置为公共的,而不是私有的

您不能重写私有方法,但可以在派生类中引入私有方法而不会出现问题。这很好:

private void ganim()
我们不能在Java中重写私有方法,就像我们不能在Java中重写静态方法一样

与静态方法一样,Java中的私有方法也在编译时通过类型信息使用静态绑定进行绑定,而不依赖于特定引用变量所持有的对象类型

由于方法重写在动态绑定上工作,所以在Java中不可能重写私有方法


private关键字在Java中提供了最高级别的封装。尽管您可以通过声明另一个具有相同名称和不同方法签名的私有方法来隐藏Java中的私有方法

动物类中的方法ganim是私有的。因此,不能重写


将其更改为公共或受保护。

动物类中的方法ganim是私有的。因此,不能重写


将其更改为public或protected。

我对您的代码进行了修改,您可以通过以下方式执行功能

你可以用下面的方法做这件事

class Base
{
   private void foo()
   {
   }
}

class Child extends Base
{
    private void foo()
    {
    }
}
输出


我修改了您的代码,使您可以通过以下方式执行功能

你可以用下面的方法做这件事

class Base
{
   private void foo()
   {
   }
}

class Child extends Base
{
    private void foo()
    {
    }
}
输出

正如旁注:

这就是为什么在重写方法时应始终使用@Override注释的原因。这只是一个很好的练习,可以让你避免这种陷阱

this is the animal
I am cat
I am bat
这将导致编译失败

正如旁注:

这就是为什么在重写方法时应始终使用@Override注释的原因。这只是一个很好的练习,可以让你避免这种陷阱

this is the animal
I am cat
I am bat
这将导致编译失败

您需要将动物类抽象化,并将ganim方法声明为抽象且非私有(不能重写),以便从实现中调用它:

public class Sup {

    private void method() { }
}


public class Sub {

    @Override
    public void method() { }
}
还请注意,您不需要将实际的实现实例传递给getanimal方法。

您需要使Animal类抽象,并声明ganim方法抽象且非私有(不能重写),以便从实现中调用它:

public class Sup {

    private void method() { }
}


public class Sub {

    @Override
    public void method() { }
}

另外请注意,您不需要将实际的实现实例传递给getanimal方法。

谢谢大家。在animal类中包含ganim方法是否需要再做一次澄清?谢谢大家。在animal类中包含ganim方法是否需要再做一次澄清?