Что такое классы, ссылки и объекты? - PullRequest
48 голосов
/ 10 февраля 2012

Я занимаюсь программированием на Java уже 2 года, и, по-видимому, я столкнулся с проблемой, когда я не мог снова понять и разграничить класс, ссылку и объект (я не понимаю, почему я забыл эти понятия).

Давайте вернемся к проблеме, которая заключается в том, что я не уверен, что класс или ссылка совпадают, хотя у меня уже есть представление о том, что такое объект.

Может ли кто-нибудь в хорошей, понятной и полной форме различить, что такое классы, ссылки и объект?

Все, что я знаю, это то, что класс больше похож на шаблон для объекта (проект дома, где класс - это проект, а дом - объект).

Ответы [ 10 ]

126 голосов
/ 10 февраля 2012

Если вам нравятся метафоры жилья:

  • a class - это как план дома.Используя этот план, вы можете построить столько домов, сколько захотите.
  • каждый дом, который вы строите (или создаете экземпляр, в OO lingo), является объектом , также известным как экземпляр.
  • каждый дом также имеет адрес, конечно.Если вы хотите сообщить кому-то, где находится дом, вы даете ему карточку с адресом, написанным на нем.Эта карта является ссылкой объекта .
  • Если вы хотите посетить дом, посмотрите на адрес, указанный на карте.Это называется разыменование .

Вы можете скопировать эту ссылку сколько угодно, но есть только один дом - вы просто копируете карту с адресом наэто, а не сам дом.

В Java вы не можете напрямую обращаться к объектам, вы можете использовать только ссылки.Java не копирует и не присваивает объекты друг другу.Но вы можете копировать и назначать ссылки на переменные, чтобы они ссылались на один и тот же объект.Методы Java всегда передаются по значению, но значение может быть ссылкой на объект.Итак, если у меня есть:

Foo myFoo = new Foo();     // 1
callBar(myFoo);            // 2
myFoo.doSomething()        // 4

void callBar(Foo foo) {
    foo = new Foo();       // 3
}

Тогда давайте посмотрим, что происходит.

  1. В строке 1 происходит несколько вещей. new Foo() говорит JVM построить новый дом, используяFoo план.JVM делает это и возвращает ссылку на дом.Затем вы копируете эту ссылку в myFoo.По сути, это все равно что просить подрядчика построить вам дом.Он делает, а затем говорит вам адрес дома;Вы записываете этот адрес.
  2. В строке 2 вы передаете этот адрес другому методу, callBar.Давайте теперь перейдем к этому методу.
  3. Здесь у нас есть ссылка Foo foo.Java передается по значению, поэтому foo в callBar является копией ссылки myFoo.Думайте об этом как о предоставлении callBar своей собственной карты с адресом дома.Что callBar делает с этой картой?Он просит построить новый дом, а затем использует карту, которую вы ему дали, чтобы записать адрес этого нового дома.Обратите внимание, что callBar теперь не может попасть в первый дом (тот, который мы построили в строке 1), но этот дом не изменился из-за того, что карта, на которой раньше был ее адрес, теперь имеет адрес другого дома
  4. Вернувшись к первому методу, мы разыменовываем myFoo для вызова метода (doSomething()).Это все равно что смотреть на карточку, идти в дом, адрес которого указан на карточке, а затем что-то делать в этом доме.Обратите внимание, что наша карта с адресом myFoo не изменяется методом callBar - помните, мы дали callBar копию нашей ссылки.

вся последовательность будет выглядеть примерно так:

  1. Попросите JVM построить дом.Это делает, и дает нам адрес.Мы копируем этот адрес на карту с именем myFoo.
  2. Мы вызываем callBar.Прежде чем мы это сделаем, мы копируем адрес, написанный на myfoo, на новую карточку, которую мы даем callBar.Он вызывает эту карту foo.
  3. callBar и просит у JVM другой дом.Он создает его и возвращает адрес нового дома.callBar копирует этот адрес на карту, которую мы ему дали.
  4. Вернувшись к первому способу, мы смотрим на нашу оригинальную, неизменную карту;зайти в дом, адрес которого указан на нашей карточке;и сделать что-нибудь там.
12 голосов
/ 10 февраля 2012

