3.4 Перегрузка метода (часть 2)

3.4.2 Объектная инициализация

Объект - кусок памяти, связанный кодом. В памяти поддерживается состояние объекта (значения переменных его образца), которое может изменяться после его создания. Чтобы использовать недавно созданный объект, его распределённая память должна быть инициализирована в надлежащее начальное состояние. Здесь мы применяем глубокие механизмы Java для управления объектной инициализацией.

В начале создания объекта, виртуальная машина Java (JVM) распределяет достаточно памяти в динамической области памяти, чтобы разместить переменные образца объекта. Когда память распределена, то в ней могут содержаться различные типы данных. Если бы не было первоначальной инициализации, поведение объекта было бы непредсказуемо. Для предотвращения такого сценария, Java делает возможным инициализировать память к не менее предсказуемым значениям по умолчанию, прежде чем использоваться любым кодом. Инициализация важна, потому что, исторически, неинициализированные данные были общим источником ошибок. Ошибки, вызванные неинициализированными данными, происходят регулярно в С, например, потому что там не имеется встроенных механизмов, чтобы прописать надлежащую инициализацию данных. Программисты на С не должны забывать инициализировать данные после их распределения и использования. Язык Java, по сравнению с С, имеет встроенные механизмы, которые помогают нам гарантировать надлежащую инициализацию памяти, занятой недавно созданным объектом. С надлежащим использованием этих механизмов, мы можем предотвратить создание нашего объекта с недопустимым начальным состоянием.

Язык Java имеет три механизма, специализированные обеспечивать надлежащую инициализацию объектов: инициализаторы образца (также называемые блоками инициализации образца), инициализаторы переменной образца, и конструкторы. (Инициализаторы образца и инициализаторы переменной образца все вместе называют «инициализаторами».) Все три механизма приводят к коду Java, который выполняется автоматически, когда создаётся объект. Когда мы распределяем память для нового объекта с новым оператором, виртуальная машина Java обеспечивает, чтобы код инициализации был выполнен прежде, чем мы могли бы использовать недавно распределенную память. Если мы проектируем наши классы так, что инициализаторы и конструкторы всегда производят правильное состояние для недавно созданных объектов, то нет надобности для того, чтобы создавать и использовать объект, который должным образом не инициализирован.

Значения присвоенные по умолчанию
Если мы не обеспечиваем никакой явной инициализации переменным образца, то они будут инициализированы с заранее заданными значениями по умолчанию, которые основаны только на типе переменной. Таблица 1 показывает значения по умолчанию, показывает значения для каждой из типов переменной. (Это заданные по умолчанию начальные значения и для переменных класса и для образца. Частным переменным не даются заданные по умолчанию начальные значения. Прежде, чем использовать такие переменные, сначала их нужно явно инициализировать.)

Таблица 1: Значения по умолчанию для полей

Если мы явно не инициализируем переменную образца, то переменная сохранит ее заданное по умолчанию начальное значение. Например, вот - класс, названный CoffeeCup, чье поле innerCoffee явно не инициализировано (нет никаких конструкторов или инициализаторов в классе):
        // This class has no constructors or initializers class CoffeeCup
        {
        private int innerCoffee;
        // ...
}


Обратите внимание, что это означает то, что если мы явно инициализируем innerCoffee, присваиваем значение 100, затем когда создаётся каждый объект CoffeeCup, innerCoffee будет, в действительности, инициализировано дважды. Сначала, innerCoffee будет даваться заданное по умолчанию начальное значение - нуль. Позже, нуль будет записан поверх с надлежащим начальным значением 100. Все это имеет место, в то время как виртуальная машина Java создает новый объект - прежде, чем возвращается ссылка на новый объект. К тому времени, когда будет возвращена ссылка на новый объект CoffeeCup из нового оператора, в поле innerCoffee будет установлено 100.

3.4.3 Функция перегрузки конструктора

Функция перегрузки конструктора подобна перегрузке методов. Если мы создаем класс, на базе которого создаются объекты, Java автоматически определяет конструктор, но, если мы создаем наш собственный конструктор, автоматически созданный конструктор сразу исчезает. Как и другие методы, мы можем перезагружать конструкторы. Перегрузка конструкторов обеспечивает способ создания объектов с или без начальных параметров, в зависимости от необходимости.

Давайте рассмотрим пример перегрузки конструктор;
Пример 7:
public class PassTest
{
PassTest()
    {
System.out.println ( Constructor with no arguments );
    }

PassTest(int x)
    {
System.out.println( Constructor with one parameter );
    }
public static void main(String args[])
    {
new PassTest ();
PassTest test = new PassTest(10);
    }
}


Вывод вышеупомянутой программы:
Рисунок 3.10: Вывод

В примере выше, запись new PassTest () вызывает функцию конструктора без параметров а инструкция PassTest test = new PassTest (10) вызывает функцию конструктора с одним параметром.

3.4.4 Функция конструктора заданная по умолчанию

Что происходит, если в классе отсутствует конструктор?

Всякий раз при создании объекта вызывается метод конструктора. Если класс не имеет никакого метода конструктора, то компилятор обеспечивает конструктор по умолчанию для данного класса. Но в данном случае не устанавливается набор параметров для работы с объектом.

Приведём следующие начальные значения, назначенные по умолчанию конструктором.
Переменная типа Integer      - 0
Переменная типа Float         - 0.0
Переменная типа String         -null
Переменная типа Boolean   - false

Например:
      class MyClass()
      {
// this is my class
      }
      может интерпретироваться как:
      class MyClass()
      {
MyClass ()
        {
// this is the implied constructor
        }
// this is my class
      }


Этот конструктор будет вызываться, когда будет выполнен следующий код:
MyClass testClass = new MyClass();

Однако, если мы объявляем конструктор по умолчанию, то конструктор по умолчанию, который добавляет Java по умолчанию больше не используется.

назад к оглавлению вперед

Rus. Open Source company, г. Саратов
ул. Орджоникидзе, 156, офис 203
тел: 8 (8452) 57-84-41
e-mail: info@rus_opensource.com

Главная | Обзоры | О разном
Карта сайта

Учебная литература:

Введение в Linux
Основы JAVA
Архивы

© 2013 opensourcerules.net