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

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

Указание инициализации

Читайте также:
  1. Бывает, что нужно найти изображение по строго заданным параметрам – с указанием того, что и как будет на нем размещено.
  2. Список видов работ, с указанием сроков выполнения инцидентов
  3. Сроки, определяемые указанием на событие, которое должно на-
  4. Схема одноступенчатого центробежного насоса с указанием деталей.
  5. Целеуказание

Что произойдет, если вы захотите присвоить переменной начальное значение? Один прямой способ сделать это - это просто присвоить значение в точке определения переменной в классе. (Обратите внимание, что вы не можете сделать это в C++, хотя C++ всегда пробует все новое.) Вот определение полей в классе Measurement, который изменен для обеспечения начальных значений:

class Measurement { boolean b = true; char c = 'x'; byte B = 47; short s = 0xff; int i = 999; long l = 1; float f = 3.14f; double d = 3.14159; //. . .

Вы также можете инициализировать не примитивные объекты таким же способом. Если Depth - это класс, вы можете вставить переменную и инициализировать ее следующим образом:

class Measurement { Depth o = new Depth(); boolean b = true; // . . .

Если вы не передадите o начальное значение и, тем не менее, попробуете использовать ее, вы получите ошибку времени выполнения, называемую исключением (это описано в Главе 10).

Вы даже можете вызвать метод для обеспечения начального значения:

class CInit { int i = f(); //...}

Конечно, этот метод может иметь аргументы, но эти аргументы не могут быть другими членами класса, которые еще не инициализированы. Таким образом, вы можете сделать так:

class CInit { int i = f(); int j = g(i); //...}

Но вы не можете сделать этого:

class CInit { int j = g(i); int i = f(); //...}

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

Такой подход к инициализации прост и понятен. Он имеет ограничения в том, что каждый объект типа Measurement будет иметь одни и те же начальные значения. Иногда это именно то, что вам нужно, но в другое время вам нужна большая гибкость.

Инициализация в конструкторе

Конструктор может быть использован для выполнения инициализации и это даст вам отличную гибкость вашим программам, так как вы можете вызывать методы и выполнять действия во время выполнения для определения начальных значений. Но одно вы должны иметь в виду: вы не препятствуете автоматической инициализации, которая происходит перед входом в конструктор. Так, например, если вы скажете:

class Counter { int i; Counter() { i = 7; } // . . .

то iсначала будет инициализирована 0, а затем 7. Это верно для всех примитивных типов и для ссылок на объекты, включая те, которые имеют явную инициализацию в точке определения. По этой причине компилятор не пробует ограничить вас в инициализации элементов в любом месте конструктора, или перед тем, как они будут использоваться — инициализация гарантирована [30].


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

Руководство по операторам | Итерации | Break и continue | Детали расчета | Упражнения | Гарантированная инициализация при использовании конструктора | Перегрузка методов | Перегрузка с помощью примитивных типов | Очистка: финализация и сборщик мусора | Инициализация массива |


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