为什么我需要创建一个A类的引用,然后创建一个B类的对象

时间:2018-10-03 19:51:49

标签: java kotlin

我是编程新手,正在观看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()

人与外星人的参照

2 个答案:

答案 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 动物。 DogCatElephant将全部可用。但是,由于这一限制,不允许我对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;

ab在此实例中都引用相同的对象。如果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()将它们分开,以便ab引用不同的狗对象。然后它们将不再像以前那样耦合。

答案 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)

如果我错了,请纠正我。

我希望有帮助。