Nano Hash - криптовалюты, майнинг, программирование

логическая структура/детали ссылочной переменной и объекта в памяти?

Допустим, у нас есть класс:

class Class1
{
   int i = 1;
}

и у нас есть переменная:

Class1 ob1 = new Class1();
  • Сохраняет ли сама ссылка, хранящаяся в переменной ob1, информацию о том, что она относится к объекту Class1?
  • Часть кучи, где хранится Class1, хранит информацию о том, что она имеет тип Class1?
  • Как логически выглядит эта информация? Это строка типа application1.Class1 или ссылка на какой-то пул ссылочных типов?

Если вы можете порекомендовать источник такой информации, я буду очень признателен за ее предоставление, я не могу найти его в справочнике.


Ответы:


1

Сохраняет ли сама ссылка, хранящаяся в переменной ob1, информацию о том, что она относится к объекту Class1?

НЕТ. Ссылочная переменная ob1 хранит только ссылку на объект, на который она указывает. И информация об этом объекте уже известна приложению (или JVM).

Сохраняет ли часть кучи, где хранится Class1, информацию о том, что она относится к типу Class1?

НЕТ. Информация о загружаемом классе хранится в область методов. Как указано в этой ссылке
, для каждого загружаемого типа виртуальный Java Машина должна хранить в области метода следующие виды информации:

  • Полное имя типа
  • Полное имя прямого суперкласса типа (если тип не является интерфейсом или классом java.lang.Object, ни один из которых не имеет суперкласса)
  • Является ли тип классом или интерфейсом
  • Модификаторы типа (некоторое подмножество `public, abstract, final)
  • Упорядоченный список полных имен любых прямых суперинтерфейсов.

Как логически выглядит эта информация? Это строка типа application1.Class1 или ссылка на какой-то пул ссылочных типов?

Внутри файла класса Java и виртуальной машины Java имена типов всегда хранятся как полные имена. Например, полное имя класса Object в пакете java.lang представлено как java/lang/Object. В области методов полные имена могут быть представлены в любой форме и структуре данных, которые выберет разработчик.

26.06.2013

2

Каждая ссылка на объект Java знает свой класс во время выполнения; эта так называемая «информация о типе времени выполнения» используется в таком коде:

if (obj instanceof class1) {
  // true!
}

Вы также можете получить доступ к классу объекта через obj.getClass(). Это вернет class1.class, объект класса Class<class1>. См. Object.getClass метод.

(Обратите внимание, что если ваш класс параметризован как class1<T>, тип T не будет сохранен во время выполнения из-за «стирания».)

Я не знаю, хранится ли информация о классе с указателем или с данными; это, вероятно, зависит от реализации в jvm; но это вряд ли имеет значение с практической точки зрения. (Таким образом, либо ответ 1, либо 2, либо оба ответа — «да»).

Ответ на вопрос 3 заключается в том, что с точки зрения java-программиста информация о типе времени выполнения инкапсулируется в объект класса Class. Под прикрытием JVM может так или иначе реализовать это.

26.06.2013

3

Отвечая на ваш вопрос:

  1. Нет. Ссылка — это просто ссылка, т.е. некий адрес в куче, где хранится соответствующий объект. Нет необходимости хранить дублирующую информацию о типе ссылки в самой ссылке, потому что реально реальная переменная, содержащая ее адрес ссылки, может быть разных типов классов.

  2. Очень странный вопрос. Конечно, да, это так. Кроме того, эта «часть кучи» является объектом, который содержит описание этого конкретного класса. Любой объект Class содержит информацию о полном имени того класса, который им описывается.

  3. Он не определяется тем, как он выглядит логически, если вы имеете в виду его структуру:

2.7 Представление объектов:

Виртуальная машина Java не требует какой-либо конкретной внутренней структуры для объектов.

Но если мы говорим об информации о типе класса - да, это просто объект String, потому что "тип" объекта Class (который он представляет) - это просто имя соответствующего класса.

26.06.2013
  • 1. Нет. гм, но ответ ниже говорит, что каждая виртуальная машина Java должна иметь возможность определять информацию о своем классе, учитывая только ссылку на объект. 26.06.2013
  • @MaxNevermind Я не понимаю, где? Вы не перепутали термины "ссылка" и "данные объекта"? Используя ссылку, он может просто посмотреть на объект и определить, к какому классу он относится. 26.06.2013

  • 4

    введите здесь описание изображения

    Это одна из схем, в которой JVM может хранить информацию о классе для проверки во время выполнения с использованием instanceOf.

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

    Это один из способов, которым реализация виртуальной машины Java может связать информацию о классе с данными экземпляра для объекта. На этом рисунке собственный указатель на структуру данных, содержащую информацию о классе, хранится вместе с переменными экземпляра для объекта. Детали того, как JVM может связывать данные объекта с информацией о его классе, выходят за рамки этой статьи. Здесь важно понимать, что информация о классе каким-то образом будет связана с данными экземпляра объектов и что данные экземпляра включают поля для класса объекта и всех его суперклассов.

    Сообщение Artima об инициализации объектов

    Поэтому, когда вы делаете instanceOf, проверьте, что информация о классе доступна через этот указатель. Но опять же имейте в виду, что точная реализация хранения информации о классе может зависеть от реализации.

    26.06.2013
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..