java constructor class
Този урок ще обсъди Java Constructor, неговите типове и концепции като претоварване на конструктора и конструкторска верига с примери за код:
От нашите по-ранни уроци знаем, че екземплярът на клас се нарича обект. Обект от клас се създава с помощта на ключовата дума “new”. Специален метод, наречен 'конструктор', се извиква, когато създаваме обект с нова ключова дума или когато обектът е създаден.
Конструкторът се дефинира като блок от код за инициализиране на обекта на класа. Той е идентичен с метода, но не е метод. Въпреки това, той може да се нарече „специален метод“ в Java.
=> Проверете тук, за да видите A-Z на уроците за обучение по Java тук.
Какво ще научите:
- Java конструктор
- Заключение
Java конструктор
Java конструктор се използва за инициализиране на току-що създадения обект. Обектът трябва да има някои данни, преди да бъде използван в програмата. Следователно използваме конструктор, за да можем да присвоим някои първоначални данни на обекта.
Като прост пример, разгледайте клас ABC, за който трябва да създадем обект. Нека създадем обект ‘myObj’ за класа ABC, използвайки нова ключова дума.
ABC myObj = new ABC ();
Горното изявление създава обект myObj. Когато се създава този обект, се извиква конструктор за клас ABC без аргумент (ABC () показва, че няма аргументи за конструктора). Тъй като не са предвидени аргументи за горния конструктор, полетата-членове на myObj ще бъдат инициализирани до първоначалните им стойности по подразбиране.
Например,
- Числовите типове данни като int са зададени на 0.
- Стойността на променливата на типа данни Char е зададена на нулев (‘ 0’) знак.
- Препратките са настроени на нула.
В този урок ще обсъдим конструкторите в детайли заедно с различните конструктори, използвани в Java.
Как да създам конструктор в Java
За да създадем конструктор в Java, трябва да следваме определени правила, дадени по-долу.
- Конструкторът на класа има същото име като това на класа.
- Не може да има конструктор, който да е окончателен, абстрактен, синхронизиран или статичен. Това е така, защото Финалът действа като константа, абстрактното не може да бъде инстанцирано. Докато синхронизира се използва в случай на много резби, а статичната ключова дума се използва на ниво клас.
- Можем да използваме модификатори за достъп с конструкторите.
- Конструктор не може да има тип връщане.
Например,нека дефинираме клас Student, както следва:
class Student{ String name; int roll_no; }
Можем да създадем обекти от горния клас, като използваме новата ключова дума. Докато обектът се създава, можем да инициализираме двучленните променливи от този клас, като предоставим конструктор. Имайте предвид, че дори да не предоставим конструктор и просто да изпълним инструкцията по-долу,
Студент студент = нов студент ();
И все пак Java ще изпълни конструктор по подразбиране, който ще инициализира двучленните променливи до техните системни настройки по подразбиране. Сега, ако искаме първоначалната стойност на Student.name да бъде „Keith“ и roll_no да бъде 27, тогава за да направим това, можем да създадем следния метод на конструктор.
Student () { name = 'Keith'; roll_no = 27; }
Когато създаваме обект от студентския клас с изявлението по-долу
Student student = new Student ();
Тогава първоначалните стойности на член променливите name и roll_no ще бъдат съответно Keith и 27.
Сега, когато е създаден конструктор, кога ще бъде извикан?
Конструктор се извиква всеки път, когато се създава обект с новата ключова дума, както в горния случай. Както вече споменахме, ако не е предоставен конструктор, Java предоставя конструктор по подразбиране, който се извиква, когато обектът е създаден с помощта на новата ключова дума.
Пример за конструктор
Следващата програма показва пример за конструктор, в който имаме прост конструктор без никакви аргументи. Този конструктор просто присвоява начални стойности на своите променливи-членове.
//class definition class classDemo{ int num1; int num2; //constructor classDemo(){ num1 = 100; num2 = 250; System.out.println('Inside ClassDemo::Constructor'); } public void display(){ System.out.println('num1 = '+ num1); System.out.println('num2 = '+ num2); } } class Main{ public static void main(String args()){ classDemo cd1 = new classDemo(); //create object of ClassDemo cd1.display(); } }
Изход:
Конструктор по подразбиране в Java
Конструкторът по подразбиране се нарича още Empty Constructor . Този конструктор се вмъква от компилатора на Java в кода на класа, където няма конструктор, внедрен от програмиста. По време на компилацията се вмъква конструктор по подразбиране и следователно той ще се появи само във файла .class, а не в изходния код.
Помислете за следния Java клас.
изходен файл (.java) файл на класа (.class)
На горната фигура първата фигура показва изходния код, в който не сме посочили никакъв конструктор. Така че, когато компилираме този код и се генерира .class файл, можем да видим, че Java компилаторът е вмъкнал конструктор по подразбиране, както е показано на прилежащата фигура (в син цвят).
Забележка:
Понякога се използва конструктор по подразбиране, за да се опише no-arg конструктор в Java. Но тези два термина са различни в действителност. No-arg конструктор е тип конструктор в Java, който е определен от програмиста. Конструкторът по подразбиране е конструкторът, който се вмъква от Java компилатора.
html5 css3 интервю въпроси и отговори
Следователно, въпреки че тези два термина се използват взаимозаменяемо от повечето програмисти, препоръчително е да не бъркате тези два термина.
Когато Java вмъква конструктор по подразбиране, ако програмата има някакви променливи, тогава им се присвояват стойностите по подразбиране.
Таблицата по-долу показва стойностите по подразбиране за всеки тип данни.
Тип | Стойност по подразбиране |
---|---|
char | u0000 |
Обект | Референтна нула |
булев | невярно |
байт | 0 |
къс | 0 |
инт | 0 |
дълго | 0L |
плувка | 0.0f |
двойно | 0.0d |
Следващата програма дава пример за конструктор по подразбиране в Java.
class Main { int num; boolean flag; public static void main(String() args) { // A default constructor is called Main obj = new Main(); System.out.println('num:default value = ' + obj.num); System.out.println('flag:default value = ' + obj.flag); } }
Изход:
Видове конструктори в Java
В Java има два типа конструктори, както е показано по-долу.
# 1) Конструктор без аргументи
Конструктор без никакви аргументи се нарича no-args или no-argument конструктор. Ако нямаме конструктор без никакви аргументи, тогава Java компилаторът не създава конструктор по подразбиране за класа.
По принцип, ако дефинираме конструктор в нашия клас, тогава конструкторът по подразбиране не се вмъква от Java компилатора.
По-долу е даден пример за конструктора No-arg
import java.io.*; class DemoClass { int num; String name; // no-args Constructor called when object is created DemoClass() { System.out.println('DemoClass::Constructor called'); System.out.println('Initial member variable values:'); System.out.println('num = ' + num + ' name = ' + name); } } class Main{ public static void main (String() args) { // this will invoke no-args Constructor DemoClass dc1 = new DemoClass(); } }
Изход:
В тази програма сме предоставили конструктор no-args. Тук отпечатваме някои съобщения, включително членовите променливи. В изхода можем да видим, че се показват съобщенията от конструктора, показващи, че конструкторът no-args е изпълнен.
# 2) Параметризиран конструктор
Параметризиран конструктор има един или повече параметри. Можем да използваме параметризиран конструктор в случай, че трябва да предадем някои начални стойности на променливата член на класа.
import java.io.*; class DemoClass { // data members of the class. String name; int id; // parameterized constructor called when object is created DemoClass(String name, int id) { this.name = name; this.id = id; } } class Main { public static void main (String() args) { // this will invoke the parameterized constructor. DemoClass dc1 = new DemoClass('Java', 1); System.out.println('Tutorial Name :' + dc1.name + ', Id :' + dc1.id); } }
Изход:
Тук сме предоставили параметризиран конструктор, който взема два аргумента, т.е. име и идентификатор.
Вътре в тялото на конструктора аргументите се присвояват като стойности съответно на името и id на променливите-членове.
След това в основния метод, когато създаваме нов обект, използвайки новата ключова дума, ние предаваме две стойности на името на класа след нова ключова дума. Това показва, че извикваме параметризирания конструктор. Когато показваме променливите-членове, можем да видим, че те имат стойностите, които сме предали при създаването на обекта.
Претоварени конструктори в Java
Сега възниква въпросът дали даден клас може да има повече от един конструктор или клас може да има само един конструктор?
Е, можем да имаме множество конструктори в клас. Един клас може да има толкова конструктори в него, стига да са правилно претоварени.
И така, какво точно се разбира под претоварване на конструктори?
Претоварването на конструктора е механизъм, който позволява на класа да има толкова много конструктори, така че всички тези конструктори да имат различни списъци с параметри, независимо в зависимост от типовете параметри или реда на параметрите.
Програмата по-долу демонстрира претоварването на конструктора.
//class with multiple constructors class DemoClass{ int val1; int val2; //no args Constructor DemoClass(){ val1 = 10; val2 = 20; System.out.println('DemoClass:: No argument Constructor'); } //Overloaded Constructor DemoClass(int num1){ val1 = num1; val2 = num1; System.out.println('DemoClass:: Overloaded Constructor with one argument'); } //Overloaded DemoClass(int num1,int num2){ val1 = num1; val2 = num2; System.out.println('DemoClass:: Overloaded Constructor with two arguments'); } public void display(){ System.out.println('val1 === '+val1 + ' ; val2 === '+val2 ); } } class Main{ public static void main(String args()){ DemoClass d1 = new DemoClass(); //object with no-args Constructor d1.display(); DemoClass d2 = new DemoClass(10); //object with 1 arg Constructor d2.display(); DemoClass d3 = new DemoClass(20,40); //object with 2 arg Constructor d3.display(); } }
Изход:
В горната програма имаме клас, съдържащ три конструктора. Първият конструктор е конструктор no-arg и тогава имаме по един с по един аргумент и два аргумента съответно. Тъй като конструкторът има уникален списък с параметри, можем да кажем, че конструкторите са претоварени.
‘This ()’ конструктор в Java
Какво да правим в клас, съдържащ множество конструктори, ако искаме да извикаме един конструктор от друг конструктор в този клас?
За тази цел използваме ключовата дума “this” вътре в конструктора, от който искаме да извикаме друг конструктор.
Така че, когато даден клас има множество конструктори, no-arg конструктор и параметризиран конструктор, ние използваме ключова дума ‘this’, за да извикаме параметризиран конструктор от no-args конструктора. Това също се нарича “Изрично извикване на конструктор”.
Защо се нуждаем от тази ключова дума?
Имаме нужда от него, тъй като изричното извикване на конструктори не е възможно директно чрез използване само на името на конструктора.
Точки за отбелязване:
- Ключовата дума ‘this’ трябва да бъде първото изявление в извикващия конструктор.
- Ако конструкторът има ключова дума „this“, тогава не може да има „super“. Това означава, че конструкторът може да има или супер, или това.
class TestClass { TestClass() { //calling Parameterized Constructor this('SoftwareTestingHelp'); System.out.println('TestClass::No-args Constructor'); } TestClass(String str) { System.out.println('TestClass:: Parameterized Constructor(String):' + str); } } class Main{ public static void main(String() args) { TestClass obj = new TestClass(); } }
Изход:
В горната програма имаме „TestClass“ с два конструктора. Ние наричаме това („SoftwareTestingHelp“) от конструктора no-args. Това е изричното извикване на параметризирания конструктор.
Конструктор за копиране в Java
Знаем за конструктора за копиране в C ++. Конструкторът за копиране е конструктор, който има препратка към обект като аргумент и се създава нов обект, използващ данните на препращащия обект.
C ++ осигурява конструктор за копиране по подразбиране, ако такъв не е предоставен в програмата.
Java също осигурява поддръжка за конструктор за копиране, но не предоставя конструктор за копиране по подразбиране.
Следващата програма Java демонстрира конструктора на копиране, използвайки класическия пример за комплексни числа, които имат реални и въображаеми компоненти.
class Complex { private double real, imaginary; // parametrized constructor public Complex(double real, double imaginary) { System.out.println('Complex:: parametrized constructor'); this.real = real; this.imaginary = imaginary; } // copy constructor Complex(Complex c) { System.out.println('Complex::Copy constructor called'); real = c.real; imaginary = c.imaginary; } // Overriding the toString of Object class @Override public String toString() { return '(' + real + ' + ' + imaginary + 'i)'; } } public class Main { public static void main(String() args) { Complex c1 = new Complex(1, 5); //calls parametrized constructor System.out.println('C1 = ' + c1); // copy constructor called Complex c2 = new Complex(c1); System.out.println('C2 = ' + c2); // this is a simple assignment operator Complex c3 = c2; } }
Изход:
Горната програма има клас „Комплекс“, който има параметризиран конструктор и конструктор за копиране. Първо в основния метод създаваме обект c1 с помощта на параметризиран конструктор. След това използвайки изявлението по-долу,
Complex c2 = new Complex (c1);
Горното изявление извиква конструктора за копиране, когато референцията c1 се предава на конструктора, докато създава нов обект c2.
Конструктор на вериги в Java
Конструкторната верига е процес на един конструктор, който извиква друг конструктор от същия клас.
Дори когато сме наследили от основен клас, конструкторът на базовия клас се извиква първо, когато се създаде обектът на дъщерния клас. Това също е пример за верижно изграждане.
В Java веригирането на конструктор може да бъде постигнато чрез два подхода:
- В рамките на същия клас : Когато извикваме един конструктор от друг конструктор от същия клас, тогава можем да използваме използването на ключовата дума this ().
- От базовия клас: Конструктор на базовия клас може да бъде извикан от този на производния клас с помощта на ключовата дума super.
Защо ни е необходима верига на конструктор?
Когато искаме да изпълняваме множество задачи в нашия конструктор, тогава вместо да изпълняваме всяка задача в един конструктор, ние разделяме задачите на множество конструктори и след това извикваме конструктори един от друг, което води до верижно свързване на конструктори.
По-долу са дадени някои от правилата, които трябва да спазваме, докато изпълняваме веригите на конструктори.
- Веригата на конструктора се извършва във всякакъв ред и ще доведе до същите резултати.
- Изразът „тази“ ключова дума трябва да бъде първият израз в конструктора.
- Трябва да имаме поне един конструктор без тази ключова дума.
Когато имаме наследство в нашата програма, ние също можем да изпълним конструкторска верига. В този случай подкласът ще извика конструктора на базовия клас. По този начин създаването на обекти от подклас започва с инициализиране на членовете на суперкласа.
Сега ще приложим веригата на конструктори в Java, използвайки горните подходи.
# 1) Свързване на конструктор в рамките на същия клас
class DemoClass { // No args constructor DemoClass() { System.out.println('DemoClass::No args constructor'); } // parameterized constructor DemoClass(int val1) { // calls default constructor this(); System.out.println('DemoClass::Constructor with 1 argument: ' + val1); } // parameterized constructor DemoClass(int val1, int val2) { // invokes parameterized constructor with 1 argument this(5); System.out.print('DemoClass::constructor with 2 arguments:'); System.out.println('Product of 2 arguments = ' + val1 * val2); } } class Main{ public static void main(String args()) { // call parameterized constructor with 2 arguments new DemoClass(10, 15); } }
Изход:
Както вече споменахме, ние постигаме верига на конструктори в рамките на същия клас, използвайки ключова дума ‘this’. В горната програма имаме три конструктора и извикваме един конструктор от друг, използвайки ключовата дума ‘this’.
От базовия клас
спокойни уеб услуги интервю въпроси и отговори в Java
Когато клас наследява друг клас, тогава конструкторът на родителския клас се извиква първо, когато създаваме обект от производен клас, който е верига на конструктор.
Ако искаме изрично да извикаме конструктора на базовия клас в производния клас, тогава трябва да използваме ключовата дума „super“ за тази цел. Използвайки ключовата дума „super“, можем да извикаме конструкторите на суперклас в йерархията на наследяване, докато стигнем до най-горния клас.
Програмата по-долу демонстрира използването на ключова дума „super“ за верига на конструктори.
class BaseClass { String name; // no args constructor BaseClass() { this(''); System.out.println('BaseClass::No-argument constructor'); } // Parameterized constructor BaseClass(String name) { this.name = name; System.out.println('BaseClass::Parameterized constructor'); } } class DerivedClass extends BaseClass { // No-argument constructor DerivedClass() { System.out.println('DerivedClass::No-argument constructor'); } // parameterized constructor DerivedClass(String name) { super(name); // invokes Parameterized constructor of BaseClass System.out.println('DerivedClass::Parameterized constructor'); } } class Main { public static void main(String args()) { // invokes DerivedClass parameterized constructor DerivedClass obj = new DerivedClass('Java'); } }
Изход:
В горната програма извикваме параметризирания конструктор на производния клас със стойността “Java”. Този конструктор от своя страна има извикване към конструктора на базовия клас, използвайки „super (name);“ който изпълнява параметризирания конструктор на базовия клас.
често задавани въпроси
В # 1) Как се създава конструктор в Java?
Отговор: Създаваме конструктор като специален метод, който има същото име като името на класа. Конструктор не може да има и тип връщане. Той може да има модификатори за достъп, но не може да бъде окончателен, статичен, абстрактен или синхронизиран.
Ако ABC е клас, тогава можем да определим неговия конструктор като
ABC(){} //no args constructor OR ABC(param1, param 2, …, param n) {} //parameterized constructor
В # 2) Каква е ползата от конструктора в Java?
Отговор: Използвайки конструктора, можем да инициализираме членовете на класа като първото нещо, което е създадено в момента. Конструкторът елиминира необходимостта да се извикват имплицитно нормални методи.
Можем да изпълняваме различни задачи, свързани с инициализиране, стартиране на задачи и т.н. в конструктора, тъй като конструкторите се извикват по време на фазата на създаване на обект.
В # 3) Защо се използват конструктори?
Отговор: Конструкторите се използват главно за инициализиране на членовете на класа и се извикват, когато се създава обектът на класа.
В # 4) Може ли конструкторът да е частен?
Отговор: Да, можем да имаме частен конструктор. Когато конструкторът е частен, тогава класът може да бъде предотвратен от създаване на инстанции.
В # 5) Може ли конструкторът да бъде окончателен?
Отговор: Не, не можем да имаме окончателен конструктор.
Заключение
В този урок започнахме нашата дискусия за конструкторите в Java. Научихме основите на конструктора, неговото създаване и правилата, които трябва да следваме. Обсъдихме и конструктори за копиране в Java.
Конструкторът по подразбиране и типовете конструктори и концепции като претоварване на конструктора и веригиране на конструктори бяха накратко с примери. Като част от тези теми видяхме и използването на ключова дума ‘this’ в конструктори.
=> Прочетете серията Easy Training Training.
Препоръчително четене
- Java Class Vs Object - Как да използвам класа и обекта в Java
- Основи на Java: Синтаксис на Java, клас Java и основни концепции на Java
- Java Integer и Java BigInteger клас с примери
- Урок за клас Java Scanner с примери
- Java Array Class Tutorial - java.util.Arrays Class с примери
- Какво е Java Vector | Урок за Java Vector Class с примери
- Урок за интерфейс на Java и абстрактен клас с примери
- Клас робот в Selenium WebDriver с Java