Когда вы кодируете, вы создаете

Экземпляр (вхождение, копия)

из

Объект

из упомянутых

Класс

и держать

* * Тысяча двадцать-одиной ссылка * * 1 022

к нему, чтобы вы могли вызывать его методы.

Также некоторые ООП основы: Классы , Объект , Экземпляр и Ссылка .

6 голосов
/ 05 февраля 2015

В книге «Мышление на Яве» Брюса Эккеля это было отлично описано:

«Вы можете представить телевизор (объект) и пульт дистанционного управления (ссылку). Пока вы держите эту ссылку, у вас есть подключение к телевизору, но когда кто-то говорит:« Измените канал » или «Уменьшите громкость», то, чем вы манипулируете, является эталоном, который, в свою очередь, изменяет объект. Если вы хотите перемещаться по комнате и по-прежнему управлять телевизором, вы берете пульт / эталон с собой, а не телевизор.

Кроме того, пульт дистанционного управления может стоять самостоятельно, без телевизора. То есть, если у вас есть ссылка, это не значит, что с ней обязательно связан объект. Поэтому, если вы хотите сохранить слово или предложение, вы создаете ссылку на строку:

String s;

Но здесь вы создали только ссылку, а не объект. Если вы решили отправить сообщение s в этот момент, вы получите ошибку, потому что s на самом деле ни к чему не привязан (телевизора нет). Таким образом, более безопасной практикой всегда является инициализация ссылки при ее создании:

String s = "asdf";

Однако для этого используется специальная функция Java: строки могут быть инициализированы текстом в кавычках. Обычно вы должны использовать более общий тип инициализации для объектов.

Когда вы создаете ссылку, вы хотите связать ее с новым объектом. Вы делаете это, в общем, с новым оператором. Ключевое слово new говорит: «Сделай мне новый из этих объектов». Итак, в предыдущем примере вы можете сказать:

String s = new String("asdf");

Это означает не только «Сделай мне новую строку», но и дает информацию о том, как создать строку, указав исходную строку символов. Конечно, Java поставляется с множеством готовых типов в дополнение к String. Что более важно, вы можете создавать свои собственные типы. На самом деле, создание новых типов является фундаментальной деятельностью в Java-программировании. "

3 голосов
/ 10 февраля 2012

Предположим, вы пишете две строки кода:

Engine app1 = new Engine(); //LINE 1

Engine app2  = app1; //LINE 2

В строке 1 Engine - это класс , в основном это черновик.

new Engine () - это экземпляр , который создается в куче.

Вы обновляете этот экземпляр , используя app1 и app2 в своем коде.

Таким образом, app1 и app2 являются ссылками .

2 голосов
/ 10 февраля 2012

Когда вы создаете объект, за сценой происходит то, что часть памяти зарезервирована для содержания этого объекта. Это может быть где угодно в большом большом ландшафте памяти; это зависит от операционной системы и компилятора, и у вас нет никакого контроля или знания, где он заканчивается.

Тогда спросите себя, как вы используете этот объект, если не знаете, где он находится в памяти? Как вы можете прочитать значение из него, если вы не знаете, где это значение хранится? Это то, что ссылки делают для вас. Они способ поддерживать связь с объектом. Это небольшая строка, прикрепленная к воздушному шару, которая является справочной.

Вы используете ссылку, чтобы сказать, что «Я хочу коснуться этого объекта сейчас!», Или «Я хочу прочитать значение из этого объекта!».

1 голос
/ 13 июня 2019

Класс: Структура или BluePrint

Объект: Физическое Проявление

Справка: Адрес объекта

1 голос
/ 15 мая 2014

========= Класс и объект ===========

Class => ex: Person (Больше похоже на воображение)

Object => ex: John, Mike (Real person)

=========== Ссылка ============

например:

Телевидение TV1; - (Телевидение - это класс, телевизор - это пульт дистанционного управления без телевидения)

Телевидение TV2 = новый телевизор (); - (Теперь пульт дистанционного управления TV2 имеет телевизор)

tv1 = tv2; - (теперь tv1 и tv2 могут управлять одним и тем же телевидением)

Телевидение TV3 = новое телевидение (); - (TV3 - это новый пульт дистанционного управления с новым телевидением)

