73 / 73 / 12
Регистрация: 22.01.2013
Сообщений: 231
1

java и указатели

26.02.2013, 18:53. Показов 25367. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Сегодня спорили с одногруппником по теме java и указатели. Он говорит, что в java указателей просто не существует, а я говорит что они все-таки существуют, только в несколько ограниченной форме. Так кто из нас прав? Если можно дайте ссылку на эту тему.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.02.2013, 18:53
Ответы с готовыми решениями:

Существуют ли в Java указатели?
В C++ есть *, в C# есть ref, а в Java есть указатели или что-то подобное? Облазил интернет и ничего...

Указатели в С++ и Java.
Добрый вечер! Сейчас изучаю джаву и как оказалось, я все это время и С++ не знала. В литературе...

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно....

В matlab есть указатели на переменные или что-нибудь похожее на указатели?
Здравствуйте, в matlab есть указатели на переменные? или что-нибудь похожее на указатели? нужно...

6
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
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
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от canopen Посмотреть сообщение
Это просто вопрос терминологии - что считать "указателем". Если вы считаете что ссылки в C++ - это указатели в несколько ограниченной форме, то да, существуют. Потому что объекты в Java - это примерно те же самые ссылки из C++.
Именно так. В Java нет арифметики - к "указателю" нельзя прибавить число и получить другой указатель (в C++ можно, если я правильно помню). В java нельзя получить указатель на область памяти и трактовать его как разные типы данных - хочу как объект, а хочу как набор байтов.

Любая объектная переменная в памяти - это 4 байта (а на 64 битах сколько? Что-то вдруг понял, что не могу сказать точно) ссылки на область памяти, где лежит объект. Когда объект передается в метод, на самом деле во фрейм вызова в стеке копируется значение ссылки. Т.е. объект передается не по значению и изнутри метода его внутреннее состояние можно менять через ссылку (если объект это сам позволяет).

А вот если создать внутри метода новый объект и присвоить тому же параметру метода - тогда перетрется ссылка на объект во фрейме вызова. А исходная ссылка остается неизменной. Это порождает некоторое непонимание, особенно когда человек считает, что передал строку по ссылке, внутри метода изменил - присвоил новую! - а снаружи ничего не поменялось. А суть в том, что при вызове именно копируется значение, а не передается ссылка на переменную, как это можно сделать в том же С++.

В общем, как правильно было сказано, это вопрос терминологии.
5
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
27.02.2013, 13:45 5
Цитата Сообщение от Skipy Посмотреть сообщение
внутри метода изменил - присвоил новую! - а снаружи ничего не поменялось.
тут надо уточнять что только у имутабельных объектов, у мутабельных все изменяется наружу.
Иногда это даже создаёт проблему сбежавшей ссылки на внутренний объект
ну или выделить слово присвоил
2
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
27.02.2013, 15:58 6
Цитата Сообщение от mutagen Посмотреть сообщение
тут надо уточнять что только у имутабельных объектов, у мутабельных все изменяется наружу.
Я имел в виду вот это:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void method1(){
    MyObject o = new MyObject();
    o.i = 10;
    method2(o);
    System.out.println(o.i);
}
 
public void method2(MyObject o){
    o = new MyObject();
    o.i = 1;
}
 
public class MyObject{
 
    public int i;
 
}
Вот в этом случае изменения в методе method2 наружу не вылезут, даже если объект изменяемый. Просто потому, что ссылка o внутри метода перетерта новым значением.
1
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
28.02.2013, 16:27 7
Цитата Сообщение от Skipy Посмотреть сообщение
Любая объектная переменная в памяти - это 4 байта (а на 64 битах сколько? Что-то вдруг понял, что не могу сказать точно)
Сам засомневался, сам и отвечаю. На 64-битной JVM размер ссылки 64 бита, т.е. 8 байтов. Однако есть такая опция у Oracle JVM - -XX:+UseCompressedOops, которая позволяет оптимизировать этот размер и сжимать ссылки на уровне JVM. Вот тут об этом написано: CompressedOop.
1
28.02.2013, 16:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.02.2013, 16:27
Помогаю со студенческими работами здесь

Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей?
Доброго времени суток! Задался теоретическим вопросом. Читал пример из книги Лафоре...

Через указатели на указатели посчитать сумму двух чисел и записать в третье
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать...

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

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов?
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;//...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru