Trong phần trước, mình đã liệt kê một số câu hỏi về Java khi phỏng vấn. Tuy nhiên, khi phỏng vẫn chúng ta cũng sẽ bắt gặp những câu hỏi về lập trình hướng đối tượng - OOP. Trong phần này hãy cùng xem những câu hỏi phỏng vấn Java phần OOP nhé.

1. Tính đa hình là gì?

Tính đa hình được mô tả ngắn gọn là "One interface, many implementations". Nó là một đặc điểm của việc có thể gán một ý nghĩa hoặc cách sử dụng khác cho một thứ gì đó trong các ngữ cảnh khác nhau, cụ thể là cho phép một thực thể chẳng hạn như một biến, một hàm hoặc một đối tượng có nhiều hơn một dạng.

Có hai loại đa hình:

  • Đa hình lúc compile time: thể hiện qua method overloadding (nạp chồng phương thức)
  • Đa hình lúc runtime: thể hiện qua kế thừa và interface

2. Runtime polymorphism là gì?

Runtime polymorphism hay còn được gọi là dynamic method dispatch.Ví dụ của đa hình lúc runtime là method overriding (Ghi đè phương thức). Khi class cha tham chiếu đến object của class con, method sẽ được xác định tại runtime. Nghĩa là nếu chúng ta gọi đến method có sẵn ở class cha và được class con định nghĩa lại thì trình biên dịch sẽ gọi method của class con.

Hãy xem ví dụ dưới đây:

class Car{
    void run(){
        System.out.println("Car is running");
    }
}
class Audi extends Car{
    void run(){
        System.out.println("Audi is running safely with 100km");
    }

    public static void main(String[] args){
        Car car = new Audi();
        car.run();
    }
}

Kết quả nhận được:

Audi is running safely with 100km

3. Tính trừu tượng trong Java là gì?

Tính trừu tượng đề cập đến việc xử lý các ý tưởng hơn là sự kiện. Về cơ bản, nó giải quyết việc ẩn các chi tiết và hiển thị những thứ cần thiết cho người dùng. Vì vậy, bạn có thể nó rằng tính từu tượng trong Java là quá trình ẩn các chi tiết triển khai khỏi người dùng và chỉ lộ chi tiết chức năng cho họ.

Có thể đạt được tính trừu tượng theo hai cách:

  • Sử dụng lớp abstract
  • Sử dụng interface

4. Sự khác biệt giữa class abstract và interface

Abstract classInterface
Không hỗ trợ đa kế thừaMột class có thể implements nhiều interface
Có thể định nghĩa thân của phương thức, propertyKhông thể định nghĩa code xử lý, chỉ có thể khai báo
Có thể các định phạm vi truy cậpMọi phương thức, property đều mặc định là public
Một lớp trừu tượng có thể chứa các constructorKhông chứa constructor
Một lớp trừu tượng có thể chứa biến instanceKhông thể chứa biến instance

5. Tính kế thừa trong Java là gì?

Kế thừa trong Java là khái niệm trong đó các thuộc tính, phương thức của một lớp có thể được kế thừa bởi một lớp khác. Nó giúp sử dụng lại mã và thiết lập mối quan hệ giữa các lớp khác nhau. Sự kế thừa được ttheer hiện giữa hai loại lớp:

  • Super class (Base class - lớp cha)
  • Subclass (Derived class - lớp con)

Một lớp kế thừa các thuộc tính, phương thức được gọi là subclass, lớp có các thuộc tính, phương thức được kế thừa được gọi là super class.

6. Các kiểu kế thừa trong Java

Java hỗ trợ 4 kiểu kế thừa:

  • Đơn kế thừa: Một lớp kế thừa các thuộc tính, phương thức cảu lớp khác, tức là sẽ chỉ có một lớp cha và một lớp con
  • Kế thừa thứ bậc: Khi có nhiều hơn một lớp con hay nói cách khác, nhiều lớp con cùng kế thừa một lớp cha
  • Kế thừa đa cấp: Lớp con kế thừa các tính năng của lớp cha và dồng thời lớp con này lại hoạt động như một lớp cha cho lớp con khác.
  • Kế thừa lai: Sự kết hợp của hai hay nhiều kiểu kế thừa.
  • Đa kế thừa: Khi có một lớp con được kế thừa từ hai hay nhiều lớp cha.

Tuy nhiên, trong Java không hỗ trợ kế thừa lai và đa kế thừa mà chúng chỉ có thể được thực hiện thông qua interface

7. Nạp chồng phương thức và ghi đè phương thức là gì?

  • Nạp chồng phương thức: Các phương thức có cùng tên, cùng nằm trong một class nhưng khác nhau về tham số (Số lượng tham số và kiểu dữ liệu của tham số) thì được gọi là nạp chồng phương thức
  • Ghi đè phương thức: Nếu lớp con có cùng phương thức được khai báo trong lớp cha, nó được gọi là ghi đè phương thức.

image

8. Có thể ghi đè phương thức private hoặc static trong Java không?

Không thể ghi đè phương thức private hoặc static trong Java. Nếu tạo một phương thức có cùng kiểu trả về, cùng tham số trong lớp con thì nó sẽ ẩn phương thức của lớp cha. Tương tự, cũng không thể ghi đè một phương thức private trong lớp con vì ta không thể truy cập được phương thức đó tại lớp con, những gì có thể làm chỉ là tạo ra một phương thức khác có cùng tên với phương thức của lớp cha trong lớp con.

