Java对象引用机制
我有点被以下问题困住了: 哪两种Java语言机制允许对象引用变量的类型与其引用的对象的类型“不同”?举例说明。在什么意义上它们根本没有区别 我目前的答案是“实施”和“扩展”,对吗?它们是相似的,因为它们都将生成一个类,该类至少将拥有超类的所有方法签名,这些方法签名可以是实际的、抽象的或接口的。这是正确的吗?提前谢谢 工具Java对象引用机制,java,object,Java,Object,我有点被以下问题困住了: 哪两种Java语言机制允许对象引用变量的类型与其引用的对象的类型“不同”?举例说明。在什么意义上它们根本没有区别 我目前的答案是“实施”和“扩展”,对吗?它们是相似的,因为它们都将生成一个类,该类至少将拥有超类的所有方法签名,这些方法签名可以是实际的、抽象的或接口的。这是正确的吗?提前谢谢 工具 interface Animal { void attackHuman(); // actually public abstract by default } class
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;
这或多或少是正确的。答案的第二部分应该讨论子类型。在Java中,对象仅具有相同的方法签名是不够的。实际上必须有一个声明的子类型关系(通过extends/implements) 这不仅仅是迂腐。在某些语言(但不是Java)中,仅存在兼容的方法签名就足以实现类型兼容性。这被称为“鸭式键入”。参见此示例 -这里的动物是
超级类
,而狗和猫则是从中继承而来的
-您可以使用动物对象参考变量创建狗对象
-这称为类多态性
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"
}
}
}