5

我有点坚持以下问题:

哪两种 Java 语言机制允许对象引用变量的类型与其所引用的对象的类型“不同”?举个具体例子来说明。它们在什么意义上根本没有区别?

我目前的答案是它是“实施”和“扩展”,对吗?它们是相似的,因为它们都将创建一个类,该类至少将拥有超类的所有方法签名,可以是实际的、抽象的或接口。它是否正确?提前致谢!

4

3 回答 3

3

这或多或少是正确的。您答案的第二部分应该讨论子类型。在 Java 中,对象仅具有相同的方法签名是不够的。实际上必须有一个声明的子类型关系(通过扩展/实现)。

这不仅仅是迂腐。在某些语言(但不是 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其中。

-可以使用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 回答