Top những câu hỏi phỏng vấn Java SE - 02

  • Phuong Dang
  • 10/Nov/2022
Java Basics Java OOP
  1. Access modifier là gì và phân loại.
  2. Tại sao phải dùng getter và setter/accessors?
  3. Tại sao Java lại cho phép overload constructor?
  4. Static method là gì?
  5. Tại sao static method không gọi được instance method/instance variable?
  6. Trong Java có đa kế thừa không?
  7. So sánh overload và override
  8. Override method có những rule nào
  9. So sánh từ khóa this và super

Trong bài viết này mình sẽ tổng hợp những câu hỏi phỏng vấn Java SE - Section Java OOP cho đối tượng Fresher.

Java SE 8

1. Access modifier là gì và phân loại

Access modifier được dùng để chỉ định phạm vi truy cập class, constructor, method, variable trong Java. Có 4 loại access modifier:

Can access private default
(package private)
protected public
Member trong cùng 1 class YES YES YES YES
Member khác class nhưng cùng package NO YES YES YES
Member bên trong parent class và khác package NO NO YES YES
Member bên trong non-parent class và khác package NO NO NO YES

Access modifier là "default" khi ta không chỉ định cụ thể là public, protected, private chứ không phải dùng từ khóa default

2. Tại sao phải dùng getter và setter/accessors?

Có nhiều lý do chúng ta cần sử dụng getter và setter:

  • Tránh việc gán untrusted/invalid data trực tiếp vào variable, bằng cách đi qua setter để validate.
  • Format hoặc che giấu data trước khi return về nếu muốn, bằng cách truy cập data thông qua getter.
  • Trong trường hợp tại thời điểm tạo getter/setter nhưng cũng chưa cung cấp tính năng gì, thì đó là một cách thiết kế phòng ngừa cho tương lai. Nếu sau này thay đổi thì chỉ sửa getter/setter mà không ảnh hưởng đến những chỗ đang sử dụng getter/setter đó.
  • Cho phép cung cấp level truy vấn khác nhau: ví dụ như read-only thì sẽ private variable và chỉ cung cấp getter.

3. Tại sao Java lại cho phép overload constructor?

Mỗi constructor là một cách thức khởi tạo object của một class. Việc overload constructor tức là chúng ta đang đa dạng hóa cách thức khởi tạo và cho phép tạo object thông qua nhiều cách phụ thuộc vào lượng data đang có ở thời điểm khởi tạo.

4. Static method là gì?

Static method là method được khai báo cùng từ khóa static. Static method được dùng với 2 mục đích chính như sau:

  • Các method dạng utility/helper mà không yêu cầu state của object, không cần access đến các instance member. Thì với static method ta có thể truy cập nhanh thông qua class name mà không cần khởi tạo instance chỉ để gọi đến method đó.
  • Với những state mà cần giống nhau giữa toàn bộ instance của class, thì nên sử dụng static method ví dụ như method đó return giá trị dạng counter.

5. Tại sao static method không gọi được instance method/instance variable?

Static method không thể gọi đến instance method và instance variable, bởi vì một static method có thể được gọi thông qua class mà không cần khởi tạo bất kỳ object nào trong khi instance member lại phụ thuộc vào object.

Cùng với lý do đó thì this cũng không thể được sử dụng bên trong static method vì this đại diện cho 1 object của class.

6. Trong Java có đa kế thừa không?

Đa số các bạn đã sẽ trả lời là: Không. Tuy nhiên câu trả lời này không hoàn toàn đúng. Trong Java kế thừa được thể hiện thông qua 3 hình thức:

  1. class extend một class khác
  2. class implement một hoặc nhiều interface
  3. interface extend một hoặc nhiều interface

Với kiểu số [1] thì đúng là class không thể extend nhiều class cùng 1 lúc, nói cách khác là 1 class không thể có nhiều parent class. Java giải quyết vấn đề này bằng cách cho phép class kế thừa nhiều tầng (multilevel inheritance)

Còn với kiểu số [2], [3] thì đa kế thừa vì chúng ta có thể implement nhiều interface, extend nhiều interface.

Kết luận: Trong Java không cho phép multiple inheritance of state, nhưng cho phép đa kế thừa multiple inheritance of implementationmultiple inheritance of type

Trường hợp này không nên đơn thuẩn trả lời hoặc không mà hãy giải thích cụ thể như trên. Bởi vì ngay từ đầu câu hỏi đã mơ hồ và không rõ ràng.

7. So sánh overload và override

Cả overloadoverride đều thể hiện cho tính đa hình trong Java. Nó đều là cách định nghĩa lại một method đã có sẵn với nhưng khác nhau về xử lý với cùng 1 method name. Một số điểm khác nhau:

overload override
Đa hình compile time Đa hình runtime
Overload xảy ra trong cùng 1 class hoặc ở child class (khi có kế thừa) Override xảy ra trong child class (khi có kế thừa)
Tham số phải khác nhau: khác về số lượng hoặc kiểu dữ liệu Tham số phải giống nhau
Access modifier có thể giống hoặc khác Access modifier phải có phạm vi truy cập >= access modifier của method trong parent class
return type có thể giống hoặc khác return type phải giống hoặc là sub-type đã định nghĩa của method trong parent class

8. Override method có những rule nào

Override method cần phải tuân thủ các rule như sau:

  • Method trong child class phải có method name + parameter giống với method trong parent class
  • Method trong child class phải có phạm vi truy cập (access modifier) >= phạm vi truy cập của method trong parent class.
    Ví dụ: method trong parent class định nghĩa default thì class con có thể định nghĩa default, protected, public
  • Method trong child class không được throw ra một checked exception mới hoặc rộng hơn checked exception đã định nghĩa của method trong parent class
  • Return type trong child class phải giống hoặc là subclass của return type được định nghĩa trong method của parent class

9. So sánh từ khóa this và super

this supper
Đại diện cho instance hiện tại của class Đại diện cho instance hiện tại của parent class
Có thể sử dụng để access các instance variable & instance method của class đó Có thể sử dụng để access các instance variable & instance method của parent class đó