JavaRush /Blog Java /Random-VI /Nghỉ giải lao #123. Java Constructor - Câu hỏi và trả lời...

Nghỉ giải lao #123. Java Constructor - Câu hỏi và trả lời phỏng vấn kỹ thuật

Xuất bản trong nhóm
Nguồn: Hackenoon

Trình xây dựng là gì?

Trình xây dựng là một phương thức đặc biệt được định nghĩa trong một lớp có cùng tên với tên lớp. Hàm tạo Java giống như một phương thức không có kiểu trả về. Nghỉ giải lao #123.  Java Constructor - Hỏi đáp phỏng vấn kỹ thuật - 1Hàm tạo đóng vai trò quan trọng nhất trong việc khởi tạo đối tượng và trong bài viết này, chúng tôi sẽ liệt kê các câu hỏi phỏng vấn mẫu liên quan đến hàm tạo trong Java. Bạn cũng sẽ tìm hiểu về tầm quan trọng của hàm tạo trong Java, xem các ví dụ về mã và các chi tiết quan trọng khác sẽ giúp bạn trả lời các câu hỏi về hàm tạo Java trong một cuộc phỏng vấn.

Tại sao cần có constructor? Giải thích chi tiết

Giả sử chúng ta có một lớp có tên là Sinh viên . Và chúng ta có tên biến thể hiện và roll_number .
class Student{
String name;
int rollNo;
}
Bây giờ, nếu chúng ta tạo 1000 đối tượng thì JVM sẽ khởi tạo các giá trị này với kiểu mặc định là Name = nullrollNo = 0 . Việc xác định các đối tượng riêng lẻ này là không thể và việc gán giá trị cho từng đối tượng sẽ làm tăng số lượng mã, điều này được coi là cách lập trình kém. Vì vậy, để tránh điều này, các hàm tạo được sử dụng. Nghĩa là, mục đích của hàm tạo trong Java là khởi tạo giá trị của các biến thể hiện của lớp.

Có những loại hàm tạo nào trong Java?

Có ba loại hàm tạo khác nhau trong Java:
  • Nhà xây dựng mặc định
  • Trình xây dựng không có đối số
  • Trình xây dựng tham số

Trình xây dựng mặc định trong Java là gì?

Trình xây dựng mặc định là một hàm tạo được tạo bởi JVM trong thời gian chạy nếu không có hàm tạo nào được xác định trong lớp. Công việc chính của hàm tạo mặc định là khởi tạo các giá trị của các thể hiện theo kiểu mặc định của chúng. Ví dụ về hàm tạo mặc định trong Java:
class DefaultConstructor{
int id;
String name;
}
Bây giờ đối với lớp này, nếu chúng ta tạo một đối tượng thì bên trong JVM sẽ có một hàm tạo mặc định được cung cấp một giá trị mặc định.
DefaultConstructor df= new DefaultConstructor();
Bây giờ nếu chúng ta in giá trị chúng ta sẽ nhận được:
In = df.id = 0.df.name = null.

Trình xây dựng không có đối số là gì?

Hàm tạo không có đối số là hàm tạo có thể được xác định rõ ràng để khởi tạo giá trị của các thể hiện. Ví dụ:
class NoArgConstuctor{ int a; int b;

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

}

Trình xây dựng tham số là gì?

Hàm tạo được tham số hóa là hàm tạo chấp nhận một tham số để khởi tạo các thể hiện. Ví dụ:
class ParameterizedConstuctor{
String name;
int age;
//Parameterized Constructor
ParameterizedConstuctor(String name, int age){
this.name = name;
this.age = age;
}
}

Các quy tắc để xác định một hàm tạo là gì?

Để xác định hàm tạo, bạn phải tuân theo một số quy tắc:
  • Tên hàm tạo phải khớp với tên lớp.

  • Không nên có kiểu trả về hàm tạo trong Java.

  • Công cụ sửa đổi duy nhất có thể áp dụng cho hàm tạo là:

    • công cộng
    • mặc định
    • được bảo vệ
    • riêng tư
  • Các nhà xây dựng có thể lấy bất kỳ số lượng tham số.

  • Các công cụ sửa đổi cuối cùng, đồng bộ hóa, tĩnh và trừu tượng không được phép trong hàm tạo.

  • Hàm tạo không hỗ trợ câu lệnh return trong phần thân của nó.

  • Có thể có ngoại lệ với câu lệnh ném trong hàm tạo .

  • Có thể chấp nhận sử dụng mệnh đề ném với hàm tạo.

  • Hàm tạo không được tạo đệ quy.

Khi nào chúng ta có thể sử dụng hàm tạo riêng?

Nếu chúng ta không muốn tạo các đối tượng của một lớp nhất định từ bên ngoài, chúng ta có thể sử dụng các hàm tạo đóng hoặc riêng. Bằng cách khai báo các hàm tạo là riêng tư, chúng ta chỉ có thể tạo các đối tượng trong lớp. Các lớp Singleton là một ví dụ điển hình về việc sử dụng các hàm tạo riêng.

Công cụ sửa đổi truy cập hàm tạo mặc định sẽ là gì nếu chúng ta không xác định nó một cách rõ ràng?

Công cụ sửa đổi truy cập mặc định của hàm tạo sẽ luôn giống với công cụ sửa đổi lớp. Nếu lớp là công khai thì hàm tạo cũng sẽ công khai. Nếu lớp là riêng tư thì hàm tạo cũng sẽ riêng tư. Điều tương tự sẽ xảy ra với các công cụ sửa đổi quyền truy cập khác.

Viết đầu ra của đoạn mã dưới đây và giải thích

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();
}
}
Đoạn mã trên sẽ in:
Chào mừng đến với InterviewBit. Chào mừng bạn đến với Học viện Scaler của InterviewBit.
Chúng ta sẽ nhận được kết quả đầu ra này vì nếu chúng ta không đưa từ khóa super() hoặc this() vào hàm tạo ở dòng đầu tiên, JVM sẽ tự động đưa nó vào khi chạy. JVM thực hiện điều này vì nó kế thừa từ một lớp khác và chức năng của nó cũng sẽ được triển khai trong lớp dẫn xuất. Do đó, khi gán giá trị mặc định cho các thể hiện của lớp cơ sở, JVM sẽ thêm từ khóa super() theo mặc định .

Xem lại mã và cho biết nó hợp lệ hay không hợp lệ. Giải thích lý do

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();
}
}
Đoạn mã trên không hợp lệ vì nó là cùng một hàm tạo bên trong hàm tạo của Scaler Academy . Điều này tạo ra sự đệ quy trong hàm tạo, điều này không được phép. Theo đó, chúng ta sẽ nhận được lỗi biên dịch liên quan đến lệnh gọi hàm tạo đệ quy.

Chúng ta có thể sử dụng hai hàm tạo trong một lớp trong Java không?

Có, chúng ta có thể sử dụng số lượng hàm tạo bất kỳ trong một lớp, với hai điều kiện:
  • Các tham số của hàm tạo phải khác nhau.
  • Không nên có đệ quy trong hàm tạo.
Ví dụ. Hãy xem xét hai hàm tạo của cùng một lớp 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.");
}
Mã này không hợp lệ vì nó sẽ tạo đệ quy. Hàm tạo không có đối số sẽ gọi hàm tạo có tham số và hàm tạo có tham số sẽ gọi hàm tạo không có đối số.

Chúng ta có thể ghi đè hàm tạo trong Java không?

Không, khái niệm nạp chồng hàm tạo không áp dụng được trong Java.

Hàm tạo có thể là cuối cùng trong Java không?

Không có hàm tạo nào có thể là cuối cùng. Điều này là do các từ khóa cuối cùng được sử dụng để ngừng ghi đè một phương thức trong lớp dẫn xuất. Nhưng trong một hàm tạo, khái niệm ghi đè không được áp dụng nên không cần phải viết từ khóa cuối cùng . Nếu chúng ta viết từ khóa cuối cùng trong hàm tạo, chúng ta sẽ gặp lỗi thời gian biên dịch được gọi là kiểu trả về bắt buộc vì trình biên dịch coi nó như một phương thức.

