Конструктор
В языке Java существует такая конструкция как конструктор, который инициализирует объект непосредственно во время его создания. При создании объекта, то что пишется после ключевого слова new , это и есть конструктор:
Box myBox = new Box();
Добавим конструктор в класс Box сразу после переменных. Имя конструктора совпадает с именем класса, в котором он находится, а синтаксис аналогичен синтаксису метода. Конструкторы не имеют возвращаемого типа. Это объясняется тем, что неявно заданным возвращаемым типом конструктора класса является тип самого класса. В конструкторе мы устанавливаем значение 10 переменным класса:
public class Box < double width; double height; double depth; Box() < System.out.println("Конструирование объекта Вох"); width = 10; height = 10; depth = 10; >/** * Подсчитать объем коробки * * @return объем */ double getVolume() < return width * height * depth; >>
public class BoxDemo3 < public static void main(String[] args) < Box myBox1 = new Box(); Box myBox2 = new Box(); System.out.println("Объем: " + myBox1.getVolume()); System.out.println("Объем: " + myBox2.getVolume()); >>
2. Конструктор по умолчанию
Первые примеры класса Box не определяли конструктора класса, но все же мы имели возможность создавать объекты. Как так получалось? Дело в том, что если конструктор класса не определен явно, то в Java для класса создается конструктор по умолчанию. Конструктор по умолчанию инициализирует все переменные экземпляра устанавливаемыми по умолчанию значениями. Но как только в классе будет определен собственный конструктор, конструктор по умолчанию больше не используется. Можно сказать, что класс с конструктором по умолчанию выглядит так:
public class Box < double width; double height; double depth; Box() < >. >
3. Конструктор с параметрами
Конструктор так же как и метод может принимать на вход параметры. Такие конструкторы еще называются параметризованными.
Следующий пример объявляет конструктор с параметрами, на вход которого передаются три значения для инициализации трех переменных класса:
public class Box < double width; double height; double depth; /** * Конструктор класса Box * * @param w - щирина * @param h - высота * @param d - глубина */ Box(double w, double h, double d) < width = w; height = h; depth = d; >/** * Подсчитать объем коробки * * @return объем */ double getVolume() < return width * height * depth; >>
Посмотрим как изменилось создание объектов. Теперь в конструктор необходимо передать три значения для установки ширины, высоты и глубины. Этот конструктор можно использовать вместо метода setDim() для установки нужных значений уже при создании объекта, что более удобно. Обратите внимание на закомментированную строку — мы не можем создать объект используя конструктор по умолчанию, так как в классе мы определили свой конструктор:
public class BoxDemo4 < public static void main(String[] args) < Box myBox1 = new Box(10, 20, 15); Box myBox2 = new Box(3, 6, 9); //Не можем использовать конструктор по умолчанию //Box myBox3 = new Box(); System.out.println("Объем: " + myBox1.getVolume()); System.out.println("Объем: " + myBox2.getVolume()); >>
Для того чтобы закомментированная строка работала, просто добавим в класс Box еще один конструктор:
public class Box < double width; double height; double depth; /** * Конструктор класса Box * * @param w - щирина * @param h - высота * @param d - глубина */ Box(double w, double h, double d) < width = w; height = h; depth = d; >Box() < >/** * Подсчитать объем коробки * * @return объем */ double getVolume() < return width * height * depth; >>
Код конструктора должен заниматься только инициализацией объекта. Следует избегать вызовов из конструктора других методов, за исключением final . Метод может быть переопределен в подклассе и исказить процесс инициализации объекта.
- Процедурное и объектно-ориентированное программирование
- Принципы ООП
- Классы и объекты
- Ключевое слово this
- Перегрузка
- Стек и куча
- Передача объектов в методы
- Java varargs
- Рекурсия
- Сборщик мусора и метод finalize
- Наследование
- Ключевое слово super
- Модификаторы доступа
- Геттеры и сеттеры
- Переопределение методов
- Абстрактные классы и методы
- Ключевое слово final
- Задания
Конструктор
Конструктор — это специальный метод, который вызывается при создании нового объекта. Не всегда удобно инициализировать все переменные класса при создании его экземпляра. Иногда проще, чтобы какие-то значения были бы созданы по умолчанию при создании объекта. По сути конструктор нужен для автоматической инициализации переменных.
Конструктор инициализирует объект непосредственно во время создания. Имя конструктора совпадает с именем класса, включая регистр, а по синтаксису конструктор похож на метод без возвращаемого значения.
private int Cat(); // так выглядит метод по имени Cat Cat(); // так выглядит конструктор класса Cat
В отличие от метода, конструктор никогда ничего не возвращает.
Конструктор определяет действия, выполняемые при создании объекта класса, и является важной частью класса. Как правило, программисты стараются явно указать конструктор. Если явного конструктора нет, то Java автоматически создаст его для использования по умолчанию. Когда мы реализовывали класс Box, то никакого конструктора не создавали.
Добавим в класс конструктор, который просто установит начальные значения для коробки.
class Box < int width; // ширина коробки int height; // высота коробки int depth; // глубина коробки // Конструктор Box() < width = 10; height = 10; depth = 10; >// вычисляем объём коробки int getVolume() < return width * height * depth; >>
Мы временно удалили метод setDim() и добавили конструктор. Посмотрим, что получится:
Box catBox = new Box(); mInfoTextView.setText("Объём коробки: " + catBox.getVolume());
Программа выведет объём коробки, хотя мы не задавали никаких размеров для неё. Благодаря конструктору любая создаваемая коробка будет иметь какой-то зафиксированный объём.
Естественно, вы можете вернуть обратно метод setDim() (см. статью про классы) и установить свои размеры для коробки:
Box catBox = new Box(); // установим свои размеры для коробки catBox.setDim(10, 20, 30); mInfoTextView.setText("Объём коробки: " + catBox.getVolume());
Теперь вам должно быть ясно, что когда после ключевого слова new мы пишем имя класса со скобками, то на самом деле мы вызываем конструктор класса.
Возникает вопрос — но ведь сначала при создании класса мы не создавали конструктор, однако код new Box() работал. Дело в том, что если конструктор не определён явно, то Java создаст конструктор, который будет использоваться по умолчанию. В этом случае он просто присвоит всем переменным нулевые значения. Если вы создали сами конструктор, то конструктор по умолчанию использоваться не будет.
Подобно любому методу, у конструктора могут быть аргументы. В аргументах конструктора передаются параметры для инициализации объекта. Например, если у класса Cat имеется конструктор, который получает в качестве аргумента целое число, обозначающее возраст кота, то объекты Cat будут создаваться следующим образом:
Cat cat = new Cat(8); // коту 8 лет
Если Cat(int) является единственным конструктором класса, то компилятор не позволит создавать объекты Cat каким-либо другим способом.
Однако вернёмся к коробкам для котов. Созданный нами конструктор не особо полезен, так как создаёт одинаковые коробки. Создадим конструктор с параметрами в классе Box и закомментируйте первый конструктор без параметров:
// Второй конструктор Box(int w, int h, int d)
Если класс содержит один конструктор с параметрами, то вам придётся обязательно указать значения при объявлении класса:
// Это конструктор теперь не допустим // Box catBox = new Box(); // В конструкторе нужно указать значения размеров коробки Box catBox = new Box(100, 200, 100); mInfoTextView.setText("Объём коробки: " + catBox.getVolume());
Кстати, с таким конструктором метод setDim() нам уже не нужен. Мы можем задать размеры коробки сразу в конструкторе. Так как скорее всего коробка постоянна и не меняет своих размеров, то метод, пожалуй, лишний. Но если мы будем менять размеры коробки, то метод придётся оставить.
Класс может иметь несколько конструкторов. Снимите комментарий с первого конструктора и создайте две коробки — коробку по умолчанию и большую коробку.
Box defaultBox = new Box(); mInfoTextView.setText("Объём стандартной коробки: " + defaultBox.getVolume()); Box bigBox = new Box(100, 200, 200); mInfoTextView.append("\nОбъём большой коробки: " + bigBox.getVolume());
То есть, мы видим, что конструкторы поддерживают перегрузку, как и методы.
Например, мы можем создать ещё один конструктор специально для коробки в виде куба, где все стороны равны:
// Третий конструктор для куба Box(int len)
Вычисляем размер куба:
Box cube = new Box(5); int vol = cube.getVolume(); mInfoTextView.setText("Объём куба: " + vol);
Используем объект в качестве параметров
Мы пока использовали в качестве параметров в конструкторах простые типы. Но можно передать и объект самого класса. Добавим ещё один конструктор:
// Используем объект типа Box Box(Box ob)
В коде программы можно воспользоваться конструктором следующим образом:
Box box1 = new Box(100, 200, 100); Box cloneBox = new Box(box1); int vol = cloneBox.getVolume(); mInfoTextView.setText("Объём коробки: " + vol);
Класс Box (исходник)
package ru.alexanderklimov.box; class Box < int width; // ширина коробки int height; // высота коробки int depth; // глубина коробки // Конструктор Box() < width = 10; height = 10; depth = 10; >// Второй конструктор Box(int w, int h, int d) < width = w; height = h; depth = d; >// Третий конструктор для куба Box(int len) < width = height = depth = len; >// Используем объект типа Box Box(Box ob) < width = ob.width; height = ob.height; depth = ob.depth; >// вычисляем объём коробки int getVolume() < return width * height * depth; >// устанавливаем размеры коробки void setDim(int w, int h, int d) < width = w; height = h; depth = d; >>
Вызов перегруженных конструкторов через this()
Имея дело с перегруженными конструкторами, удобно один конструктор вызывать из другого через ключевое слово this. При выполнении конструктора this() сначала выполняется перегруженный конструктор, который соответствует списку параметров. Затем выполняются операторы, находящиеся внутри исходного конструктора, если таковые существуют. Вызов конструктора this() должен быть первым оператором в конструкторе.
Для начала создадим класс, который не использует конструктор this(), чтобы понять разницу.
class Cat < int age; int birthday; // Инициализируем переменные явно Cat(int i, int j) < age = i; birthday = j; >// Инициализируем переменные одним и тем значением Cat(int i) < age = i; birthday = i; >// Присвоим значения по умолчанию 0 Cat() < age = 0; birthday = 0; >>
Мы создали класс с тремя конструкторами. Перепишем класс, используя конструктор this().
class Cat < int age; int birthday; // Инициализируем переменные явно Cat(int i, int j) < age = i; birthday = j; >// Инициализируем переменные одним и тем значением Cat(int i) < this(i, i); // вызывается Cat(i, i); >// Присвоим значения по умолчанию 0 Cat() < this(0); // вызывается Cat(0); >>
У нас теперь только один конструктор, который присваивает значения полям — Cat(int, int). Что происходит при выполнении оператора:
Cat cat = new Cat(8);
Вызов конструктора Cat(8) приводит к выполнению конструктора this(8, 8), что равнозначно вызову конструктора Cat(8, 8).
Что происходит при выполнении оператора:
Cat cat2 = new Cat();
В этом случае вызывается конструктор this(0), что приводит к выполнению конструктора Cat(0), поскольку именно эта версия конструктора подходит по списку параметров. При этом конструктор Cat(0) по сути вызывает конструктор Cat(0, 0).
Использование перегруженных конструкторов через конструктор this() позволяет исключить дублирование кода, уменьшая время загрузки классов.
Но следует быть осторожным, так как конструкторы, которые вызывают конструктор this(), выполняются немного медленнее.
Закрытый конструктор
Иногда класс создаётся только для хранения каких-то статических полей и статических методов. Таким классам принято давать имена Utils, но это не обязательно. Такому классу не нужен конструктор, но если автор класса его не создал, то система сама создаст конструктор по умолчанию. Такой конструктор не имеет смысла, а также может послужить источником ошибок. Чтобы предохраниться от подобной проблемы вы сами явно должны создать пустрой конструктор и сделать его закрытым.
public class Utils < private Utils() < throw new AssertionError(); >. //ваш правильный код // Неправильный код, только для демонстрации! public static void someMethod() < Utils utils = new Utils(); utils.toString(); >>
Строка throw new AssertionError() не является обязательной, но она поможет выявить ошибку, если вы вызовете конструктор в самом классе. Компилятор пропустит такой вариант, но программа завершится с ошибкой.
Utils.someMethod(); // программа закроется с ошибкой
Подкласс для данного класса вы создать не сможете.
6. Java – Конструкторы
Зачем конструкторы в Java? Конструктор инициализирует объект при его создании. Он имеет то же имя, что и его класс, и синтаксически похож на метод. Однако конструкторы не имеют явного возвращаемого типа.
Как правило, в языке Java конструктор используется для присвоения начальных значений переменным экземпляра, определенным классом, или для выполнения любых других процедур запуска, необходимых для создания полностью сформированного объекта.
Все классы имеют конструкторы, независимо от того, определяете вы их или нет, потому что Java автоматически предоставляет конструктор по умолчанию, который инициализирует все переменные – члены нулем. Однако после определения собственного конструктора, конструктор по умолчанию больше не используется.
Синтаксис
Ниже приведен синтаксис как создать конструктор в Java:
class ClassName < ClassName() < >>
Java допускает два типа конструкторов, а именно:
- конструкторы без аргументов;
- параметризованные конструкторы.
Конструктор без параметров
Поскольку имя указывает, что конструкторы без аргументов Java вместо этого не принимают никаких параметров, с помощью этих конструкторов переменные экземпляра метода будут инициализированы фиксированными значениями для всех объектов.
Пример
Public class MyClass < Int num; MyClass() < num = 100; >>
Вы бы вызвали конструктор для инициализации объектов следующим образом:
public class ConsDemo < public static void main(String args[]) < MyClass t1 = new MyClass(); MyClass t2 = new MyClass(); System.out.println(t1.num + " " + t2.num); >>
Это приведёт к следующему результату:
100 100
Параметризованный конструктор
Чаще всего вам понадобится в Java конструктор, который принимает один или несколько параметров. Параметры добавляются в конструктор так же, как они добавляются в метод, просто объявляйте их в круглых скобках после имени конструктора.
Пример
Вот простой пример, в котором используется конструктор:
// Простой конструктор. class MyClass < int x; // Ниже приведен конструктор MyClass(int i) < x = i; >>
Вы должны вызвать конструктор для инициализации объектов следующим образом:
public class ConsDemo < public static void main(String args[]) < MyClass t1 = new MyClass( 10 ); MyClass t2 = new MyClass( 20 ); System.out.println(t1.x + " " + t2.x); >>
Это приведёт к следующему результату:
10 20
Оглавление
- 1. Java – Самоучитель для начинающих
- 2. Java – Обзор языка
- 3. Java – Установка и настройка
- 4. Java – Синтаксис
- 5. Java – Классы и объекты
- 6. Java – Конструкторы
- 7. Java – Типы данных и литералы
- 8. Java – Типы переменных
- 9. Java – Модификаторы
- 10. Java – Операторы
- 11. Java – Циклы и операторы цикла
- 11.1. Java – Цикл while
- 11.2. Java – Цикл for
- 11.3. Java – Улучшенный цикл for
- 11.4. Java – Цикл do..while
- 11.5. Java – Оператор break
- 11.6. Java – Оператор continue
- 12. Java – Операторы принятия решений
- 12.1. Java – Оператор if
- 12.2. Java – Оператор if..else
- 12.3. Java – Вложенный оператор if
- 12.4. Java – Оператор switch..case
- 12.5. Java – Условный оператор (? 🙂
- 13. Java – Числа
- 13.1. Java – Методы byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()
- 13.2. Java – Метод compareTo()
- 13.3. Java – Метод equals()
- 13.4. Java – Метод valueOf()
- 13.5. Java – Метод toString()
- 13.6. Java – Метод parseInt()
- 13.7. Java – Метод Math.abs()
- 13.8. Java – Метод Math.ceil()
- 13.9. Java – Метод Math.floor()
- 13.10. Java – Метод Math.rint()
- 13.11. Java – Метод Math.round()
- 13.12. Java – Метод Math.min()
- 13.13. Java – Метод Math.max()
- 13.14. Java – Метод Math.exp()
- 13.15. Java – Метод Math.log()
- 13.16. Java – Метод Math.pow()
- 13.17. Java – Метод Math.sqrt()
- 13.18. Java – Метод Math.sin()
- 13.19. Java – Метод Math.cos()
- 13.20. Java – Метод Math.tan()
- 13.21. Java – Метод Math.asin()
- 13.22. Java – Метод Math.acos()
- 13.23. Java – Метод Math.atan()
- 13.24. Java – Метод Math.atan2()
- 13.25. Java – Метод Math.toDegrees()
- 13.26. Java – Метод Math.toRadians()
- 13.27. Java – Метод Math.random()
- 14. Java – Символы
- 14.1. Java – Метод Character.isLetter()
- 14.2. Java – Метод Character.isDigit()
- 14.3. Java – Метод Character.isWhitespace()
- 14.4. Java – Метод Character.isUpperCase()
- 14.5. Java – Метод Character.isLowerCase()
- 14.6. Java – Метод Character.toUpperCase()
- 14.7. Java – Метод Character.toLowerCase()
- 14.8. Java – Метод Character.toString()
- 15. Java – Строки
- 15.1. Java – Метод charAt()
- 15.2. Java – Метод compareTo()
- 15.3. Java – Метод compareToIgnoreCase()
- 15.4. Java – Метод concat()
- 15.5. Java – Метод contentEquals()
- 15.6. Java – Метод copyValueOf()
- 15.7. Java – Метод endsWith()
- 15.8. Java – Метод equals()
- 15.9. Java – Метод equalsIgnoreCase()
- 15.10. Java – Метод getBytes()
- 15.11. Java – Метод getChars()
- 15.12. Java – Метод hashCode()
- 15.13. Java – Метод indexOf()
- 15.14. Java – Метод intern()
- 15.15. Java – Метод lastIndexOf()
- 15.16. Java – Метод length()
- 15.17. Java – Метод matches()
- 15.18. Java – Метод regionMatches()
- 15.19. Java – Метод replace()
- 15.20. Java – Метод replaceAll()
- 15.21. Java – Метод replaceFirst()
- 15.22. Java – Метод split()
- 15.23. Java – Метод startsWith()
- 15.24. Java – Метод subSequence()
- 15.25. Java – Метод substring()
- 15.26. Java – Метод toCharArray()
- 15.27. Java – Метод toLowerCase()
- 15.28. Java – Метод toString()
- 15.29. Java – Метод toUpperCase()
- 15.30. Java – Метод trim()
- 15.31. Java – Метод valueOf()
- 15.32. Java – Классы StringBuilder и StringBuffer
- 15.32.1. Java – Метод append()
- 15.32.2. Java – Метод reverse()
- 15.32.3. Java – Метод delete()
- 15.32.4. Java – Метод insert()
- 15.32.5. Java – Метод replace()
- 16. Java – Массивы
- 17. Java – Дата и время
- 18. Java – Регулярные выражения
- 19. Java – Методы
- 20. Java – Потоки ввода/вывода, файлы и каталоги
- 20.1. Java – Класс ByteArrayInputStream
- 20.2. Java – Класс DataInputStream
- 20.3. Java – Класс ByteArrayOutputStream
- 20.4. Java – Класс DataOutputStream
- 20.5. Java – Класс File
- 20.6. Java – Класс FileReader
- 20.7. Java – Класс FileWriter
- 21. Java – Исключения
- 21.1. Java – Встроенные исключения
- 22. Java – Вложенные и внутренние классы
- 23. Java – Наследование
- 24. Java – Переопределение
- 25. Java – Полиморфизм
- 26. Java – Абстракция
- 27. Java – Инкапсуляция
- 28. Java – Интерфейсы
- 29. Java – Пакеты
- 30. Java – Структуры данных
- 30.1. Java – Интерфейс Enumeration
- 30.2. Java – Класс BitSet
- 30.3. Java – Класс Vector
- 30.4. Java – Класс Stack
- 30.5. Java – Класс Dictionary
- 30.6. Java – Класс Hashtable
- 30.7. Java – Класс Properties
- 31. Java – Коллекции
- 31.1. Java – Интерфейс Collection
- 31.2. Java – Интерфейс List
- 31.3. Java – Интерфейс Set
- 31.4. Java – Интерфейс SortedSet
- 31.5. Java – Интерфейс Map
- 31.6. Java – Интерфейс Map.Entry
- 31.7. Java – Интерфейс SortedMap
- 31.8. Java – Класс LinkedList
- 31.9. Java – Класс ArrayList
- 31.10. Java – Класс HashSet
- 31.11. Java – Класс LinkedHashSet
- 31.12. Java – Класс TreeSet
- 31.13. Java – Класс HashMap
- 31.14. Java – Класс TreeMap
- 31.15. Java – Класс WeakHashMap
- 31.16. Java – Класс LinkedHashMap
- 31.17. Java – Класс IdentityHashMap
- 31.18. Java – Алгоритмы Collection
- 31.19. Java – Iterator и ListIterator
- 31.20. Java – Comparator
- 32. Java – Дженерики
- 33. Java – Сериализация
- 34. Java – Сеть
- 34.1. Java – Обработка URL
- 35. Java – Отправка Email
- 36. Java – Многопоточность
- 36.1. Java – Синхронизация потоков
- 36.2. Java – Межпоточная связь
- 36.3. Java – Взаимная блокировка потоков
- 36.4. Java – Управление потоками
- 37. Java – Основы работы с апплетами
- 38. Java – Javadoc
Конструкторы. Конструкторы по умолчанию. Вызов конструкторов класса из других конструкторов
Конструктор по умолчанию (default constructor) – это конструктор, который не имеет параметров. Конструктор по умолчанию может объявляться в классе явным образом или генерироваться автоматически.
В наиболее общем случае, для класса ClassName , конструктор по умолчанию имеет следующий вид:
class ClassName < . // объявление конструктора ClassName() < // тело конструктора // . > . >
2. В каких случаях конструктор по умолчанию генерируется в классе автоматически а в каких нет? Пример
Если в классе не объявить ни одного конструктора, то, будет генерироваться конструктор по умолчанию. То есть, конструктор по умолчанию генерируется в классе автоматически только в том случае, если класс не содержит реализации других конструкторов. Если класс содержит реализацию хотя бы одного конструктора с параметрами, то, чтобы объявить конструктор по умолчанию, его нужно объявлять в классе явным образом.
Например. В следующем объявлении класса конструктор по умолчанию генерируется автоматически
class CMyClass < int d; int GetD() < return d; > void SetD(int nd) < d = nd; > >
Вышеприведенный код означает, что можно объявлять объект класса с использованием конструктора по умолчанию:
// работает, так как в классе больше не реализовано ни одного конструктора CMyClass mc = new CMyClass();
Если в тело класса CMyClass добавить хотя бы один другой конструктор (например, конструктор с одним параметром), то конструктор по умолчанию автоматически генерироваться не будет
class CMyClass < int d; // объявление конструктора с 1 параметром, // конструктор по умолчанию уже не генерируется автоматически CMyClass(int nd) < d = nd; > int GetD() < return d; > void Set(int nd) < d = nd; > >
После вышеприведенной реализации объявить объект с использованием конструктора по умолчанию не удастся. Однако, можно объявить объект с использованием конструктора с одним параметром
// ошибка компиляции, так как в классе уже объявлен другой конструктор // CMyClass mc = new CMyClass(); CMyClass mc2 = new CMyClass(7); // а этот код работает
В результате выполнения вышеприведенной строки будет выдана ошибка компиляции:
The constructor CMyClass() is undefined
Для того, чтобы иметь реализацию конструктора по умолчанию и объявлять объект класса с использованием конструктора по умолчанию, его нужно задавать явно. Это может быть, например, следующим образом
class CMyClass < int d; // явное объявление конструктора по умолчанию CMyClass() < d = 0; > // объявление конструктора с 1 параметром, CMyClass(int nd) < d = nd; > int GetD() < return d; > void Set(int nd) < d = nd; > >
После такой реализации можно создавать экземпляр класса с использованием двух конструкторов, например
CMyClass mc = new CMyClass(); // вызывается конструктор по умолчанию mc.d = 25; CMyClass mc2 = new CMyClass(5); // вызывается конструктор с 1 параметром
3. Вызов конструкторов из других конструкторов. Пример
Язык программирования Java позволяет осуществлять вызов конструкторов класса из другого конструктора этого же класса. Для этого используется ключевое слово this , которое есть ссылкой на текущий класс.
Пример. В примере демонстрируется использование класса CPixel , который реализует пиксел на экране монитора.
// Класс, который реализует пиксел на экране монитора public class CPixel < // внутренние переменные класса private int x, y; // координаты пиксела private int color; // цвет пиксела // конструктор без параметров (конструктор по умолчанию) CPixel() < x = y = color = 0; > // конструктор с 2 параметрами, которые инициализируют только координаты CPixel(int _x, int _y) < x = _x; y = _y; color = 0; > // конструктор с 1 параметром, который инициализирует только цвет CPixel(int _color) < color = _color; x = y = 0; > // конструктор с 3 параметрами, который вызывает конструктор с 2 параметрами CPixel (int _x, int _y, int _color) < // вызов конструктора с 2 параметрами: обязательно первая операция и только один раз this(_x, _y); //this(_color); // повторный вызов конструктора запрещен this.color = _color; // так можно > // методы доступа int GetX() < return x; > int GetY() < return y; > int GetColor() < return color; > >
Использование класса CPixel в другом программном коде (методе)
. CPixel cp1 = new CPixel(2,8); // вызов конструктора с 2 параметрами CPixel cp2 = new CPixel(3,5,8); // вызов конструктора, который вызовет другой конструктор int d; d = cp1.GetX(); // d = 2 d = cp2.GetColor(); // d = 8 d = cp2.GetY(); // d = 5 .
4. Какие ограничения (требования) накладываются на вызов других конструкторов из конструктора класса?
Чтобы корректно вызвать другие конструкторы из конструктора класса, нужно придерживаться следующих требований (ограничений):
- вызвать можно только один другой конструктор класса. Вызвать два и больше других конструктора этого класса запрещено. Это вытекает из логики, что конструктор класса предназначен для создания объекта класса только один раз (а не два и больше раза);
- вызов другого конструктора должен быть первой операцией в вызывающем конструкторе. Если в вызывающем конструкторе вызов другого конструктора реализовать второй (третьей и т.д.) операцией, то компилятор выдаст ошибку.
5. Можно ли вызвать конструктор из обычного метода класса?
Нет, нельзя. Конструктор класса может вызваться только из другого конструктора этого же класса. Главное назначение конструктора класса – создание экземпляров (объектов) класса. Этих привилегий лишены методы класса.
Связанные темы
- Конструкторы . Параметризированные конструкторы. Ключевое слово this. «Сборка мусора». Метод finalize() . Примеры
- Перегрузка методов в классах. Перегрузка конструкторов