2013-11-17 2 views
1

Я новичок в java и смущен.Есть ли у Java указатели? если да, как им манипулировать?

Есть ли у Java указатели? если да, как ими управлять? как выполнять операции, такие как ptr ++ и т. д.?

+0

Вы не можете напрямую взаимодействовать – subash

+1

Все, кроме примитивов (integer, float и т. Д.), Являются ссылками, они ведут себя аналогично указателям на C++, но не идентичны; самое важное отличие состоит в том, что большую часть времени вам не нужно беспокоиться о том, что они ссылаются на –

+0

Вы можете делать это с помощью Unsafe, но не должны, если вы не рассмотрели возможность использования естественной Java. Можете ли вы объяснить, что вы пытаетесь сделать, как более вероятно, вам не нужны указатели. –

ответ

3

Да, у java есть указатели, и они называют их ссылок. Но эта ссылка не возможна в java. То есть вы не можете делать ref ++ и тому подобное. Вы можете просто выделить память для объекта и присвоить его ссылке, де-распределение тоже выполняется сборщиком мусора в JVM. Таким образом, вы свободны от бесплатно.

1

У вас нет указателей, или, по крайней мере, не так, как вы привыкли к thed из C/C++/безотносительно. У вас есть ссылки на объекты вместо этого, но вы не можете найти ++ тех.

0

Следующие примеры указатели, установленные в зарезервированной памяти:

Object o = new Object(); 
int[] myInts = new int[32]; 

Вы можете манипулировать указатели, как это:

Object myObject = otherObject; 

... если матч оба типа.

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

3

Java нет указателей, но вы можете сделать указатель манипуляции с sun.misc.Unsafe: Java Magic. Part 4: sun.misc.Unsafe:

static Object shallowCopy(Object obj) { 
    long size = sizeOf(obj); 
    long start = toAddress(obj); 
    long address = getUnsafe().allocateMemory(size); 
    getUnsafe().copyMemory(start, address, size); 
    return fromAddress(address); 
} 

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

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