Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Массивы - первоклассные объекты

Читайте также:
  1. RAID массивы. История создания RAID массивов. Основные преимущества и недостатки RAID массивов всех уровней. Принципы работы.
  2. Введение в объекты
  3. Взаимозаменяемые объекты с полиморфизмом
  4. ВОПРОС 41. - ОБЪЕКТЫ ПРИВАТИЗАЦИИ И ИХ КЛАССИФИКАЦИЯ.
  5. Выставляемые объекты
  6. ГЛАВА 1. КРИМИНАЛИСТИКА КАК НАУКА И УЧЕБНАЯ ДИСЦИПЛИНА. ПРЕДМЕТ, ОБЪЕКТЫ И СИСТЕМА КРИМИНАЛИСТИКИ
  7. Группируем объекты
  8. Документы как объекты криминалистических исследований и их следственный осмотр.
  9. Другие объекты за пределами городищ
  10. И объекты розыскной и поисковой деятельности следователя

Независимо от типа массива, с которым вы работаете, идентификатор массива на самом деле указывает на действительные объекты, создаваемые в куче. Это объект, который содержит ссылки на другие объекты, и он может быть создан либо косвенным образом, как часть синтаксиса инициализации массива, либо явно с помощью выражения new. Частью объекта массива (фактически, только поле или метод, к которому вы можете получить доступ) является член length с доступом только для чтения, который говорит вам, сколько элементов можно хранить в объекте массива. Синтаксис ‘ [] ’ - это просто способ доступа, который вы имеете к объекту массива.

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

//: c09:ArraySize.java// Инициализация & пере присвоение массивов. class Weeble {} // Немного мистическое создание public class ArraySize { public static void main(String[] args) { // Массивы объектов: Weeble[] a; // Null - ссылки Weeble[] b = new Weeble[5]; // Null - ссылки Weeble[] c = new Weeble[4]; for(int i = 0; i < c.length; i++) c[i] = new Weeble(); // Групповая инициализация: Weeble[] d = { new Weeble(), new Weeble(), new Weeble() }; // Динамическая групповая инициализация: a = new Weeble[] { new Weeble(), new Weeble() }; System.out.println("a.length=" + a.length); System.out.println("b.length = " + b.length); // Ссылки внутри массива автоматически // инициализируются значением null: for(int i = 0; i < b.length; i++) System.out.println("b[" + i + "]=" + b[i]); System.out.println("c.length = " + c.length); System.out.println("d.length = " + d.length); a = d; System.out.println("a.length = " + a.length); // Массив примитивов: int[] e; // Null - ссылка int[] f = new int[5]; int[] g = new int[4]; for(int i = 0; i < g.length; i++) g[i] = i*i; int[] h = { 11, 47, 93 }; // Ошибка компиляции: переменная e не инициализирована //!System.out.println("e.length=" + e.length); System.out.println("f.length = " + f.length); // Примитивы внутри массива // автоматически инициализируются нулем: for(int i = 0; i < f.length; i++) System.out.println("f[" + i + "]=" + f[i]); System.out.println("g.length = " + g.length); System.out.println("h.length = " + h.length); e = h; System.out.println("e.length = " + e.length); e = new int[] { 1, 2 }; System.out.println("e.length = " + e.length); }} ///:~

Вот что программа выдает на выходе:

b.length = 5b[0]=nullb[1]=nullb[2]=nullb[3]=nullb[4]=nullc.length = 4d.length = 3a.length = 3a.length = 2f.length = 5f[0]=0f[1]=0f[2]=0f[3]=0f[4]=0g.length = 4h.length = 3e.length = 3e.length = 2

Массив a изначально это просто null -ссылка, и компилятор предохраняет вас от работы с этой ссылкой, пока вы правильно не инициализируете ее. Массив b инициализирован и указывает на массив ссылок Weeble, но никакие реальные объекты не помещаются в этот массив. Однако вы все равно спросить размер массива, так как b указывает на допустимый объект. Здесь мы получаем небольшой недостаток: вы не можете определить, сколько элементов на самом деле есть в массиве, так как length говорит нам о том, сколько элементов могут быть помещены в массив; то есть, размер массива объектов - это не число элементов реально хранящихся в нем. Однако когда создается массив объектов, его ссылки автоматически инициализируются значением null, так что вы можете проверить, имеется ли в определенной ячейке массива объект, просто проверив ее на null. Аналогично массив примитивов автоматически инициализируется нулями для числовых типов: (char)0 для char и false для boolean.

Массив c показывает создание массива объектов, за которым следует присвоение объектов Weeble для всех ячеек массива. Массив d показывает синтаксис “групповой инициализации”, которая является причиной того, что массив объектов создается (косвенным образом с помощью new в куче, так же как и массив c) и инициализируется объектами Weeble, и все это в одной инструкции.

О следующей инициализации массива можно думать, как о “динамической групповой инициализации”. Групповая инициализация, использованная для d, должна использоваться в точке определения d, но со вторым синтаксисом вы можете создавать и инициализировать объекты где угодно. Например, предположим, есть метод hide(), который принимает массив объектов Weeble. Вы можете вызвать его, сказав:

hide(d);

но вы можете также динамически создать массив, который вы хотите передать в качестве аргумента:

hide(new Weeble[] { new Weeble(), new Weeble() });

В некоторых ситуациях этот новый синтаксис обеспечивает более удобный способ для написания кода.

Выражение:

a = d;

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

Вторая часть ArraySize.java показывает, что массив примитивов работает точно так же, как и массив объектов, за исключением того, что массив примитивов содержит значения примитивов напрямую.




Дата добавления: 2015-09-11; просмотров: 28 | Поможем написать вашу работу | Нарушение авторских прав

Внутренние классы | Внутренний класс и приведение к базовому типу | Внутренние классы в методе и контексте | Анонимный внутренний класс | Связь с внешним классом | Static внутренние классы | Зачем внутренние классы? | Замыкания & обратные вызовы | Внутренние классы и структуры управления | Упражнения |


lektsii.net - Лекции.Нет - 2014-2024 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав