Что такое классы, ссылки и объекты?
Я программировал 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 происходит несколько вещей. New
new Foo()
говорит JVM построить новый дом, используя схему Foo
. JVM делает это и возвращает ссылку на дом. Затем вы копируете эту ссылку в myFoo
. По сути, это все равно что просить подрядчика построить вам дом. Он делает, а затем говорит вам адрес дома; Вы записываете этот адрес. - В строке 2 вы передаете этот адрес другому методу,
callBar
. Давайте перейдем к этому методу дальше. - Здесь у нас есть ссылка
Foo foo
. Java передается по значению, поэтому foo
в callBar
является копией ссылки myFoo
. Думайте об этом как о предоставлении callBar
своей собственной карты с домашним адресом. Что делает callBar
с этой картой? Он просит построить новый дом, а затем использует карту, которую вы ему дали, чтобы написать адрес этого нового дома. Обратите внимание, что callBar
теперь не может попасть в первый дом (тот, который мы построили в строке 1), но этот дом не изменился из-за того, что на карте, на которой раньше был свой адрес, теперь есть какой-то другой домашний адрес., - Вернувшись к первому методу, мы разыменовываем
myFoo
для вызова метода (doSomething()
). Это все равно что смотреть на карточку, идти в дом, адрес которого указан на карточке, а затем что-то делать в этом доме. Обратите внимание, что наша карта с адресом myFoo
не изменяется методом callBar
- помните, мы дали callBar
копию нашей ссылки.
Вся последовательность будет выглядеть примерно так:
- Попросите JVM построить дом. Это делает, и дает нам адрес. Мы копируем этот адрес на карту
myFoo
. - Мы вызываем
callBar
. Прежде чем мы это сделаем, мы копируем адрес, написанный на myfoo
на новую карту, которую мы даем callBar
. Он называет эту карту foo
. -
callBar
просит JVM для другого дома. Он создает его и возвращает новый адрес дома. callBar
копирует этот адрес на карту, которую мы дали. - Вернувшись к первому способу, мы смотрим на нашу оригинальную, неизменную карту; зайти в дом, адрес которого указан на нашей карточке; и сделать что-то там.
Ответ 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);