Hàm tạo có thể tĩnh trong Java không?

Không, hàm tạo Java không thể tĩnh. Điều này là do từ khóa tĩnh được sử dụng khi chúng ta muốn một thành viên thuộc về một lớp chứ không phải một đối tượng. Nhưng các hàm tạo có nghĩa là khởi tạo các đối tượng, vì vậy trình biên dịch sẽ coi nó như một phương thức. Chúng tôi sẽ nhận được lỗi kiểu trả về bắt buộc .

Mô tả sự khác biệt giữa super(), super và this(), this

super()this() là các lệnh gọi hàm tạo. Nó chỉ được sử dụng để gọi hàm tạo của lớp cha hoặc lớp hiện tại. Lưu ý rằng “super” và “this” là các từ khóa được sử dụng để chỉ định các thành viên của một thể hiện của lớp riêng hoặc lớp cơ sở. Hãy xem xét đoạn mã dưới đây:
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();
	}
}
Trong đoạn mã này, this.message sẽ in thông báo “ Chào mừng đến với Học viện Scaler ” và super.message sẽ in “ Chào mừng đến với InterviewBit ”. Đây là cách hai từ khóa này được sử dụng để chỉ các thể hiện thành viên của lớp cơ sở và lớp dẫn xuất.

Công cụ hủy diệt là gì? Hàm hủy có tồn tại trong Java không?

Hàm hủy được sử dụng để giải phóng bộ nhớ mà chương trình có được. Ví dụ: nếu một chương trình cần bộ nhớ trong quá trình thực thi, hàm hủy sẽ giải phóng bộ nhớ đó để các chương trình khác có thể sử dụng nó. Không có khái niệm về hàm hủy trong Java vì công việc giải phóng bộ nhớ trong Java được xử lý bởi trình thu gom rác.

Chuỗi hàm tạo trong Java là gì?

Khi một hàm tạo được gọi từ một hàm tạo khác, điều này có thể được gọi là chuỗi hàm tạo. Lệnh gọi hàm tạo không nhất thiết phải được thực hiện trên cùng một lớp. Điều này cũng có thể được thực hiện cho lớp cha. Ví dụ, hãy xem xét hình ảnh dưới đây. Nghỉ giải lao #123.  Java Constructor - Câu hỏi và trả lời phỏng vấn kỹ thuật - 2Tiếp theo, chúng ta có thể xem mã để khởi tạo đối tượng với các giá trị giá trị của các biến thể hiện này:
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");
}
Trong đoạn mã trên, chúng ta đang tạo một đối tượng lớp Nhân viên với thông tin chi tiết về nhân viên và địa chỉ của anh ta. Lớp địa chỉ Nhân viên được kế thừa bởi lớp Nhân viên . Bây giờ, để khởi tạo một giá trị đối tượng cho một địa chỉ, chúng ta không gán một giá trị rõ ràng cho địa chỉ của nhân viên. Thay vào đó, chúng tôi sử dụng hàm tạo của lớp Địa chỉ nhân viên để thực hiện việc này . Và với sự trợ giúp của super(arguments), chúng ta tạo thành một chuỗi hàm tạo để khởi tạo các giá trị. Chuỗi xây dựng là như vậy.

Xác định đầu ra của chương trình từ mã và giải thích câu trả lời của bạn.

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();
}
Đoạn mã trên sẽ không in bất cứ thứ gì vì InterviewBit() không phải là hàm tạo ở đây. Vì từ khóa Voidint được sử dụng nên nó trở thành một phương thức. Vì vậy chúng tôi không gọi phương thức này. Chúng ta sẽ không nhận được bất kỳ đầu ra nào vì để thực thi phương thức, chúng ta cần gọi nó một cách rõ ràng trên đối tượng.

Viết chương trình sao chép các giá trị của một đối tượng vào một đối tượng mới bằng cách sử dụng hàm tạo

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);
}
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION