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
extendsanimal
)会怎么样 您的问题不是很清楚,但是如果您的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
中定义的。