我没有得到我实际创造的东西......
通常你用dog speedy = new dog();
创建一个对象
您调用构造函数dog()
,它创建一个dog
对象,speedy
是对它的引用的名称。但如果第一只狗被命名为"动物" (dog
延伸animal
)?
答案 0 :(得分:2)
您的问题不是很清楚,但如果您的Dog类正在扩展Animal,并且您想要使用Dog方法/字段,则需要创建一个新的Dog。您可以创建一个Animal a = new Dog(),但您仍然无法访问Dog方法/字段(尽管它不应该抛出错误)
答案 1 :(得分:1)
考虑以下课程:
class Animal {
void eat() { System.out.println("Nom nom"); }
}
class Dog extends Animal {
void eat() { System.out.println("I want a bone"); }
void bark() { System.out.println("WOOF"); }
}
现在考虑以下代码:
Animal dog = new Dog();
问题:变量dog
的类型是什么?答案取决于您是否想知道静态类型或动态类型。
静态类型是编译器看到的类型,在这种情况下为Animal
。这也是变量的类型。这将定义哪些方法可用。
动态类型是在运行时定义的类型,它是变量的“真实”类型,用于定义其行为。
在上面的代码中,您无法在变量bark()
上调用dog
,因为其静态类型为Animal
。但是,当您致电eat()
时,它会返回I want a bone
,因为其行为是由其动态类型Dog
定义的。
在许多情况下,您不知道对象的动态类型。例如,如果您编写的参数类型为List
的方法,则仅当有人使用List
实施方法调用您的方法时,才会知道实际的动态类型(例如ArrayList
,{ {1}}等。)。
答案 2 :(得分:0)
这取决于您想要使用狗对象的方式。考虑这个例子:
9
如果您想像其他动物一样对待您的狗,即作为可以吃饭和睡觉的人,您可以这样做:
class Animal {
public void eat() {
System.out.writeln("nam nam nam");
}
public void sleep() {
System.out.writeln("zzzz zzzz");
}
}
class Dog extends Animal {
public void bark() {
System.out.writeln("ruff ruff");
}
}
然而,菲菲无法吠叫。另一方面,如果你这样做,
Animal fifi = new Dog();
fifi.eat(); // Works fine
fifi.sleep(); // Works fine
fifi.bark(); // Compile error!
你的Dog speedy = new Dog();
speedy.eat();
speedy.sleep();
speedy.bark();
除了可以像其他动物一样吃饭和睡觉外,还可以吠叫。