java对象,我用动物speedy = new dog()创建动物或狗吗?为什么?

时间:2016-01-25 00:05:19

标签: java object

我没有得到我实际创造的东西...... 通常你用dog speedy = new dog();创建一个对象 您调用构造函数dog(),它创建一个dog对象,speedy是对它的引用的名称。但如果第一只狗被命名为"动物" (dog延伸animal)?

3 个答案:

答案 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(); 除了可以像其他动物一样吃饭和睡觉外,还可以吠叫。