4

私たちにはClass(と言うAnimal)があり、Interface(と言うBehave)があります。どちらAnimalにもBehave同じ署名を持つメソッドがあります(たとえばpublic void eat())。

eat()メソッドの本体をClass(たとえばDog) whichextends Animalとに記述しようとすると、実際にはimplements Behaveどのメソッドが参照されるのでしょうか? またはeat()にあるもの。どちらの場合でも、なぜそのようになるのでしょうか。AnimalBehave

編集:

Eclipseこの質問を投稿する前に、このシナリオを試しました。

ここで興味深いのは、 を実装していても、内にメソッドBehaveを作成しない場合 (つまり、継承された抽象メソッドeat()を実装しない場合) 、メソッドを持っているから既に拡張しているため、エラーは発生しないことです。Behave'sDogAnimaleat()

4

4 に答える 4

2

which eat() method is actually referred to?両方。

これを試してみてください: メソッドをまったくオーバーライドしない場合、インターフェイスで呼び出すと、親からメソッドが取得されます。

Behave b = new Dog();
System.out.println(b.eat());//this will call eat from Animal if Dog did not override.

オーバーライドすると、常に子から取得されます。

Behavior b = new Dog();
Animal a = new Dog();

a.eat() and b.eat() will both refer to the eat inside of Dog class.

これらのクラスを使用します:

public class BClass {
public int add(int a, int b){
    return a*b;
}
}

public interface BInterface {
public int add(int a, int b);
}

public class BChild extends BClass implements BInterface{
public static void main(String... args){
    BInterface bi = new BChild();
    BClass bc = new BChild();
    System.out.println(bi.add(3, 5));
    System.out.println(bi.add(3, 5));
}

@Override
public int add(int a, int b){
    return a+b;
}
}
于 2012-04-11T22:11:24.600 に答える
1

インターフェイスにはメソッドの本体定義のみを含めることができます。実装したら、定義されたすべてのメソッドを実装する必要があります。あなたの例では

class Dog extends Animal implements Behave
{
    @Override
    public void eat() {...}
 }

 abstract class Animal{
    public abstract void eat();
 }
 interface Behave{
    void eat();
 }

ここでは、Mainメソッドの場合と同様に、抽象メソッドの本体が必要です。他の方法で

class DOG extends Animal implements Behave{
    ...
}

class Animal{
   public  void eat(){
        ...
   }
}

interface Behave{
    void eat();
}

ここでは、スーパークラスの動物でメソッド本体を食べている犬のクラス。したがって、すでに実装されているので、Animalでbodyを再度実装するように依頼する必要があります。

于 2012-04-11T09:34:34.033 に答える
0

eat()言語の設計者は、インターフェイスの実装を提供していることを指定できるという複雑さよりも、メソッド シグネチャをその名前と引数の型で構成する単純さの方が便利であると言語の設計者が判断したため、メソッドは 1 つだけです。

Java では、2 つのセマンティクスが異なる場合、別の処理を行う Behave インスタンスを返すメソッドを提供します。

class Animal { 
    public void eat () { }
}

interface Behave { 
    void eat (); 
}

class Dog extends Animal { 
    public void eat () { 
        // override of Animal.eat()
    } 

    public Behave getBehave() { 
        return new Behave { 
            public void eat() { 
                BehaveEat(); 
            } 
        };
    }

    private void BehaveEat() {
        // effectively the implementation Behave.eat()
    }
}

他の言語では、メソッドがインターフェイスからメソッドを実装することを明示的に述べることができます。

于 2012-04-11T09:43:35.807 に答える
0

インターフェイスは、クラスが提供する必要があるメソッドを定義するだけです。私たちが持っている場合

public class Animal{
    public void eat(){
        System.out.println("Om nom nom");
    }
}
public class Dog extends Animal{

}

Dog は eat メソッドを提供するようになり、実装できるようになりましたBehave

于 2012-04-11T09:35:26.213 に答える