9. Đa kế thừa là gì? Tại sao nó không được hỗ trợ trong Java?

Nếu có một lớp con kế thừa các thuộc tính từ hai hay nhiêu lớp cha thì nó được gọi là đa kế thừa. Tuy nhiên, Java không hỗ trợ đa kế thừa.

Vẫn đề với đa kế thừa là nếu nhiều lớp cha có cùng tên phương thức, thì trong lúc runtime, trình biên dịch sẽ khó quyết định phương thức nào sẽ được thực thi từ lớp con. Do đó, java không hỗ trợ đa kế thừa. Bài toán này được gọi là bài toán kim cương (Diamond Problem).

image

10. Tính đóng gói trong Java là gì?

Đóng gói là một cơ chế mà bạn liên kết dữ liệu (biến) và mã (phương thức) với nhau như một đơn vị duy nhất. Ở đây, dữ liệu được ẩn khỏi thế giới bên ngoài và chỉ có thể được truy cập thông qua các phương thức lớp hiện tại. Điều này giúp bảo vệ dữ liệu khỏi bất kỳ sửa đổi không cần thiết nào.

Có thể đạt được tính đóng gói trong Java bằng cách:

  • Khai báo các biến của class là private
  • Cung cấp các phương thức gettersetter để đọc và ghi giá trị của các biến.

11. Association là gì?

Association là một mối qua hệ mà tất cả các đối tượng có vòng đời riêng của chúng và không có chủ sở hữu. Ví dụ như quan hệ giữa giảng viên và học viên: Một học viên thì sẽ được nhiều giảng viên dạy và một giảng viên thì sẽ dạy nhiều học viên nhưng không có quyền sở hữu giữa các đối tượng và cả hai đều có vòng đời riêng.

12. Aggregation là gì?

Aggregation cũng giống như association, nhưng khác là aggregation có mối quan hệ sở hữu. Ví dụ như quan hệ giữa Khoa và giảng viên, một giảng viên chỉ thuộc về một khoa, nhưng nếu loại bỏ giảng viên ra khỏi kha thì khoa đó vẫn tồn tại.

13. Composition là gì?

Composition là một dạng đặc biệt của aggregation. Đối tượng con không có vòng đời và nếu đối tượng cha loại bỏ tất cả đối tượng con thì đối tượng cha cũng sẽ bị loại bỏ. Ví dụ như trong một ngôi nhà có nhiều căn phòng, nếu chúng ra dỡ bỏ tất cả các căn phòng đó thì ngôi nhà cũng bị dỡ bỏ

14. Dependency là gì?

Dependency là mối quan khi một đối tượng A phụ thuộc vào đối tượng B. Những thay đổi ở đối tượng B có thể ảnh hưởng đến đối tượng A. Ví dụ như ta có đối tượng khách hàng và đơn hàng. Khi thay đổi thông tin khách hàng ví dụ như kiểu dữ liệu của id khách hàng thì tại đơn hàng thông tin id của khách hàng cũng phải thay đổi theo

15. Interface Marker trong Java?

Marker Interface là một interface không có bất kỳ phương thức và thuộc tích nào bên trong nó. Nó cung cấp thông tin run-time type về object, vì vậy compiler và JVM có thêm thông tin về đối tượng thể thực hiện một số hoạt động hữu ích. Một số Marker Interface trong Java: Serializable, Cloneable,...

Một marker interface còn được gọi là một tagging interface.

Ví dụ:

public interface Serializable{
}

16. Cloning object trong java?

Nhân bản object là quá trình tạo ra một bản sao của một đối tượng. Về cơ bản nó có nghĩa là khả năng tạo ra một đối tượng có trạng thái tương tự với đối tượng ban đầu.

Để đạt được điều này, Java cung cấp phương thức clone(), clone () tiết kiệm tác vụ xử lý bổ sung để tạo ra một bản sao chính xác của một đối tượng. Nếu chúng ta thực hiện nó bằng cách sử dụng từ khoá new sẽ mất rất nhiều tiến trình xử lý được thực hiện, đó là lý do tại sao chúng ta sử dụng object cloning.

17. Copy Constructor trong java là gì?

Copy constructor trong Java là một constructor dùng để khởi tạo một object trong đó sử dụng một object khác có cùng kiểu dữ liệu.

Copy constructor sẽ hữu ích khi chúng ta muốn sao chép dữ liệu từ một object (các giá trị của các trường bên trong object) khác sang một object mới.

Để triển khai một copy constructor thì chúng ta cần tạo một constructor với tham số đầu vào là một object có cùng kiểu dữ liệu. Sau đó tiến hành khởi tạo giá trị của từng thuộc tính bên trong tương ứng với giá trị của object được truyền vào

public class Person {
    private String name;
    private int age;

    public Person(Person person) {
        this.name = person.name;
        this.age = person.age;
    }
}

18.Constructor overloading trong Java

Trong Java, constructor overloading là một kỹ thuật thêm bất kỳ số lượng constructor nào vào một lớp, mỗi constructor sẽ có danh sách tham số khác nhau. Trình biên dịch sẽ sử dụng số lượng tham số và kiểu của chúng trong một danh sách để phân biệt các constructor được nạp chồng

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }

    public Person(int age) {
        this.age = age;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}