Dưới đây là tập hợp các câu hỏi câu hỏi phỏng vấn Java thường gặp và lập trình hướng đối tượng (OOP). Một số câu hỏi có kèm đoạn code để thử thách kỹ năng lập trình của bạn. Hãy thử sức với những câu hỏi này và chia sẻ với mọi người nếu bạn thấy chúng hữu ích.
Câu hỏi phỏng vấn Java phổ biến
Chú ý: Một số câu hỏi sẽ có nhiều hơn một đáp án đúng.
1. Cách nào dưới đây là hợp lệ để khởi tạo một mảng trong Java?
- int myArray [] = {1, 3, 5};
- int myArray [] [] = {1,2,3,4};
- int [] myArray = (5, 4, 3);
- int [] myArray = {“1”, “2”, “3”};
Đáp án đúng: A
int [] myArray = {“1”, “2”, “3”};
không hợp lệ vì String không thể chuyển đổi sang int.
int [] myArray = (5, 4, 3);
không hợp lệ vì các phần tử của mảng phải được đặt trong cặp dấu ngoặc nhọn {}
.
int myArray [] [] = {1,2,3,4};
không hợp lệ vì myArray
là một mảng hai chiều, trong khi ở đây nó đang được định nghĩa như một mảng một chiều. Trình biên dịch sẽ báo lỗi Type mismatch: cannot convert from int to int[]
.
2. Từ khóa nào dưới đây là reserved keyword trong Java?
- array
- goto
- null
- int
Đáp án đúng: B, D
goto
và int
là các reserved keyword (từ khóa dành riêng, không thể dùng làm tên biến) trong Javarray
và null
không phải là từ khóa.
3. Điều gì sẽ xảy ra nếu ta cố gắng biên dịch và chạy chương trình dưới đây?
interface Foo{ int x = 10;}
public class Test {
public static void main(String[] args) {
Foo.x = 20;
System.out.println(Foo.x);
}
}
- In ra 10
- In ra 20
- Lỗi Compile Time
- Lỗi Runtime vì
Foo.x
là final.
Đáp án đúng: C
Theo mặc định, mọi trường (field) trong một interface đều là public, static, và final. Do đó, chúng ta không thể thay đổi giá trị của nó, dẫn đến lỗi biên dịch tại câu lệnh Foo.x = 20;
.
4. Kết quả của chương trình dưới đây là gì?
public class Test {
public static void main(String[] args) {
char c = 65;
System.out.println("c = " + c);
}
}
- Lỗi Compile Time
- In ra “c = A”
- Lỗi Runtime
- In ra “c = 65”
Đáp án đúng: B
Trình biên dịch Java sẽ tự động cố gắng chuyển đổi kiểu int sang kiểu char. Vì 65 được chuyển thành ký tự A, nên kết quả sẽ là “c = A”. Phạm vi giá trị của kiểu char là từ u0000 đến uffff. Do đó, char c = 65;
hợp lệ, nhưng char c = 65536;
sẽ gây ra lỗi biên dịch.
5. Kết quả của chương trình dưới đây là gì?
public class Test {
public void main(String[] args) {
int x = 10*20-20;
System.out.println(x);
}
}
- Lỗi Runtime
- In ra 180
- In ra 0
- Lỗi lúc biên dịch.
Đáp án đúng: A
Chương trình sẽ báo lỗi Runtime vì phương thức main
không phải là statiThông báo lỗi sẽ là: Error: Main method is not static in class Test, please define the main method as: public static void main(String[] args)
6. Những phát biểu nào sau đây là đúng về từ khóa static trong Java?
- Chúng ta có thể có khối static trong một class.
- Khối static trong một class được thực thi mỗi khi một đối tượng của class đó được tạo.
- Chúng ta có thể có các phương thức static được triển khai trong interface.
- Chúng ta có thể định nghĩa khối static bên trong một phương thức.
Đáp án đúng: A, C
Chúng ta có thể có một khối static trong class, và nó chỉ được thực thi một lần khi class được loaKể từ Java 8, chúng ta có thể triển khai các phương thức static trong interface.
7. Chọn tất cả các khái niệm cốt lõi của Lập trình Hướng đối tượng (OOP).
- Abstraction (Trừu tượng hóa)
- Inheritance (Kế thừa)
- Interface (Giao diện)
- Polymorphism (Đa hình)
- Generics (Kiểu tổng quát)
Đáp án đúng: A, B, D
Các khái niệm cốt lõi của OOP bao gồm:
- Abstraction (Trừu tượng hóa)
- Encapsulation (Đóng gói)
- Polymorphism (Đa hình)
- Inheritance (Kế thừa)
- Composition (Thành phần)
- Association (Liên kết)
- Aggregation (Tập hợp)
8. Phát biểu nào sau đây là đúng về tính kế thừa (inheritance) trong Java?
- Từ khóa “extend” được dùng để kế thừa một class trong Java.
- Bạn có thể kế thừa từ nhiều class trong Java.
- Các thành viên private của superclass (lớp cha) có thể được truy cập bởi subclass (lớp con).
- Chúng ta không thể kế thừa các class final trong Java.
Đáp án đúng: D
Kế thừa là một trong những khái niệm cốt lõi trong JavBạn nên nắm vững về nó.
9. Kết quả của chương trình dưới đây là gì?
package com.journaldev.java;
public class Test {
public static void main(String[] args) {
Super s = new Subclass();
s.foo();
}
}
class Super {
void foo() {
System.out.println("Super");
}
}
class Subclass extends Super {
static void foo() {
System.out.println("Subclass");
}
}
- Lỗi biên dịch
- Super
- Subclass
- Lỗi Runtime
Đáp án đúng: A
Phương thức foo()
của Subclass
không thể là statiĐiều này sẽ gây ra lỗi compile-time This static method cannot hide the instance method from Super
.
10. Kết quả của chương trình dưới đây là gì?
package com.journaldev.java;
public class Test {
public static void main(String[] args) {
Subclass s1 = new Subclass();
s1.foo(); // line 6
Super s = new Subclass();
s.foo(); // line 8
}
}
class Super {
private void foo() {
System.out.println("Super");
}
}
class Subclass extends Super {
public void foo() {
System.out.println("Subclass");
}
}
- Lỗi biên dịch ở dòng 6
- Lỗi biên dịch ở dòng 8
- Lỗi biên dịch ở cả dòng 6 và 8
- Chạy bình thường và in ra “Subclass” hai lần.
Đáp án đúng: B
Lỗi biên dịch xảy ra ở dòng 8 vì phương thức foo()
của class Super là private. Thông báo lỗi là foo() has private access in Super
.
11. Kết quả của chương trình dưới đây là gì?
import java.io.IOException;
public class Test {
public static void main(String[] args) {
try {
throw new IOException("Hello");
} catch (IOException | Exception e) {
System.out.println(e.getMessage());
}
}
}
- Lỗi biên dịch
- In ra “Hello”
- Lỗi Runtime
Đáp án đúng: A
Lỗi biên dịch với thông báo unreported exception Exception; must be caught or declared to be thrown
.
12. Kết quả của chương trình dưới đây là gì?
public class Test {
public static void main(String[] args) {
String x = "abc";
String y = "abc";
x.concat(y);
System.out.print(x);
}
}
- abcabc
- abc
- null
Đáp án đúng: B
x.concat("abc")
sẽ tạo ra một chuỗi mới nhưng không gán lại cho x
, vì vậy giá trị của x
không thay đổi.
13. Lỗi nào dưới đây là unchecked exception trong Java?
- RuntimeException
- ClassCastException
- NullPointerException
- IOException
Đáp án đúng: A, B, C
RuntimeException
và các subclass của nó là các unchecked exception (lỗi không bắt buộc xử lý tại lúc biên dịch). Nó không cần phải được khai báo trong mệnh đề throws
của một phương thức hay constructor.
14. Kết quả của chương trình dưới đây là gì?
package com.journaldev.java;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
try {
throw new Exception("Hello ");
} catch (Exception e) {
System.out.print(e.getMessage());
} catch (IOException e) {
System.out.print(e.getMessage());
} finally {
System.out.println("World");
}
}
}
- Lỗi biên dịch
- Hello
- Hello World
- Hello Hello World
Đáp án đúng: A
Lỗi biên dịch: Unreachable catch block for IOException. It is already handled by the catch block for Exception
.
15. Phát biểu nào sau đây là đúng về Java?
- JVM chịu trách nhiệm chuyển đổi byte code thành mã máy cụ thể.
- Chúng ta chỉ cần JRE để chạy các chương trình Java.
- Chúng ta cần JDK để biên dịch các chương trình Java.
- JRE không chứa JVM.
Đáp án đúng: A, B, C
Hãy tìm đọc các bài viết của chúng tôi về JDK, JRE, và JVM để có lời giải thích kĩ hơn.
16. Chúng ta có thể có hai phương thức main
trong một class Java không?
- Có
- Không
Đáp án đúng: A
Đây là một câu hỏi mẹo. Chúng ta có thể có nhiều phương thức cùng tên là “main” trong Java thông qua cơ chế method overloading (nạp chồng nhiều phương thức cùng tên, khác tham số).
17. Phát biểu nào sau đây là đúng về annotation trong Java?
- Từ khóa
@interface
được dùng để tạo custom annotation. @Override
là một annotation có sẵn trong Java.- Annotation không thể được áp dụng cho các trường (field) trong một class.
@Retention
là một trong những meta-annotation trong Java.- Thông tin của annotation trong Java sẽ bị mất khi class được biên dịch.
Đáp án đúng: A, B, D
Để có giải thích đầy đủ hơn, hãy đọc bài viết của chúng tôi về Java Annotations.
18. Phát biểu nào sau đây là đúng về Enum
trong Java?
- Tất cả các
enum
trong Java đều kế thừa ngầm classjava.lang.Enum
. Enum
trong Java có thể triển khai các interface.- Chúng ta có thể tạo các thực thể của
enum
bằng toán tửnew
. Enum
không thể được sử dụng trong câu lệnhswitch
.- Các hằng số
Enum
được ngầm định làstatic
vàfinal
.
Đáp án đúng: A, B, E
Đọc thêm tại bài viết về Enum trong Java.
19. Loại nào dưới đây là các class loader có sẵn trong Java?
- Bootstrap Class Loader
- Extensions Class Loader
- Runtime Class Loader
- System Class Loader
Đáp án đúng: A, B, D
Đọc thêm tại bài viết về class loader (thành phần chịu trách nhiệm tải các file .class vào bộ nhớ) trong Java.
20. Chương trình dưới đây sẽ cho ra kết quả gì?
package com.journaldev.util;
public class Test {
public static String toString() {
System.out.println("Test toString called");
return "";
}
public static void main(String args[]) {
System.out.println(toString());
}
}
- “Test toString called”
- Lỗi biên dịch.
- “Test@7fh2bd8” (phương thức
toString()
của classObject
được gọi)
Đáp án đúng: B
Ta sẽ gặp lỗi biên dịch vì không thể ghi đè một phương thức của class Object với từ khóa static. Class Object có phương thức toString()
. Bạn sẽ nhận được lỗi biên dịch với thông báo: “This static method cannot hide the instance method from Object
”.
21. Chương trình dưới đây sẽ cho ra kết quả gì?
public class Test {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
System.out.println("s1 == s2 is:" + s1 == s2);
}
}
- s1 == s2 is:true
- false
- s1 == s2 is:false
- true
Đáp án đúng: B
Kết quả của câu lệnh trên sẽ là “false” vì trong Java, độ ưu tiên của toán tử +
cao hơn toán tử ==
. Do đó, biểu thức sẽ được tính toán thành “s1 == s2 is:abc” == “abc”
, tức có giá trị false.
Tổng kết
Đôi khi, những khái niệm tưởng chừng đơn giản lại ẩn chứa nhiều chi tiết dễ bị bỏ sót. Việc ôn tập và đối chiếu với các câu hỏi phỏng vấn Java này sẽ giúp bạn tránh được những sai lầm phổ biến trong quá trình lập trình. Nếu bạn có thêm câu hỏi hay chủ đề liên quan, đừng ngần ngại chia sẻ cùng chúng tôi trong phần bình luận bên dưới.