我是编程新手,正在观看YouTube教程(10:05-10:47) https://www.youtube.com/watch?v=ssAt_qrQpi0&index=31&list=PLsyeobzWxl7rooJFZhc3qPLwVROovGCfh 我不明白为什么我们需要引用A类和B类的对象?
该视频中的Kotlin示例: var h:Human = Alien()
该视频中的Java示例 人类h =新的Alien()
人与外星人的参照
答案 0 :(得分:1)
在这里,“人类”和“外星人”的用法非常糟糕。代替“人类”,考虑“动物”。代替“外星人”,而要考虑“狗”。
术语也不是很好。 “对象”本身就是文字对象:物理狗<->与之关联的位在内存中。 “参考”是变量h
。它引用对象Dog。视频中与人类/外星人一样,h
不是“动物和狗的参照物”。这是“对Dog对象的引用”。但是,变量“ h”本身并不强制引用仅 狗。实际上,它可以引用任何动物。
例如,我可以编写代码:
Animal mypet = new Dog();
mypet = new Cat();
如果我写了Dog mypet
行,那么我将被迫只写mypet = new Dog()
或mypet = getDogFromShelter(myNeighborhoodShelter)
。它不会让我写mypet = new Cat()
。
猫很酷,所以太可怕了。因此,我们编写Animal mypet
来允许变量mypet
引用 any 动物。 Dog
,Cat
,Elephant
将全部可用。但是,由于这一限制,不允许我对Dog
做任何mypet
特定的事情。
mypet.bark()
是动物,则 mypet
将不起作用。并非所有动物都能吠叫。 mypet.eat(Food)
将起作用,因为所有动物都可以吃。如果我想让我的宠物吠叫,因为我现在知道它是狗,那么我可以做
((Dog)mypet)).bark();
// Will throw run-time error if mypet is not a Dog!
// This is best to avoid, so just make mypet a Dog type if it must bark.
// If you must make an Animal bark, use if (!(mypet instanceof Dog)) to handle the error propely.
上面的代码将检查mypet
是否是狗,然后再吠叫。
这可以通过编写代码来实现
class Animal {
int health = 100;
void eat(Food f) {
health += f.value;
}
}
class Dog extends Animal { // States that "All Dogs are Animals"
// The word "extends" allows you to write Animal a = new Dog();
// "extends" also lets you do "Dog a = new Dog(); a.eat()"
int health = 150; // Dogs are strong
void bark() {
scareNearbyAnimals();
}
}
class Poodle extends Dog {
// Both of these will work:
// Dog mydog = new Poodle();
// Animal mypet = new Poodle();
int glamor = 50; // glamorous
}
视频将对象与参考混合在一起,因此,我将使用以下代码使视频更加明确
Dog a = new Dog();
b = a;
a
和b
在此实例中都引用相同的对象。如果Dog
使用大量内存,则b = a
不会导致分配更多的内存。
b.hasEaten(); // False
a.eat();
b.hasEaten(); // True
b = new Dog(); // Now they are different. a does not affect b
a.eat()
允许该物体进食。内存中的位已更改:饥饿值已重置。 b.hasEaten()
检查a
进食时使用的同一只狗的饥饿值。 b = new Dog()
将它们分开,以便a
和b
引用不同的狗对象。然后它们将不再像以前那样耦合。
答案 1 :(得分:0)
好,让我解释一下。
我们要创建“人”类的对象“人”,并假设“人”是人。
我们给人类阶级一些人类可以做的功能。假设走路,跑步,坐下。
每个功能都告诉对象(人)要做什么。
另一方面,我们要为外星人创建一个类以创建另一个对象。我们将其命名为“外国人”。假设外星人是类人动物,因此它可以做任何人类可以做的事情,再加上其他人类无法做到的特殊能力。例如“飞”。
为防止它编写与Alien类完全相同的功能(步行,跑步,坐下)。我们继承了Human类,因此我们可以从Human类中获取功能(步行,跑步,坐下)。
所以我们说: 人类h->对象“ h”是人类(oid)
但是“ h”实际上是外星人,因此我们必须对其进行定义,以便提供代码:
Human h = new Alien();
换句话说。想象一下,您有一个这样的结构:
Human (functions: walk, run, sit)
-- Alien (functions: (inherit: walk, run, sit), fly)
如果我错了,请纠正我。
我希望有帮助。