Что такое классы, ссылки и объекты?

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

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

Может ли кто-то отличить и понять и понять, какие классы, ссылки и объекты?

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

Ответ 1

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

  • класс похож на план дома. Используя этот план, вы можете построить столько домов, сколько захотите.
  • каждый дом, который вы строите (или создаете, например, в 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 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. Вернувшись к первому способу, мы смотрим на нашу оригинальную, неизменную карту; зайти в дом, адрес которого указан на нашей карточке; и сделать что-то там.

Ответ 2

При кодировании вы создаете

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

of

Объект

указанного

Класс

и сохраните

ссылка

поэтому вы можете вызвать его методы.

Кроме того, некоторые OOP: Классы, Object, Instance и Reference.

Ответ 3

В книге "Мышление на Java" от Брюса Эккела было описано отлично:

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

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

String s;

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

String s = "asdf";

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

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

String s = new String("asdf");

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

Ответ 4

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

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

Engine app2  = app1; //LINE 2

В строке 1 Engine является классом, его синяя печать в основном.

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

Вы ссылаетесь на экземпляр с помощью app1 и app2 в вашем коде.

Итак, app1 и app2 являются ссылками.

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

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

Object = > ex: Джон, Майк (Реальный человек)

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

Пример:

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

Телевидение tv2 = новое телевидение(); - (теперь у телевизора tv2 есть телевизор)

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

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

Ответ 8

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

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

Ссылка: адрес объекта

Ответ 9

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

Пример

MyClass ref = new MyClass();

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

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

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

Ответ 10

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

Любой объект из реальной жизни, имеющий хотя бы одно property и соответствующее behaviour может рассматриваться как класс. Давайте возьмем пример автомобиля, он имеет 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 переменная 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).
        **/
    }
}

Ответ 11

Я здесь новенький. Я следовал аналогии с ишавитом и лучше понимал все концепции, и спасибо за подробное объяснение!

Но поскольку я пока не могу добавлять комментарии из-за отсутствия репутации на этом сайте, у меня возникает вопрос: какова ценность ссылки? Когда метод возвращает ссылку, что он возвращает точно? Например, когда я изучал метод String, здесь был один метод intern(). И объяснение гласило: Когда метод intern вызывается, если пул уже содержит строку, равную этому объекту String, как определено equals (Object) метод, затем возвращается строка из пула. В противном случае этот объект String добавляется в пул и возвращается ссылка на этот объект String.

И когда я тестировал их с одной программой, пул уже содержит строку:

String s1=new String("Sachin");    
String s2=new String("Sachin");
String s3=s2.intern();
System.out.println(s3);

А с другой программой из пула раньше не было String, как показано ниже. Они оба вернули одно и то же: Сачин. Поскольку упомянутое упоминание yashavit - это место, где вы можете хранить копию адреса, мне было интересно, что именно возвращается для ссылки на этот объект String в этом случае. Большое спасибо!

String s1=new String("Sachin");
String s2=s.intern();
System.out.println(s2);