2012-05-28 2 views
3

Я знаю, что Java не позволяет указателям a la C++. Тем не менее, я слышал что-то о ссылках (по-видимому, похоже на C++). Мой вопрос относится к следующей проблеме:Справочные переменные Java

У меня есть класс «А», скажем, куча которого я создаю (используя новый) в памяти, и я хочу «связать» эти классы друг с другом в зависимости от того, как Я выбираю. В C++ у меня просто есть вектор (определенный в классе A) указателей класса A, к которому я добавляю указатели к экземплярам класса A, к которым я хочу установить ссылку. Это в основном как создание всенаправленного графика в памяти (или однонаправленного в зависимости от того, как я строю ссылки)

Мой вопрос: могу ли я сделать это на Java в элегантном стиле и как? Я предполагаю, что это связано со ссылками. Указатели кажутся таким простым решением этой проблемы, но я новичок в Java и учась делать такие вещи без указателей. Я не уверен, как определить ссылку. В C++ я бы использовал A * mypointer = new A();

Спасибо,

+1

В C нет векторов и нет 'новых'. Вы думаете о C++. В Java все (кроме встроенных типов) имеют ссылочную семантику. –

+1

В java вы сделаете все одинаково, но вы не станете немного «*» перед классами, которые вы связываете. – jahroy

+2

В Java вы передаете копии ссылок на методы, а не ссылки. Если бы это были ссылки на них, вы могли бы изменить их в методе, который есть, что ссылка на C++, не так ли? –

ответ

5
import java.util.List; 
import java.util.ArrayList; 

class FunkyObject 
{ 
    /** a list of other FunkyObject that this object is linked to */ 

    List<FunkyObject> referenceList = new ArrayList<FunkyObject>(); 

    /** creates a link between this object and someObject */ 

    public addRefrerence(FunkyObject someObject) 
    { 
     referenceList.add(a); 
    } 
} 
1
public class A { 

    private A[] refs; 

    public A(A... refs) { 
     this.refs = refs; 
    } 
} 
+0

'В CI есть только вектор (определенный в классе A) указателей класса A, к которому я добавляю указатели к экземплярам класса AI, к которым нужно подключиться. Звучит немного как добавление, не зная до того, насколько велика коллекция, поэтому мне кажется, что здесь не подходит подходящий выбор. –

+0

Вот почему я предлагаю список в своем ответе, но независимо от того, используете ли вы массив или список, не имеет значения. – jahroy

+0

Да, количество ссылок не определено, поэтому в C++ я бы использовал какой-то неограниченный контейнер, такой как список. – Antinous

0

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

Что касается хранения ссылок на несколько экземпляров A, у вас есть много вариантов. Вы можете использовать List, например ArrayList или любой другой класс Collection. Это действительно зависит от того, как вам нужно получить к ним доступ. Просматривайте через пакет java.util для всех коллекций.

+1

Я думаю, что он делает несправедливость, чтобы сказать, что «[объект] ссылки являются указателями без арифметики» ... –

+0

@pst - Вы можете быть более конкретным. Кто-то, кто понимает C-указатели, очень хорошо поймет ссылки на Java, так как они похожи. –

+0

@pst [Лестница Витгенштейна] (https://en.wikipedia.org/wiki/Lie-to-children). Если целью этого вопроса было бы объяснить разницу между Java и C, «несправедливость» была бы актуальной. В целях объяснения того, как делать то, что вы хотите сделать на Java, может быть полезно использовать более простую, «достаточно близкую» метафору. (Тем не менее, в этом случае «отсутствие арифметики указателя» не является ИМО существенным различием, как и добавленным в редактировании.) – millimoose

0

То, что вы описали во втором абзаце, в значительной степени похоже на то, как работает модель Java. (Это также единственный способ, с помощью которого он работает.) Когда в учебниках Java говорится, что «Java - это пропускная способность», значения, которые они имеют в виду, являются примитивными типами, а объект обрабатывает. То есть, когда вы передаете значение, типичное для объекта, объект не копируется. (Я считаю, что это то же поведение, что и передача указателя на структуру вокруг в C.)

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

0

Спасибо за вашу помощь - это было очень полезно. Кажется, ссылки предоставляют элегантное решение, которое я искал, какие указатели предлагают в C/C++. Единственное главное отличие, которое я вижу до сих пор (без фактического внедрения), состоит в том, что мы не можем выполнять арифметику по ссылкам.

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