73 / 73 / 12
Регистрация: 22.01.2013
Сообщений: 231
|
|
1 | |
java и указатели26.02.2013, 18:53. Показов 25367. Ответов 6
Метки нет (Все метки)
Сегодня спорили с одногруппником по теме java и указатели. Он говорит, что в java указателей просто не существует, а я говорит что они все-таки существуют, только в несколько ограниченной форме. Так кто из нас прав? Если можно дайте ссылку на эту тему.
0
|
26.02.2013, 18:53 | |
Ответы с готовыми решениями:
6
Существуют ли в Java указатели? Указатели в С++ и Java. Указатели и указатели на указатели, а также типы данных В matlab есть указатели на переменные или что-нибудь похожее на указатели? |
26.02.2013, 19:36 | 2 |
в java все передается по значению - поэтому указателей нет.
С примитивами так и происходит. НО - значение объекта это ссылка на память где он лежит, то есть неявно это как бы указатель. решайте сами кто прав
2
|
430 / 431 / 93
Регистрация: 16.07.2012
Сообщений: 886
|
|
26.02.2013, 19:36 | 3 |
Это просто вопрос терминологии - что считать "указателем". Если вы считаете что ссылки в C++ - это указатели в несколько ограниченной форме, то да, существуют. Потому что объекты в Java - это примерно те же самые ссылки из C++.
2
|
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
|
|
27.02.2013, 12:57 | 4 |
Сообщение было отмечено как решение
Решение
Именно так. В Java нет арифметики - к "указателю" нельзя прибавить число и получить другой указатель (в C++ можно, если я правильно помню). В java нельзя получить указатель на область памяти и трактовать его как разные типы данных - хочу как объект, а хочу как набор байтов.
Любая объектная переменная в памяти - это 4 байта (а на 64 битах сколько? Что-то вдруг понял, что не могу сказать точно) ссылки на область памяти, где лежит объект. Когда объект передается в метод, на самом деле во фрейм вызова в стеке копируется значение ссылки. Т.е. объект передается не по значению и изнутри метода его внутреннее состояние можно менять через ссылку (если объект это сам позволяет). А вот если создать внутри метода новый объект и присвоить тому же параметру метода - тогда перетрется ссылка на объект во фрейме вызова. А исходная ссылка остается неизменной. Это порождает некоторое непонимание, особенно когда человек считает, что передал строку по ссылке, внутри метода изменил - присвоил новую! - а снаружи ничего не поменялось. А суть в том, что при вызове именно копируется значение, а не передается ссылка на переменную, как это можно сделать в том же С++. В общем, как правильно было сказано, это вопрос терминологии.
5
|
27.02.2013, 13:45 | 5 |
тут надо уточнять что только у имутабельных объектов, у мутабельных все изменяется наружу.
Иногда это даже создаёт проблему сбежавшей ссылки на внутренний объект ну или выделить слово присвоил
2
|
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
|
||||||
27.02.2013, 15:58 | 6 | |||||
Я имел в виду вот это:
1
|
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
|
|
28.02.2013, 16:27 | 7 |
Сам засомневался, сам и отвечаю. На 64-битной JVM размер ссылки 64 бита, т.е. 8 байтов. Однако есть такая опция у Oracle JVM - -XX:+UseCompressedOops, которая позволяет оптимизировать этот размер и сжимать ссылки на уровне JVM. Вот тут об этом написано: CompressedOop.
1
|
28.02.2013, 16:27 | |
28.02.2013, 16:27 | |
Помогаю со студенческими работами здесь
7
Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей? Через указатели на указатели посчитать сумму двух чисел и записать в третье Используя нетипизированные указатели и указатели на подпрограммы обобщить сортировку пузырьком Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |