java中的虚方法调用 - 多态

时间:2012-11-15 18:35:14

标签: java polymorphism

package polymordemo1; 

class animal{
    public void getanimal(animal anim) {
        anim.ganim();
    }

    private void ganim() {
        System.out.println("this is the animal");
    }
}

class cat extends animal{
    public void ganim() {
        System.out.println("I am cat");
    }
}

class bat extends animal{
    public void ganim() {
        System.out.println("I am bat");
    }
}
public class PolymorDemo1 {
public static void main(String[] args) {
        animal a=new animal();
        cat c=new cat();
        bat b=new bat();

        a.getanimal(c);
        a.getanimal(b);

    }
}

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

此代码的输出结果为:

这是动物

这是动物。

事实上我期待这个输出:

这是猫

这是蝙蝠

代码中的错误似乎是什么。

7 个答案:

答案 0 :(得分:6)

private void ganim()更改为public void ganim()。私有方法不能以这种方式被覆盖。

答案 1 :(得分:3)

正如旁注:

这就是为什么在覆盖方法时应始终使用@Override注释。这只是一个很好的做法,可以帮助你摆脱这种陷阱。

public class Sup {

    private void method() { }
}


public class Sub {

    @Override
    public void method() { }
}

这将导致编译失败。

答案 2 :(得分:2)

基类中的方法是private

private void ganim()

因此你无法覆盖它。设为publicprotected即可。

答案 3 :(得分:1)

将方法ganim()设为public而不是private。

您不能覆盖私有方法,但可以在派生类中引入一个没有问题。编译好了:

class Base
{
   private void foo()
   {
   }
}

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

我们可以覆盖Java中的私有方法,就像我们无法覆盖Java中的 static 方法一样。

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

由于方法重写适用于动态绑定,因此无法覆盖Java中的私有方法。

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

答案 4 :(得分:1)

您需要使Animal类摘要并声明ganim()方法摘要以及非私有(不能被覆盖),以便从实现中调用它:

public abstract class Animal
{

    public void getanimal() 
    {
        this.ganim();
    }

    abstract void ganim() ;
}

另请注意,您无需将实际实现实例传递给getanimal()方法。

答案 5 :(得分:0)

动物类中的方法ganim()是私有的。因此,不能覆盖。

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

答案 6 :(得分:0)

我已经修改了代码,以便您可以通过以下方式执行功能。

你可以通过以下方式做事:

class animal{

    public void getanimal(animal anim) {
        anim.ganim();
    }

    public void ganim() {
        System.out.println("this is the animal");
    }
}

class cat extends animal{
    public void ganim() {
        System.out.println("I am cat");
    }
}

class bat extends animal{
    public void ganim() {
        System.out.println("I am bat");
    }


}
public class PolymorDemo1 {
public static void main(String[] args) {
        animal a=new animal();
        animal c=new cat();
        animal b=new bat();

        a.ganim();
        c.ganim();
        b.ganim();

    }
}

<强>输出

this is the animal
I am cat
I am bat