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()をprivateではなくpublicにします。

プライベートメソッドをオーバーライドすることはできませんが、派生クラスに問題なく導入できます。これはうまくコンパイルされます:

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 に答える