Создание и инициализация на языке Java

Основное различие между С++ и Java состоит в том, что Java использует автоматическую сборку мусора. Все переменные типа “объект” в языке Java получают значение типа null. Объекты создаются оператором new. В отличии от С++ в Java всегда используются () в конструкторе.

Card a=new card(card.spade,5); // создать 5 пик.

Card b=new card();

Понятие конструктора аналогично С++, за исключением того, что не поддерживаются инициализаторы. В отличии от С++ конструкторы Java могут вызывать другие конструкторы того же объекта.
сlass newclass
{
newclass(int i) { }
newclass(int i,int j) { this(i); }
};

Деструкторов в Java нет, но есть функция finalize. Она автоматически вызывается системой, когда обнаруживается, что объект больше не используется. Память занятая объектом помечается как свободная. Не известно когда будет, если вообще будет вызван метод finalize. Поэтоу не стоит на него полагаться, но можно его использовать как средство оптимизации.

Резюме

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

  • Конструкторы и деструкторы не могут описываться как функции, возвращающие значение (даже типа void).
  • Конструкторы могут иметь аргументы. В качестве параметров могут быть элементы, получающие значения по умолчанию. Деструктор не имеет параметров.
  • Имя конструктора совпадает с именем класса. Имя деструктора - имя класса, которому предшествует символ ~.
  • Нельзя получить адрес конструктора или деструктора.
  • Если они явно не описаны, то конструкторы и деструкторы автоматически создаются компилятором.
  • Конструктор не может быть вызван как обычная функция. Дестуктор может быть вызван как обычная функция с указанием полного имени.

Int s(100), *ps=new Int(50);
s.~Int(); // явное разрушение s
this->~Int(); // Явное разрушение *this (may be error this=ps?)

  • Компилятор автоматически вставляетвызовы конструктора и деструктора при описании и уничтожении объекта.
  • Конструкторы могут быть и в закрытой, и в защищенной, и в открытой части класса. Если конструктор находится в закрытой части класса, то объект этого класса с использованием такого конструктора могут создавать только те, кто имеет доступ к закрытой части.
  • Деструктор автоматически вызывается компилятором:
    • при выходе из области видимости;
    • при создании временных объектов для преобразования в выражениях или для передачи функциям аргументов;
    • когда возвращенные функцией значения более не нужны
    • при выполнении операции delete для объектов, размещенных в динамической памяти.
  • Конструктор не может быть ни const, ни volatile, ни static, ни virtual.
  • Конструктор может быть вызван тремя эквивалентными способами (пользователю предоставляется право выбора):

Int good(100);
Int bad=Int(100);
Int ff=100;

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

class Int {
const int size;
public:
Int(int i): size(i) { }
};
Если у класса есть конструктор, то он вызывается всегда, когда создается объект класса. Если у класса есть деструктор, то он вызывается всегда, когда объект класса уничтожается. Объекты могут создаваться как:

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

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: