JavaRush /Blog Java /Random-PL /Przerwa kawowa #123. Konstruktor Java — pytania i odpowie...

Przerwa kawowa #123. Konstruktor Java — pytania i odpowiedzi dotyczące rozmowy kwalifikacyjnej

Opublikowano w grupie Random-PL
źródło: Hackenoon

Co to jest Konstruktor?

Konstruktor to specjalna metoda zdefiniowana w klasie o tej samej nazwie, co nazwa klasy. Konstruktor Java przypomina metodę, która nie ma typu zwracanego. Przerwa kawowa #123.  Konstruktor Java — pytania i odpowiedzi dotyczące rozmowy kwalifikacyjnej — 1Konstruktory odgrywają najważniejszą rolę w inicjalizacji obiektów i w tym artykule wymienimy przykładowe pytania do rozmowy kwalifikacyjnej, które dotyczą konstruktorów w Javie. Dowiesz się także o znaczeniu konstruktorów w Javie, poznasz przykłady kodu i inne ważne szczegóły, które pomogą Ci odpowiedzieć na pytania dotyczące konstruktorów Java podczas rozmowy kwalifikacyjnej.

Dlaczego konstruktorzy są potrzebni? Wyjaśnij szczegółowo

Załóżmy, że mamy klasę o nazwie Student . Mamy nazwę zmiennej instancji i numer_rolki .
class Student{
String name;
int rollNo;
}
Teraz, jeśli utworzymy 1000 obiektów, to JVM zainicjuje te wartości swoim domyślnym typem Name = null i rollNo = 0 . Identyfikacja tych pojedynczych obiektów nie jest możliwa, a przypisanie wartości każdemu z obiektów spowoduje zwiększenie ilości kodu, co jest uważane za złą praktykę programistyczną. Dlatego, aby tego uniknąć, stosuje się konstruktory. Oznacza to, że celem konstruktora w Javie jest inicjacja wartości zmiennych instancji klasy.

Jakie typy konstruktorów są dostępne w Javie?

W Javie istnieją trzy różne typy konstruktorów:
  • Domyślny konstruktor
  • Konstruktor bezargumentowy
  • Konstruktor parametryczny

Co to jest domyślny konstruktor w Javie?

Konstruktor domyślny to konstruktor utworzony przez maszynę JVM w czasie wykonywania, jeśli w klasie nie zdefiniowano żadnego konstruktora. Głównym zadaniem konstruktora domyślnego jest inicjalizacja wartości instancji zgodnie z ich domyślnym typem. Przykładowy konstruktor domyślny w Javie:
class DefaultConstructor{
int id;
String name;
}
Teraz dla tej klasy, jeśli utworzymy obiekt, to wewnątrz JVM będzie domyślny konstruktor, któremu zostanie nadana wartość domyślna.
DefaultConstructor df= new DefaultConstructor();
Teraz, jeśli wydrukujemy wartość, otrzymamy:
Drukuj = df.id = 0.df.name = null.

Co to jest konstruktor bezargumentowy?

Konstruktor bezargumentowy to konstruktor, który można jawnie zdefiniować w celu inicjowania wartości instancji. Na przykład:
class NoArgConstuctor{ int a; int b;

//No Argument Constructor
NoArgConstuctor(){
a = 10;
b = 20;
}

}

Co to jest konstruktor parametryczny?

Konstruktor sparametryzowany to konstruktor, który akceptuje parametr w celu inicjowania instancji. Na przykład:
class ParameterizedConstuctor{
String name;
int age;
//Parameterized Constructor
ParameterizedConstuctor(String name, int age){
this.name = name;
this.age = age;
}
}

Jakie są zasady definiowania konstruktora?

Aby zdefiniować konstruktory, należy przestrzegać kilku zasad:
  • Nazwa konstruktora musi być zgodna z nazwą klasy.

  • W Javie nie powinno być typu zwracanego przez konstruktora.

  • Jedyne obowiązujące modyfikatory dla konstruktorów to:

    • publiczny
    • domyślny
    • chroniony
    • prywatny
  • Konstruktory mogą przyjmować dowolną liczbę parametrów.

  • Modyfikatory final, synchronized, static i Abstract nie są dozwolone w konstruktorze.

  • Konstruktor nie obsługuje instrukcji return w swojej treści.

  • W konstruktorze mogą występować wyjątki w przypadku instrukcji rzutu .

  • Dopuszczalne jest użycie klauzuli rzutów z konstruktorem.

  • Konstruktor nie powinien generować rekurencji.

Kiedy możemy użyć prywatnego konstruktora?

