5

私は次の質問に固執しています:

オブジェクト参照変数の型を、それが参照するオブジェクトの型とは「異なる」ようにできる Java 言語メカニズムを 2 つ選択してください。説明する具体的な例を挙げてください。それらはどのような意味で全く異なっていないのでしょうか?

私の現在の答えは、「実装」と「拡張」ですよね?そして、それらは両方とも、実際の、抽象、またはインターフェースである可能性のあるスーパークラスのすべてのメソッドシグネチャを少なくとも所有するクラスを作成するため、似ています。これは正しいです?前もって感謝します!

4

3 に答える 3

3

それは多かれ少なかれ正しいです。回答の 2 番目の部分では、サブタイプについて説明する必要があります。Java では、オブジェクトが同じメソッド シグネチャを持つだけでは不十分です。実際には、宣言されたサブタイピング関係が必要です (extend / implements を介して)。

これは単なるペダントリーではありません。一部の言語 (Java を除く) では、互換性のあるメソッド シグネチャが存在するだけで型の互換性が確保されます。これを「ダックタイピング」といいます。

于 2012-09-04T04:12:57.343 に答える
1

道具

interface Animal {
   void attackHuman(); // actually public abstract by default
}
class Horse implements Animal {
   public void attackHuman() { }; // must implement
}

// type and reference the same
Horse a1 = new Horse();

// type and reference different
Animal a2 = a1;

伸びる

class Animal {
   void attackHuman();
}
class Dinosaur extends Animal {
   // attackHuman() inherited
}

// type and reference the same
Dinosaur a1 = new Dinosaur();

// type and reference different
Animal a2 = a1;
于 2012-09-04T04:09:32.623 に答える
0

この例を参照してください。

-ここで動物はですSuper-Class、そしてinheritedそれから出ています。

-を使用してDogオブジェクトを作成できますAnimal Object Reference Variable

-これはとして知られていClass Polymorphismます。

public class Test {

public static void main(String[] args){

Animal a = new Dog();
new Hospital().treatAnimal(a);

   }
}

class Animal {

public void sayIt(){

     }
}

class Dog extends Animal{

public void sayIt(){

    System.out.println("I am Dog");
   }
}


class Cat extends Animal{

public void sayIt(){

System.out.println("I am Cat");
     }
}










See the NEXT PAGE for the Remaining Code

class Hospital{

public void treatAnimal(Animal a){


if(a instanceof Dog){             



   a.sayIt();         // Will output "I am Dog"

  }
else{

a.sayIt();         // Will output "I am Cat"

}


  }

}
于 2012-09-04T04:18:40.440 に答える