1
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 的新手,我正在研究多态性。

这段代码的输出结果是:

这是动物

这是动物。

事实上我期待这个输出:

这是猫

这是蝙蝠

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

4

7 回答 7

6

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

于 2012-11-15T18:37:30.433 回答
3

正如旁注:

这就是为什么@Override在重写方法时应该始终使用注解的原因。这只是一个很好的做法,可以让你远离这种陷阱。

public class Sup {

    private void method() { }
}


public class Sub {

    @Override
    public void method() { }
}

这将导致编译失败。

于 2012-11-15T18:47:21.403 回答
2

基类中的方法是private

private void ganim()

因此你不能覆盖它。做它publicprotected它会工作。

于 2012-11-15T18:37:51.210 回答
2

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

public abstract class Animal
{

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

    abstract void ganim() ;
}

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

于 2012-11-15T18:48:16.250 回答
1

将 ganim() 方法设为公开而不是私有。

您不能覆盖私有方法,但您可以在派生类中引入一个私有方法而不会出现问题。这编译得很好:

class Base
{
   private void foo()
   {
   }
}

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

我们不能覆盖Java 中的私有方法,就像我们不能覆盖Java 中的静态方法一样。

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

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

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

于 2012-11-15T18:38:20.460 回答
0

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

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

于 2012-11-15T18:40:15.403 回答
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
于 2012-11-15T18:40:52.043 回答