Я бы не думал о классе или предметах как о физических вещах, что мне кажется смущенным. Класс часто описывается как проект для объекта. Объекты должны быть созданы (созданы) с использованием ключевого слова new
, когда объект создается, класс объекта используется в качестве плана для создания базового объекта по умолчанию. Затем объект может управляться даже во время выполнения, ссылаясь на местоположение в памяти, где он хранится, и используя методы внутри класса объекта для управления полями внутри класса объекта, по крайней мере, так оно обычно и должно выполняться, его что известно как инкапсуляция и невероятно важно в ООП, поэтому, если вы не знакомы с инкапсуляцией, я бы порекомендовал ее изучить.
Я упомянул, что объект можно манипулировать во время выполнения, что является существенным различием между объектом и классом. Классы могут также использовать что-то, называемое отражением, но это еще одна тема для другого дня. Параметр или поле иногда описывается как адрес, это ссылка на местоположение в памяти, где хранится объект. Объекты не доступны напрямую, на них ссылаются переменные.
JLabel label;
Код выше откладывая место в памяти для хранения JLabel
объекта при создании экземпляра с new
ключевого слова. До сих пор не было созданного объекта, мы объявили переменную, которая является ссылкой на место в памяти, где наш объект будет храниться при его создании. Мы не будем напрямую обращаться к нашему объекту JLabel, мы будем использовать переменную 'label', которую мы создали, чтобы ссылаться на фактический объект в памяти. Так что, если мы создаем два JLabel
объектов и их экземпляры, как это ...
JLabel label;
label = new JLabel();
JLabel anotherLabel = new JLabel("this is another label");
теперь у нас есть два объекта JLabel. Первый объект сначала объявляет переменную для ссылки на объект, а затем создает ее на отдельной строке. Второй объект объявляет ссылку на него и создает все экземпляры в одной строке. Вы можете создавать объекты в любом случае, и есть разные причины для использования обоих этих методов. Когда объект создается, хотя бы один из его конструкторов называется первым, объект вызывает конструктор внутри класса JLabel
, который не принимает никаких параметров; Второй объект использует конструктор внутри класса JLabel
, который принимает String
и создает объект, отображающий текст, переданный конструктору.
Теперь представьте, что программа запущена, и мы хотим изменить первый объект, чтобы он отображал некоторый текст, потому что в настоящее время он пуст, так как мы использовали конструктор, который не принимает никаких параметров. Мы можем манипулировать объектом, используя метод setText(String)
, подобный этому.
label.setText("now the first label displays text");
Мы не изменили JLabel
класс каким-либо образом с помощью этого метода, однако мы изменили объект, так что теперь он отображает текст. Я, вероятно, собираюсь потерять кучу точек репутации или что бы то ни было, за этот ответ, потому что я, вероятно, не объяснил каждую деталь точно правильно, но я ответил на этот вопрос, потому что вы спрашиваете то, что было довольно сложно для меня понимаете в течение долгого времени, вероятно, больше, чем большинство, потому что я никогда не занимался классом программирования. Там так много, что я не могу объяснить это полностью, не написав книгу, поэтому я не занимался такими вещами, как область видимости, модификаторы доступа, статические и т. Д., Но я попытался охватить то, что, как мне кажется, важно, чтобы понять, спрашивая. Как я уже сказал, у меня нет никакого формального образования, поэтому я отвечу на мой вопрос, за что стоит, но надеюсь, что мне было легче понять это.
О, я забыл о вашем другом вопросе. Место в памяти для хранения объекта объявляется при создании переменной для объекта. В этот момент есть место, но размер в памяти по-прежнему равен 0 или null, потому что нет объекта. Память, необходимая для фактического хранения объекта, будет заполняться при создании объекта.
В случае статических переменных см. Ответ hyde. В случае переменных экземпляра, хорошо ... поздоровайтесь с «новым» оператором (ключевым словом), который вызовет фактическое распределение. – datenwolf
То, что вы читаете, неверно. Существует действительно объект класса для каждого класса, который был загружен в Java. В других языках, таких как C++, «реальность» класса находится в байтах скомпилированного кода, где помимо инструкций для создания объектов могут быть «статические» места хранения, которые представляют собой статические переменные. –