Jeśli nie chcemy tworzyć obiektów określonej klasy z zewnątrz, możemy skorzystać z konstruktorów zamkniętych lub prywatnych. Deklarując konstruktory jako prywatne, możemy tworzyć obiekty tylko wewnątrz klasy. Klasy Singleton są dobrym przykładem wykorzystania prywatnych konstruktorów.

Jaki będzie domyślny modyfikator dostępu konstruktora, jeśli nie zdefiniujemy go jawnie?

Domyślny modyfikator dostępu konstruktora będzie zawsze taki sam, jak modyfikator klasy. Jeśli klasa jest publiczna, konstruktor również będzie publiczny. Jeśli klasa jest prywatna, konstruktor również będzie prywatny. To samo stanie się z innymi modyfikatorami dostępu.

Zapisz wynik poniższego fragmentu kodu i wyjaśnij

class InterviewBit{
InterviewBit(){
System.out.println(" Welcome to InterviewBit ");
}
}
class ScalerAcademy extends InterviewBit{
ScalerAcademy(){
System.out.println(" Welcome to Scaler Academy by InterviewBit");
}
}
class Main{
public static void main(String[] args) {
ScalerAcademy sc = new ScalerAcademy();
}
}
Powyższy kod wyświetli:
Witamy w InterviewBit. Witamy w Akademii Scaler prowadzonej przez InterviewBit.
Otrzymamy ten wynik, ponieważ jeśli nie umieścimy słowa kluczowego super() lub this() w konstruktorze w pierwszej linii, JVM automatycznie umieści je w czasie wykonywania. JVM robi to, ponieważ dziedziczy z innej klasy, a jej funkcjonalność będzie również zaimplementowana w klasie pochodnej. Zatem przypisując wartości domyślne instancjom klasy bazowej, JVM domyślnie dodaje słowo kluczowe super() .

Przejrzyj kod i określ, czy jest ważny, czy nie. Wyjaśnij powód

class InterviewBit{
InterviewBit(){
System.out.println(" Welcome to InterviewBit ");
}
}
class ScalerAcademy extends InterviewBit{
ScalerAcademy(){
this();
System.out.println(" Welcome to Scaler Academy by InterviewBit");
}
}
class Main{
public static void main(String[] args) {
ScalerAcademy sc = new ScalerAcademy();
}
}
Powyższy kod jest nieprawidłowy, ponieważ jest to ten sam konstruktor znajdujący się wewnątrz konstruktora Scaler Academy . Tworzy to rekurencję w konstruktorze, co jest niedozwolone. W związku z tym otrzymamy błąd kompilacji związany z wywołaniem konstruktora rekurencyjnego.

Czy w Javie możemy użyć dwóch konstruktorów w jednej klasie?

Tak, w jednej klasie możemy użyć dowolnej liczby konstruktorów, pod dwoma warunkami:
  • Parametry konstruktora muszą być różne.
  • W konstruktorze nie powinno być rekurencji.
Przykład. Rozważmy dwa konstruktory tej samej klasy InterviewBit :
InterviewBit(){
    this("Scaler"); // Calling parameterized constructor
    System.out.println(" No Argument Constructor");
}
InterviewBit(String name){
    this(); // Calling no-arg constructor
    System.out.println(" Constructor with Parameters.");
}
Ten kod jest nieprawidłowy, ponieważ spowoduje utworzenie rekurencji. Konstruktor bez argumentów wywoła konstruktor z parametrami, a konstruktor z parametrami wywoła konstruktor bez argumentów.

Czy możemy zastąpić konstruktora w Javie?

Nie, koncepcja przeciążania konstruktora nie ma zastosowania w Javie.

Czy konstruktor może być ostateczny w Javie?

Żaden konstruktor nie może być ostateczny. Dzieje się tak, ponieważ końcowe słowa kluczowe służą do zatrzymania przesłaniania metody w klasie pochodnej. Ale w konstruktorze koncepcja przesłaniania nie ma zastosowania, więc nie ma potrzeby zapisywania słowa kluczowego final . Jeśli napiszemy słowo kluczowe final w konstruktorze, otrzymamy błąd w czasie kompilacji zwany wymaganym typem zwracanym , ponieważ kompilator traktuje to jako metodę.

Czy konstruktor może być statyczny w Javie?

Nie, konstruktor Java nie może być statyczny. Dzieje się tak, ponieważ statyczne słowa kluczowe są używane, gdy chcemy, aby członek należał do klasy, a nie do obiektu. Ale konstruktory mają za zadanie inicjować obiekty, więc kompilator potraktuje je jako metodę. Otrzymamy wymagany błąd typu zwrotu .

Opisz różnicę pomiędzy super(), super i this(), this

