/* Разберись, что делает программа. Исправь конструктор с двумя параметрами так, чтобы он вызывал другой конструктор с радиусом 10. Подумай, какой конструктор нужно вызвать. Подсказка: внимательно изучи реализацию конструктора по умолчанию. */
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
public class Circle |
public double x; |
public double y; |
public double radius; |
public Circle(double x, double y, double radius) |
this.x = x; |
this.y = y; |
this.radius = radius; |
> |
public Circle(double x, double y) |
//напишите тут ваш код |
this(x, y, 10); |
> |
public Circle() |
this(5, 5, 1); |
> |
public static void main(String[] args) |
Circle circle = new Circle(); |
System.out.println(circle.x + » » + circle.y + » » + circle.radius); |
Circle anotherCircle = new Circle(10, 5); |
System.out.println(anotherCircle.x + » » + anotherCircle.y + » » + anotherCircle.radius); |
> |
> |
Вызов конструктора базового класса из конструктора класса-наследника. Наследование. ООП C++ #102
Источник: gist.github.com
Untitled
4. Конструктор с двумя параметрами должен должен вызывать другой конструктор, передав в него верные значения параметров.
5. Метод main не изменять.
6. Конструктор по умолчанию не изменять.
public class Circle {
public double x ;
public double y ;
public double radius ;
public Circle ( double x, double y, double radius ) {
this . x = x ;
this . y = y ;
this . radius = radius ;
public Circle ( double x, double y ) {
this ( x, y, 10.0 ) ;
public Circle ( ) {
this ( 5 , 5 , 1 ) ;
public static void main ( String [ ] args ) {
Circle circle = new Circle ( ) ;
System . out . println ( circle. x + » » + circle. y + » » + circle. radius ) ;
Circle anotherCircle = new Circle ( 10 , 5 ) ;
System . out . println ( anotherCircle. x + » » + anotherCircle. y + » » + anotherCircle. radius ) ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement
C# | 32 sec ago | 0.85 KB
JSON | 11 min ago | 0.15 KB
JSON | 18 min ago | 1.15 KB
CMake | 1 hour ago | 2.34 KB
Lua | 2 hours ago | 8.89 KB
Lua | 2 hours ago | 8.55 KB
JSON | 2 hours ago | 4.47 KB
JSON | 2 hours ago | 4.44 KB
Делегирующие конструкторы c++. Вызов конструктора из конструктора. ООП. С++ Для начинающих. #107
Advertisement
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Источник: pastebin.com
Конструктор Java: объектов, классов
Java-конструктор – это специальный метод, который вызывается при создании экземпляра объекта. Другими словами, когда вы используете новое ключевое слово. Цель конструктора – инициализировать вновь созданный объект перед его использованием.
Вот простой пример:
MyClass myClassObj = new MyClass();
Здесь создается новый объект MyClass и вызывается конструктор без аргументов MyClass.
Конструктор класса инициализирует экземпляры (объекты) этого класса. Обычно конструктор инициализирует поля объекта, которые необходимо инициализировать. Конструкторы также могут принимать параметры, поэтому поля могут быть инициализированы в объекте во время создания.
Объявление конструктора Java
Простой пример объявления конструктора:
public class MyClass < public MyClass() < >>
Конструктор – это часть:
public MyClass()
- Первая часть объявления конструктора – это модификатор доступа. Он имеет те же значения, что и для методов и полей. Определяют, какие классы могут получить доступ (вызвать) конструктор.
- Вторая часть – это имя класса, к которому принадлежит конструктор. Использование сигнализирует компилятору, что это конструктор. Также обратите внимание, что конструктор не имеет возвращаемого типа, как другие методы Java.
- Третья часть – это список параметров, которые может принимать конструктор. Объявляются в круглых скобках () после части имени класса конструктора. В приведенном выше примере параметры не объявляются.
- Четвертая часть – это тело конструктора. Определяется внутри фигурных скобок <> после списка параметров. В приведенном выше примере нет операций внутри тела конструктора. Говорят, что это «пустой» конструктор.
Перегрузка конструктора
Класс может иметь несколько конструкторов, если их сигнатура (параметры, которые они принимают) не совпадают. Когда класс содержит несколько конструкторов, мы говорим, что конструктор перегружен (поставляется в нескольких версиях):
public class MyClass < private int number = 0; public MyClass() < >public MyClass(int theNumber) < this.number = theNumber; >>
Класс выше содержит два конструктора. Первый – без аргументов, то есть он не принимает параметров. Второй – принимает параметр int. Внутри тела значение параметра int присваивается полю, то есть значение параметра копируется в поле.
Таким образом, поле инициализируется для данного значения параметра.
Ключевое слово this перед именем поля (this.number) необязательно. Оно просто сообщает компилятору, что это поле с именем number, на которое ссылаются.
Конструктор по умолчанию, без аргументов
Вам не нужно определять конструктор для класса, но если вы не этого не сделаете, компилятор вставит для вас конструктор по умолчанию без аргументов. Таким образом, когда класс скомпилирован, у него всегда будет конструктор без аргументов.
Если вы определите конструктор для своего класса, то компилятор не будет вставлять конструктор по умолчанию без аргументов в ваш класс.
Параметры
Конструктор может принимать параметры, которые потом используются для инициализации внутреннего состояния (полей) вновь созданного объекта:
public class Employee < private String firstName = null; private String lastName = null; private int birthYear = 0; public Employee(String first, String last, int year ) < firstName = first; lastName = last; birthYear = year; >>
В этом примере объявлены 3 параметра: первый, последний и год. Внутри тела значения этих трех параметров присваиваются полям объекта Employee.
Разрывы строки на Java после каждого параметра являются необязательными. Компилятор здесь игнорирует разрывы строк. Вы также можете написать объявление параметра в одну строку, если хотите, например:
public Employee(String first, String last, int year )
Чтобы вызвать этот конструктор, который принимает три параметра, вы должны создать экземпляр объекта Employee следующим образом:
Employee employee = new Employee(«Jack», «Daniels», 2000);
Параметры передаются конструктору в скобках после имени класса справа от знака равенства. Затем объект создается, и конструктор выполняется. После выполнения описанного выше конструктора поля, инициализированные им, будут иметь значения параметров, передаваемых ему.
Параметр конструктора может иметь то же имя, что и поле. В этом случае у компилятора возникают проблемы, зная, на что вы ссылаетесь. По умолчанию, если параметр (или локальная переменная) имеет то же имя, что и поле в том же классе, параметр (или локальная переменная) «затеняет» поле. Посмотрите на этот пример:
public class Employee < private String firstName = null; private String lastName = null; private int birthYear = 0; public Employee(String firstName, String lastName, int birthYear ) < firstName = firstName; lastName = lastName; birthYear = birthYear; >>
Внутри конструктора класса Employee идентификаторы firstName, lastName и birthYear теперь ссылаются на параметры конструктора, а не на поля Employee с одинаковыми именами. Таким образом, конструктор теперь просто устанавливает параметры, равные им самим. Поля Сотрудника никогда не инициализируются.
Чтобы сообщить компилятору, что вы имеете в виду поля класса Employee, а не параметры, поместите ключевое слово this и точку перед именем поля:
public class Employee < private String firstName = null; private String lastName = null; private int birthYear = 0; public Employee(String firstName, String lastName, int birthYear ) < this.firstName = firstName; this.lastName = lastName; this.birthYear = birthYear; >>
Теперь поля Employee правильно инициализируются внутри конструктора.
Вызов
Вы вызываете конструктор, когда создаете новый экземпляр класса, содержащий его:
MyClass myClassVar = new MyClass();
Этот пример вызывает конструктор без аргументов для MyClass, как определено ранее в этом тексте.
Если вы хотите передать параметры конструктору, вы должны включить их в круглые скобки после имени класса:
MyClass myClassVar = new MyClass(1975);
Этот пример передает один параметр конструктору MyClass, который принимает int в качестве параметра.
Вызов конструктора из конструктора
В Java можно вызвать конструктор из другого конструктора. Для этого используется ключевое слово this:
public class Employee < private String firstName = null; private String lastName = null; private int birthYear = 0; public Employee(String first, String last, int year ) < firstName = first; lastName = last; birthYear = year; >public Employee(String first, String last) < this(first, last, -1); >>
Обратите внимание на второе определение конструктора. Внутри тела конструктора вы найдете этот оператор Java:
this(first, last, -1);
Ключевое слово this, за которым следуют скобки и параметры, означает, что вызывается другой конструктор в том же классе. Какой другой вызываемый конструктор зависит от того, какие параметры вы передаете в вызов конструктора (в скобках после ключевого слова this). В этом примере это первый конструктор в классе, который вызывается.
Вызов в суперклассах
В класс может расширять другой. В этом случае говорят, что он «наследует» от класса, который он расширяет. Расширяемый класс называется подклассом, а расширяемый – суперклассом.
Класс, который расширяет другой, не наследует его конструкторы. Однако подкласс должен вызывать конструктор в суперклассе внутри одного из конструкторов подкласса!
Класс Car расширяет (наследует) класс Vehicle:
public class Vehicle < private String regNo = null; public Vehicle(String no) < this.regNo = no; >>
public class Car extends Vehicle < private String brand = null; public Car(String br, String no) < super(no); this.brand = br; >>
Обратите внимание на конструктор в классе Car. Он вызывает конструктор в суперклассе, используя этот оператор:
super(no);
Использование ключевого слова super относится к суперклассу класса. Когда за ключевым словом следуют круглые скобки, как здесь, это относится к конструктору в суперклассе. В этом случае это относится к конструктору в классе Vehicle. Поскольку Car расширяет Vehicle, все конструкторы Car должен вызывать конструктор в Vehicle.
Модификаторы доступа
Модификатор доступа конструктора определяет, какие классы в вашем приложении могут вызывать его. Например, если конструктор объявлен защищенным, то он может вызывать только классы в одном пакете или подклассы этого класса.
Класс может иметь несколько конструкторов, а каждый конструктор свой собственный модификатор доступа. Таким образом, некоторые конструкторы могут быть доступны для всех классов в вашем приложении, в то время как другие конструкторы доступны только для классов в том же пакете, подклассах или даже только для самого класса (частные конструкторы).
Исключение
Можно сгенерировать исключение из конструктора:
public class Car < public Car(String brand) throws Exception < if(brand == null) < new Exception(«The brand parameter cannot be null!»); >> >
Обратите внимание на исключительную часть throws объявления конструктора. Она объявляет, что конструктор может выдать исключение. Если это произойдет, созданный экземпляр Car недействителен.
Вот пример вызова конструктора Car:
Car car = null; try < car = new Car(); //do something with car object >catch(Exception e) < // handle exception >
Если из конструктора Car выдается исключение, переменной car никогда не будет назначена ссылка на объект Car, который вы пытаетесь создать. Переменная car по-прежнему будет указывать на ноль.
Создание конструктора, создающего исключение, может быть хорошей идеей, если хотите предотвратить создание объекта данного класса в недопустимом состоянии. Обычно это входные параметры конструктора, которые могут привести к тому, что объект будет недействительным. Если конструктор обнаруживает неверный входной параметр, он вызывает исключение и предотвращает присвоение объекта какой-либо переменной.
Источник: java-blog.ru