java对象,使用animal speedy=new dog()创建动物还是狗;为什么?

java对象,使用animal speedy=new dog()创建动物还是狗;为什么?,java,object,Java,Object,我不明白我到底在创造什么。。。 通常使用dog speedy=newdog()创建对象 调用构造函数dog(),它创建一个dog对象,speedy是对它的引用的名称。但是如果第一只狗被命名为“动物”(dogextendsanimal)会怎么样 您的问题不是很清楚,但是如果您的Dog类正在扩展Animal,并且您希望使用Dog方法/字段,则需要创建一个新的Dog。您可以创建一个Animal a=new Dog(),但仍然无法访问Dog方法/字段(尽管它不会抛出错误)这取决于您希望使用Dog对象的方

我不明白我到底在创造什么。。。 通常使用
dog speedy=newdog()创建对象

调用构造函数
dog()
,它创建一个
dog
对象,
speedy
是对它的引用的名称。但是如果第一只狗被命名为“动物”(
dog
extends
animal
)会怎么样

您的问题不是很清楚,但是如果您的Dog类正在扩展Animal,并且您希望使用Dog方法/字段,则需要创建一个新的Dog。您可以创建一个Animal a=new Dog(),但仍然无法访问Dog方法/字段(尽管它不会抛出错误)

这取决于您希望使用Dog对象的方式。考虑这个例子:

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();
你的
狗除了能吃能睡外,还能吠叫,就像其他动物一样。

静态与动态对象类型 考虑以下类别:

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
。这也是变量的类型。这将定义可用的方法

动态类型是在运行时定义的类型,是定义其行为的变量的“真实”类型

在上述代码中,您将无法对变量
dog
调用
bark()
,因为它的静态类型是
Animal
。但是,当您调用
eat()
时,它将返回
I want a bone
,因为它的行为由其动态类型定义,即
Dog


在许多情况下,您不知道对象的动态类型。例如,如果您编写的方法具有类型为
List
的参数,则只有当有人使用
List
实现调用您的方法时(例如
ArrayList
LinkedList
等),才会知道实际的动态类型。

我将向您展示一个示例:在最底部,您可以看到“Alpha delta=new delta()”我的问题是:我是在创造阿尔法还是德尔塔?德尔塔这个名字和它没有任何关系,只是让你感到困惑。但是假设它没有抛出错误,Delta实现/扩展了Alpha,因此您创建了Delta,但只能访问Alpha中定义的功能。为什么我只能访问Alpha中定义的功能?Delta Delta=new Delta()和Alpha Delta=new Delta()之间有什么区别?因为您无法访问类型中未定义的方法。在这种情况下,类型为Alpha(Alpha delta)。如果该代码有效,则意味着Delta扩展/实现了Alpha,但您需要使用Delta类型来利用它另外实现的功能。@Brian96您缺少的是
动物
Delta
是一个
Alpha
!因此,答案是两者皆有!我真的希望你的课程能在
PascalCase
中命名…mal kurz auf Deutsch wegen der Verständlichkeit。。。动物bzw狗是一种动物,它是一种很好的方法。尽管给人一种错误的印象,但不用担心,哈哈,我想说的是:因此,每一行开头的动物或狗都是有定义的,我可以从哪个类将它的方法用于我的Dog对象?@Brian96变量名前面的类型确定该变量的静态类型(即编译器在编译时已知的类型,而Java虚拟机在运行时已知的类型)。此类型确定可以调用的方法和可以直接访问的变量,而无需强制转换。访问其他方法需要强制转换,例如
((Dog)fifi).bark()
将正确编译和运行,因为您为编译器提供了更具体的类型。好的,Animal dog=new dog();表示我正在创建一个类型为Dog的对象,Dog是该对象的引用,但我只能访问与类Animal?中的方法同名的方法@Brian96 yes。它将表现为一只
,但您只能访问
动物
的方法。好的。。。我没有得到100%的例外,但为什么我仍然可以访问从狗吃的方法,当我是指专门Animal@Brian96因为
eat()
也是在
Animal
中定义的。