Есть ли у Java указатели?

Если Java не имеет указателей, то что делает ключевое слово new в Java?

Ответ 1

Как указано, Java имеет ссылки. Как они отличаются?

  • вы не можете выполнять арифметические или другие подобные операции над этими
  • они не указывают на память, содержащую объект (т.е. они не являются указателями по другому имени). JVM имеет право перемещать объекты в пределах памяти VM и, скорее всего, будет делать во время сбора мусора. Однако ссылки все же указывают на этот объект, несмотря на его перемещение в памяти.

Поэтому они не похожи на ссылки С++ (указывающие непосредственно на объект). Возможно, лучшим именем будет дескриптор.

Ответ 2

Java не имеет указателей; Java имеет ссылки.

Это тонкая точка, но указатель имеет дополнительные операции, которые вы можете (или не можете) использовать; в ссылке отсутствуют эти операции, поскольку операции могут быть небезопасными.

Например, если вы указали указатель на первый элемент массива, например:

int squares[] = {1, 4, 9, 16, 25, 36, 49};
int* intPointer = squares;

вы можете разыменовать указатель и получить значение "1", но вы также можете:

intPointer++

и после этого, когда вы разыщите указатель, вы получите значение "4". Второй

intPointer++;

будет, при разыменовании, дать вам значение "9". Это связано с тем, что операция ++ перемещает указатель на одну "единицу" вперед в памяти.

Проблема возникает из-за недостатков в системе проверки типов C/С++ (С++ должен поддерживать совместимость с C, поэтому он допускает те же проблемы). Указатель сохраняет адрес в памяти, а операция ++ добавляет соответствующее количество байтов в адрес. Во многих системах ++ing int добавляет четыре байта, но если указатель был указателем char ++ ing, он должен добавлять только один байт. Обратите внимание, что поскольку базовый тип данных указателя - это адрес в памяти, следующий закон (но не рекомендуется):

char* charPointer = squares;
charPointer++;

void* voidPointer = squares;
voidPointer++;

Поскольку указатели являются адресами в памяти, они могут представлять (правильно) любой бит памяти в компьютере, но они только правильно разыменовываются, когда базовые данные улавливают тип и выравнивание указателя. Для указателей, которые не управляются множеством кода, чтобы сделать их безопасными, это означает, что вы можете отклонить тип данных (или выравнивание) желаемой информации, а разыменование может закончиться катастрофой. Попытка исправить эту проблему с помощью настраиваемого кода имеет тенденцию замедлять работу одного указателя настолько сильно, что вы заметили проблемы с производительностью, и он открывает двери для добавления ошибок в пользовательский код управления "указателем".

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

Большое преимущество Java, использующего ссылки, заключается в том, что память может перемещаться без нарушения потенциальных адресов указателей. В программе C, если вы перемещаете данные в новую ячейку памяти, очень сложно определить, имеет ли какая-либо другая часть программы указатель на данные. Если вычеркнутый указатель будет разыменован после перемещения памяти, программа будет получать доступ к поврежденным данным, и, как правило, сбой будет иметь недостаток.

Возможность перемещения памяти в запущенной программе позволяет программам легко перерабатывать память. Любая программа, которая не нуждается в кусках памяти, может освободить неиспользуемую память, но это создает отверстия памяти неиспользуемой памяти между кусками используемой памяти. Внутренние компьютеры используют страницы памяти, которые довольно большие. Если редко используемая страница памяти может содержать несколько использованных битов, перемещенных на другую страницу, тогда можно освободить страницу памяти. Это увеличивает плотность данных в памяти, улучшая производительность кеша. Иногда это приводит к улучшению производительности, что может быть весьма драматичным.

Java Garbage Collector использует использование ссылок, временно блокируя доступ к данным для набора ссылок. Во время этой блокировки доступа он перемещает данные вокруг (чтобы сжать его). После блокировки ссылка на таблицу адресов содержит новые адреса памяти. Поскольку "функциональный" уровень кода никогда не знал адресов в первую очередь, эта операция не нарушит выполняющуюся Java-программу.

Ответ 3

В Java есть указатели в смысле переменных, которые хранят ссылки на данные в памяти. Все переменные типов объектов в Java являются указателями в этом смысле.

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

Ответ 4

new делает (примерно) следующее:

  • Найдите смежный свободный блок памяти кучи, равный размеру экземпляра создаваемого класса, плюс некоторое пространство для ведения бухгалтерского учета.
  • Нулевое пространство и удалить его из бесплатного списка
  • Запустите конструктор
  • Вернуть ссылку (не указатель, как объяснили другие сообщения) созданному экземпляру.

Ответ 5

java.lang.NullPointerException

Люди сказали мне, что "у него нет указателей" в интервью. Я обычно давал им некоторый код Java и позволял им объяснять, что происходит в этом коде:

public class TestPointers {

    public static void main(String args[]) {
        Object p1, p2;
        p1 = new Object();
        p2 = p1;
        p1 = null;
        System.out.println(p2);
    }
}

Ответ 6

В Java есть указатели, которые известны под названием " ссылка".

Когда люди говорят, что "Java не имеет указателей", они, как правило, путают концепцию указателя с конкретной реализацией и способностями указателей, найденных на языках C и C.

В частности:

  • Ссылки Java не могут быть установлены на произвольный адрес. Также не могут (стандартные) указатели Pascal или Fortran.
  • Ссылки на Java не могут указывать на переменную. Также не могут (стандартные) указатели Паскаля.
  • Ссылки на Java не поддерживают арифметику указателей. Также не указатели Паскаля и Фортрана
  • Ссылки на Java не могут указывать на части объекта (например, третий элемент массива). Также не могут указатели Паскаля.

Кроме того, вопреки распространенному мнению, указатель не обязательно является адресом. Указатель обычно реализуется как адрес, но нет необходимости делать это, даже не на C или С++.

Ответ 7

Java имеет ссылки. Доступ ко всем объектам осуществляется путем ссылки на их экземпляры. Вы создаете новый экземпляр с помощью new, который возвращает ссылку на объект.

Ссылки на Java не похожи на указатели на C, вы не можете "смотреть под капотом" в необработанной памяти, которая составляет объект.

Ответ 8

new в Java возвращает ссылку для вновь созданного объекта.

Ответ 9

новый возврат ссылка. он имеет некоторые сходства с указателями (если вы переходите к функции, передается ссылка, то же, что и с указателем), но нет арифметики указателей.

Ответ 10

Java не имеет указателей. Оператор "новый" используется для ссылочной переменной в java.

Ответ 11

Java не поддерживает и не разрешает указатели. (Или более правильно, Java не поддерживает указатели, которые могут быть доступны и/или изменены программистом.) Java не может разрешать указатели, потому что это позволит Java-апплетам нарушать межсетевой экран между средой выполнения Java и хост-компьютером. (Помните, что указателю может быть присвоен любой адрес в памяти - даже адреса, которые могут находиться за пределами системы времени выполнения Java.)

Ответ 12

В Java мы встречаем определенные ключевые слова, используемые в качестве ссылки, например, this ключевое слово используется для ссылки на переменные того же класса. Оператор new используется как ссылка на объект.