1 голос
/ 10 февраля 2012

Класс это шаблон, вы правы.Это некоторые знания о структуре данных.Объект - это экземпляр структуры в памяти.Ссылка - это адрес памяти этого экземпляра.

Если под Object вы подразумевали идентификатор java, то Object является базовым классом для всех сложных классов Java.

0 голосов
/ 06 февраля 2018

Класс: используется для определения реальной сущности в среде программирования.

Любой реальный объект, имеющий хотя бы один property и соответствующий behaviour, может рассматриваться как класс. Давайте рассмотрим пример Car , у которого есть свойство accelerator, которое помогает машине двигаться и контролировать ее скорость. Соответствующее поведение - acceleration, которое прямо пропорционально толчку, приложенному к ускорителю.

class Car {
    private String tier;
    private String tierFriction;
    private double weight;
    private double gasFedToEngine;
}

Приведенный выше класс показывает некоторые свойства автомобиля, от которых зависит его ускорение. Поведение (method in the class) всегда зависит от свойства (свойств) (global attribute(s) of the class). Теперь, если вам нужно больше деталей, вы можете определить Tier как другую сущность, тогда определение будет выглядеть как

class Tier {
    private String tierMaterial;
    private String tierFriction;
    private double weight;
    private double tierDiameter;
}

class Car {
    private Tier tier;  // getting all properties of Tier here itself
    private double weight;
    private double gasFedToEngine;
}

Объект: используется для определения различных разновидностей сущности и для отдельных операций с ними.

Теперь мы определили сущность для нашей программы, скажем, у нас есть демонстрационный зал подержанных автомобилей, автомобили разных компаний. Таким образом, каждый автомобиль становится object нашей сущности. Объектами могут быть Audi, Nissan, Ferrari и т. Д. Поэтому, открыв автосалон, мы добавляем в него автомобили следующим образом

static List<Car> showroomCars = new ArrayList<Car>();
public boolean addCarToShowroom() {
    Car carNissan = new Car();  // always creates a new objects and allocates some memory in heap
    carNissan.setName("Nissan");
    carNissan.setColor(RED);
    carNissan.setWeight(300);
    showroomCars.add(carNissan);

    Car carAudi = new Car();
    carAudi.setName("Audi");
    carAudi.setColor(BLACK);
    carAudi.setWeight(270);
    showroomCars.add(carAudi);
}

Итак, теперь в автосалон добавлены две новые машины, одна из которых - Nissan, а другая - Audi, каждая из которых имеет свои собственные значения атрибутов.

Class только дает определение, манипуляции выполняются на Object, для выполнения манипуляций с любым классом, объект должен быть создан. Каждый раз, когда объект создается в классе, все его несатикические (экземплярные) переменные будут загружаться в память с соответствующими значениями по умолчанию.

Ссылка: используется для адресации объекта

Когда мы говорим Car carAudi = new Car();, мы определяем новый объект для Car, и этому объекту назначается ячейка памяти. Ссылочная переменная carAudi содержит адрес памяти этого объекта. Объект никогда не доступен напрямую ни пользователю, ни его расположению в памяти. Вот где ссылочная переменная имеет значение, она хранит формат ячейки памяти hexadecimal. Если мы хотим внести изменения в объект, сделайте это с помощью ссылки, а не напрямую.

Объект может иметь любое количество ссылок, но ссылка может указывать только на один объект за раз.

class Car {
    void test() {
        Car car1 = new Car();  // (1)
        Car car2 = new Car();  // (2)
        car2 = car1;
        /** 
         Says that car2 should point to where car1 points, so now both points to first object of Car
         But for this car2 has to loose its current object-(2), making it an Abandoned object (An object with no active reference from the stack).
        **/
    }
}
0 голосов
/ 10 февраля 2012

Object - представление времени выполнения определения Class. И имя , с которым вы используете объект , называется reference (поскольку оно ссылается на фактическое местоположение объекта в памяти)

пример

MyClass ref = new MyClass();

Здесь MyClass (содержит) определение class .

new MyClass () создает объект для этого класса (выполняется только во время выполнения, следовательно, представляет во время выполнения)

ref - это имя, которое вы используете для работы с объектом класса, это ссылка .

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