2014-09-26 1 views
3

Этот запрос размещен в основном понимают пункты, какКак массив работает внутри Java?

  • Объект является экземпляром класса или массив;

  • Массив - это подкласс класса Object;

  • Все, что является экземпляром, отличным от примитива, является объектом Java.

Вот мое понимание работы с массивами на Java.

Учитывая приведенную ниже программу,

/* dummy.java */ 
class C { 
    private int i; 
    public C() { 
     i = 1; 
     System.out.println("Am in constructor"); 
    } 
} 
public class dummy { 
    public static void main(String[] args) { 
     C[] c = new C[2]; // Line 11 
     c[0] = new C(); 
     System.out.println(c); 
    } 
} 

Объект типа class [LC создается в время выполнения после запуска,

C[] c = new C[2]; //Line 11 

В приведенном выше коде. class [LC является непосредственным подклассом класса Object. Эталонная переменная c указывает на этот объект (показано на красной границе ниже) после запуска Line 12 в вышеуказанном коде. Контрольные переменные располагаются в стеке, и объект типа class C будет находиться в куче.

enter image description here

Для изменения ниже line 11 & 12 в приведенном выше коде

C[][] c = new C[2][2]; 
c[0][0] = new C(); 

сделает представление, как показано ниже.

enter image description here

ли мое понимание правильно? Если да, можете ли вы объяснить больше об использовании class [LC во время выполнения для создания объекта?

Примечание: C[].class дает фактический тип во время выполнения, который составляет class [LC.

+5

Почти правильно. Однако экземпляр C не является частью массива (в соответствии с тем, что подразумевает ваша красная граница). –

+0

Что вы надеетесь извлечь из этого? Почему ты хочешь знать. Это может помочь кому-то дать вам лучший ответ. – BillR

+0

Есть также сведения о том, что память для массива будет содержать размер массива, тип, и он может быть не смежным. –

ответ

1

Чтобы ответить на ваш вопрос: да, на Java (и C#) почти все разбито на несколько дискретных фрагментов памяти, к которым обращаются указатели. Это не только ваш двумерный массив, но и любой встроенный объект внутри вашего объекта C. В C++, если у вас есть массив (одномерный или нет) из 10 объектов, и каждый из этих объектов содержит 10 внедренных объектов, вы можете выделить все это с помощью один кусок памяти. В C# и Java у вас будет как минимум 101 выделение памяти для хранения всего этого (если все внедренные объекты являются простыми объектами) в случае мономерного массива и т. Д. В случае многомерного массива.

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

+0

«class [LC] реализует какой-либо интерфейс? Если да, то дайте мне знать имя или определение этого интерфейса. – overexchange

+0

Насколько мне известно. Вы не можете создать объект, который будет эмулировать массив изначально. – SylvainL

+0

Когда мы говорим, что ссылочная переменная 'c' указывает на экземпляр' class [LC' после выполнения 'C [] c = new C [2]'. Создается ли конструктор класса [LC] для создания экземпляра? – overexchange

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