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
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 |
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
Có nhiều lý do chúng ta cần sử dụng getter và setter:
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.
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:
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.
Đ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:
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 implementation và multiple inheritance of type
Trường hợp này không nên đơn thuẩn trả lời có
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.
Cả overload
và override
đề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 |
Override method cần phải tuân thủ các rule như sau:
default
thì class con có thể định nghĩa default
, protected
, public
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 đó |