super() i this() są wywołaniami konstruktorów. Służy tylko do wywołania konstruktora klasy nadrzędnej lub bieżącej klasy. Należy pamiętać, że „super” i „this” to słowa kluczowe używane do wyznaczania elementów instancji własnej klasy lub klasy bazowej. Rozważ poniższy kod:
class InterviewBit{
    String message = " Welcome to InterviewBit";
}
public class Scaler extends InterviewBit
{
    String message = " Welcome to Scaler Academy";
    public void printMethod(){
        //this will print the message variable of the current class.
        System.out.println(this.message);

        //this will print the message variable of Base class.
        System.out.println(super.message);
    }
	public static void main(String[] args) {
		Scaler sa = new Scaler();
		sa.printMethod();
	}
}
W tym fragmencie kodu this.message wyświetli komunikat „ Witamy w Scaler Academy ”, a super.message wyświetli „ Witamy w InterviewBit ”. W ten sposób te dwa słowa kluczowe są używane w odniesieniu do instancji składowych klasy podstawowej i pochodnej.

Co to są destruktory? Czy w Javie istnieje destruktor?

Destruktory służą do zwalniania pamięci nabytej przez program. Na przykład, jeśli program potrzebuje pamięci podczas jego wykonywania, destruktor zwalnia tę pamięć, aby inne programy mogły z niej korzystać. W Javie nie ma koncepcji destruktora, ponieważ zwalnianiem pamięci w Javie zajmuje się moduł zbierający elementy bezużyteczne.

Co to jest łączenie konstruktorów w Javie?

Kiedy jeden konstruktor jest wywoływany z innego konstruktora, można to nazwać łączeniem konstruktorów. Wywołanie konstruktora nie musi być wykonane w tej samej klasie. Można to zrobić również dla klasy nadrzędnej. Rozważmy na przykład poniższy obrazek. Przerwa kawowa #123.  Konstruktor Java — pytania i odpowiedzi dotyczące rozmowy kwalifikacyjnej — 2Następnie możemy przyjrzeć się kodowi, aby zainicjować obiekt wartościami tych zmiennych instancji:
class EmployeeAddess{
    int pinCode;
    String address;
    String mobNo;
    EmployeeAddress(int pinCode, String address, String mobNo){
        this.pinCode = pinCodel
        this.address = address;
        this.mobNo = mobNo;
    }
}
class Employees extends EmployeeAddress{
    int ID;
    String name;
    String designation;
    String department;
    Employee(int ID, String name, String designation,String department,
                    int pinCode, String address, String mobNo){

        //Calling Constructor for Base class to initialize the object.
        //This can be a constructor chaining.
        super(pinCode, address, mobNo);
        this.ID = ID;
        this.name = name;
        this.designation = designation;
        this.department = department;
    }
}
public class Main{
    Employee emp = new Employee(101, "XYX", "SDE", "Cloud", 123456, "no 150, xys, xys, INDIA", "999999999");
}
W powyższym kodzie tworzymy obiekt klasy Pracownik zawierający dane pracownika i jego adres. Klasa adresu pracownika jest dziedziczona przez klasę pracownika . Teraz, aby utworzyć instancję wartości obiektu dla adresu, nie przypisujemy jawnej wartości do adresu pracownika. Zamiast tego używamy w tym celu konstruktora klasy Worker Address . Za pomocą super(argumentów) tworzymy łańcuch konstruktorów inicjujących wartości. Tym właśnie jest łańcuch konstruktorów.

Określ wynik programu na podstawie kodu i wyjaśnij swoją odpowiedź.

class InterviewBit{
void InterviewBit(){
System.out.println(" Java Constructor interview questions by InterviewBit");
}
int InterviewBit(int val){
System.out.println(" Java Constructor. And Value = "+val);
}
}
public class Main{
InterviewBit ib1 = new InterviewBit();
InterviewBit ib2 = new InterviewBit();
}
Powyższy kod niczego nie wydrukuje, ponieważ InterviewBit() nie jest tutaj konstruktorem. Ponieważ używane są słowa kluczowe Void i int , staje się to metodą. Dlatego nie wywołujemy tej metody. Nie otrzymamy żadnego wyniku, ponieważ aby wykonać metodę, musimy ją jawnie wywołać na obiekcie.

Napisz program kopiujący wartości obiektu do nowego obiektu za pomocą konstruktora

class Rectangle{
    int length;
    int breadth;
    Rectangle(int length, int breadth){
        this.length = length;
        this.breadth = breadth;
    }

    //Overloaded Constructor for copying the value of old Object to new object
    Rectangle(Rectangle obj){
        this.length = obj.length;
        this.breadth = obj.breadth;
    }
}
public class Main{
    Rectangle obj1 = new Rectangle(10, 5);

    //New Object of rectangle class will be created with the value from obj1.
    Rectangle obj2 = new Rectangle(obj1);
}
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION