почему мне нужно создать ссылку на класс A, а затем объект класса B - PullRequest
0 голосов
/ 03 октября 2018

Я новичок в программировании, и я смотрю учебник 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 из этого видео Human h = new Alien ()

ссылка человека и объекта пришельца

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Хорошо, позвольте мне объяснить вам.

Мы хотим создать объект "человек" класса Human, предполагая, что "человек" - это человек.
Мы даем классу людей некоторые функции, которые может выполнять человек,Скажем, иди, иди, иди.
Каждая функция сообщает объекту (человеку), что делать.

С другой стороны, мы хотим создать класс для Иностранцев, чтобы создать другой объект.Мы назовем это «чужой».Предположим, что инопланетянин - гуманоид, поэтому он может делать все, что может человек, плюс некоторые другие специальные способности, которые не может сделать человек.Например, «fly».

Чтобы не допустить, чтобы он записывал точно такие же функции (walk, run, sit) в класс Alien.мы наследуем класс Human, чтобы мы могли получить функции (ходить, бегать, сидеть) из класса Human.

Итак, скажем: Human h -> объект "h" - это человек (oid)

Но «h» на самом деле инопланетянин, поэтому мы должны определить его так, чтобы появился код:

Human h = new Alien();

Другими словами.Представьте, что у вас есть такая структура:

Human (functions: walk, run, sit)
 -- Alien (functions: (inherit: walk, run, sit), fly)

Пожалуйста, исправьте меня, если я ошибаюсь.

Надеюсь, это поможет.

0 голосов
/ 03 октября 2018

Использование «Человека» и «Чужого» здесь ужасно.Вместо «Человек» подумайте «Животное».Вместо «Чужой» подумайте «Собака».

Терминология тоже не велика.«Объект» - это сам буквальный объект: физическая Собака <-> биты, связанные с ним в памяти.«Ссылка» - это переменная, h.Он ссылается на объект Dog.h не является «ссылкой на Животное и объект Собаки», как говорится в видео с Human / Alien.Это «ссылка на объект Dog».Однако сама переменная "h" не заставляет ссылаться на только собак.Фактически, он может ссылаться на любое животное.

Например, я могу написать код:

Animal mypet = new Dog();
mypet = new Cat();

Если бы я написал строку Dog mypet, то я был бы вынужден только для записи mypet = new Dog() или mypet = getDogFromShelter(myNeighborhoodShelter).Это не позволило бы мне написать mypet = new Cat().

Кошки крутые, так что это было бы ужасно.Следовательно, мы пишем Animal mypet, чтобы разрешить переменную mypet reference any animal.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 ссылаются на различные объекты собаки.Тогда они больше не будут связаны, как раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...