2013-04-20 2 views
3

Я прочитал класс - это модель для создания объектов, а не существует физически, тогда как объекты являются реальными. Но мы создаем переменные внутри класса и даже манипулируем ими.Как переменные создаются внутри класса, когда класс не является реальным?

  1. Как это возможно, если класс не существует физически?

  2. Когда память создана для этих переменных?

  3. Где хранятся данные для этих переменных?

+0

В случае статических переменных см. Ответ hyde. В случае переменных экземпляра, хорошо ... поздоровайтесь с «новым» оператором (ключевым словом), который вызовет фактическое распределение. – datenwolf

+1

То, что вы читаете, неверно. Существует действительно объект класса для каждого класса, который был загружен в Java. В других языках, таких как C++, «реальность» класса находится в байтах скомпилированного кода, где помимо инструкций для создания объектов могут быть «статические» места хранения, которые представляют собой статические переменные. –

ответ

3

Если вы имеете в виду статические переменные класса, они должны быть Гарантированная initualized и любой статический код инициализации внутри класса Гарантированная для запуска, перед использованием класса. Именно тогда, когда не указано, IIRC и разные JVM могут делать это в разное время. Они в основном такие же, как и глобальные переменные на языках, которые есть у них.

Итак, повторим: статический материал существует и инициализируется до его первого использования. Реализация JVM позаботится об этом.

Но есть объект: экземпляр объекта класса, который является подклассом class Class.


Дополнение: На самом деле, в Java есть классы, так конкретно, что они могут быть сериализованы, переданы по сети в другую JVM, десериализован там, объекты класса, созданного там и код выполняется. Простым примером этого являются ванильные Java-апплеты, работающие в браузере. Другим примером являются подчиненные узлы в системе Jenkins/Hudson CI, где подчиненная программа очень мала и содержит только код для приема, десериализации и создания экземпляров обоих классов и объектов этих классов, отправленных главным сервером, к которому они подключены.

+0

Спасибо, что так много hyde – user2301829

3

Попробуйте подумать об этом таким образом. Это НЕ ТОЧНОЕ объяснение того, как это работает во время выполнения Java, но способ мышления о двойственности класса/объекта, которая может вам помочь.

Когда вы пишете класс X, вы описываете как код, так и данные. Для среды выполнения потребуется только одна копия некоторых вещей - например, код и статические переменные - и одна копия на объект других вещей, например переменные экземпляра. Вы описываете обе эти вещи в файле класса, который вы пишете, хотя они будут храниться отдельно.

Подумайте о вещах с одной копией на класс, поскольку все они хранятся вместе в блоке памяти - это будет называться структурой в C. В Java при первом обращении к классу X в вашей программе , среда выполнения распределяет этот блок памяти и связывает его с классом X.

Когда программа выполняет оператор, такой как «X x1 = новый X()», среда выполнения выделяет другой блок памяти (или структуры), содержащий все переменные экземпляра, и сохраняет отдельный указатель на то, что связано с переменной x1.

Теперь, когда программа выполняет нечто вроде «Arc arc = x1.getArc();», среда выполнения использует первый указатель для ссылки на код в методе getArc(), а второй указатель ссылается на переменные экземпляра связанный с x1, и выполняет указанный код с использованием этих переменных экземпляра.

OO-программирование обеспечивает такой способ связывания данных с кодом, который его манипулирует, что позволяет нам организовать программу как «объекты» комбинированного кода и данных. Среда выполнения позволяет отслеживать различные копии вещей для нас.

И я думаю, что неточно сказать, что класс не будет существовать, он просто не будет существовать в том виде, в котором вы его написали.

0

Классы действительно существуют в JVM физически во время выполнения. Объяснение, которое вы читали, пыталось выполнить точку A, оставив остальную часть детали позже. Школа и книги делают это все время.

В классах JVM Oracle есть физическое представление с момента их загрузки. Infact каждый объект имеет указатель на этот класс, и многие объекты могут указывать на один и тот же класс.

0

Я бы не думал о классе или предметах как о физических вещах, что мне кажется смущенным. Класс часто описывается как проект для объекта. Объекты должны быть созданы (созданы) с использованием ключевого слова 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, потому что нет объекта. Память, необходимая для фактического хранения объекта, будет заполняться при создании объекта.

Смежные вопросы