Đề Thi Cơ Bản Java

Câu hỏi trắc nghiệm đa lựa chọn (mỗi câu 1 điểm)

1. Kết quả của đoạn mã sau là gì?

public static void main(String[] args) {
    int a = 6;
    System.out.print(a);
    System.out.print(a++);
    System.out.print(a);
}

A: 666 B: 667 C: 677 D: 676

B

2. Khởi tạo đối tượng String s = new String("xyz"); sẽ tạo ra bao nhiêu đối tượng String?

A: Hai hoặc một tùy trường hợp B: Hai C: Một D: Ba

B

3. Kết quả của đoạn mã dưới đây là gì?

public static void main(String[] args) {
    StringBuffer a = new StringBuffer("A");
    StringBuffer b = new StringBuffer("B");
    thayDoi(a, b);
    System.out.println(a + "," + b);
}

public static void thayDoi(StringBuffer x, StringBuffer y) {
    x.append(y);
    y = x;
}

A: A,A B: A,B C: B,B D: AB,B

D

4. Những phát biểu nào về final, finally và finalize là đúng?

A: final có thể dùng để sửa đổi lớp, phương thức, biến.

B: finally là cơ chế đảm bảo rằng các đoạn mã quan trọng luôn được thực thi trong Java.

C: Biến được final sửa đổi không thể trỏ đến đối tượng khác, nhưng có thể ghi đè.

D: Mục đích của finalize là đảm bảo rằng các tài nguyên cụ thể được thu hồi khi đối tượng bị thu gom rác.

ABD

5. Điều gì xảy ra khi thực hiện đoạn mã sau?

public class Test {
    static {
        int x = 5;
    }
    static int x, y;

    public static void main(String[] args) {
        x--;
        myMethod();
        System.out.println(x + y + ++x);
    }

    public static void myMethod() {
        y = x++ + ++x;
    }
}

A: Lỗi biên dịch B: In ra 1 C: In ra 2 D: In ra 3 E: In ra 7 F: In ra 8

D

6. Các câu lệnh gán nào sau đây là đúng?

A: long text = 012;

B: float t = -412;

C: int other = (int) true;

D: double d = 0x12345678;

E: byte b = 128;

ABD

7. Kết quả đầu ra của chương trình sau:

class Base {
    public Base(String s) {
        System.out.println("B");
    }
}
public class Dervid extends Base {
    public Dervid(String s) {
        System.out.println("D");
    }
    public static void main(String[] args) {
        System.out.println("C");
    }
}

A: BD B: DB C: C D: Lỗi biên dịch

D

8. Đặc điểm kế thừa trong Java, những phát biểu nào là đúng?

A: Làm phức tạp việc định nghĩa lớp.

B: Java chỉ hỗ trợ đơn kế thừa, không hỗ trợ đa kế thừa, nhưng có thể đạt được thông qua triển khai interface.

C: Lớp con kế thừa tất cả các biến thành viên và phương thức của lớp cha, kể cả constructor của lớp cha.

D: Không thể kế thừa nhiều lớp, tức là một lớp không thể kế thừa từ lớp con của một lớp khác.

B

9. Những phát biểu nào về từ khóa final là đúng?

A: Nếu sửa đổi biến cục bộ phải khởi tạo ngay lập tức.

B: Nếu sửa đổi lớp thì lớp đó chỉ có thể được một lớp con kế thừa.

C: Nếu sửa đổi phương thức thì phương thức đó không thể được ghi đè trong lớp con.

D: Nếu sửa đổi phương thức thì lớp chứa phương thức đó không thể được kế thừa.

C

10. Phát biểu nào là đúng?

A: Trong phương thức lớp có thể sử dụng this để gọi phương thức của chính lớp đó.

B: Trong phương thức lớp có thể gọi trực tiếp phương thức lớp của chính lớp đó.

C: Trong phương thức lớp chỉ có thể gọi phương thức của chính lớp đó.

D: Trong phương thức lớp tuyệt đối không thể gọi phương thức instance.

B

11. Những phát biểu nào về cơ chế xử lý ngoại lệ trong Java là đúng?

A: Phần catch chỉ được thực thi khi phần bắt được ngoại lệ.

B: Khi phần try xảy ra ngoại lệ thì mới thực thi phần catch.

C: Dù có ngoại lệ hay không, phần finally vẫn luôn được thực thi.

D: Tất cả đều đúng.

BC

12. Những phát biểu nào là đúng?

A: Biến được định nghĩa trong lớp được gọi là biến thành viên của lớp, có thể sử dụng trực tiếp ở lớp khác.

B: Phạm vi hoạt động của biến cục bộ chỉ trong phương thức hoặc khối điều khiển mà nó được định nghĩa.

C: Sử dụng phương thức của lớp khác chỉ cần tham chiếu tên phương thức.

D: Nếu không định nghĩa constructor không tham số, JVM sẽ tự động tạo một constructor mặc định cho lớp.

B

13. Những phát biểu nào về Float là sai?

A: Float là một lớp.

B: Float nằm trong gói java.lang.

C: Float a = 1.0 là cách gán giá trị đúng.

D: Float a = new Float(1.0) là cách gán giá trị đúng.

C

14. Cơ chế phản chiếu (reflection) trong Java cung cấp các chức năng nào?

A: Xác định lớp của một đối tượng tại thời gian chạy.

B: Tạo một đối tượng của một lớp tại thời gian chạy.

C: Xác định các biến thành viên và phương thức của một lớp tại thời gian chạy.

D: Gọi phương thức của một đối tượng tại thời gian chạy.

ABCD

15. Trong Java, phát biểu nào là sai?

A: Mảng là một đối tượng.

B: Mảng thuộc lớp gốc.

C: int num = \[\]{1,2,3,4}.

D: Kích thước mảng có thể thay đổi tùy ý.

BCD

16. Kết quả của đoạn mã sau:

public class DemoTest {
    public static void main(String[] args) {
        String s;
        System.out.println("hello" + s);
    }
}

A: In ra hello trên console.

B: Ném ngoại lệ java.lang.NullPointerException.

C: Lỗi biên dịch.

D: Ném ngoại lệ java.RuntimeException.

C

17. Phát biểu nào là đúng?

public class Student {

    private String name;
    private int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }
    public static void change(Student s1, Student s2){
        Student temp = new Student("王五",20);
        temp.name = s1.name;
        s1.name = s2.name;
        s2.name = temp.name;
    }
    public static void main(String[] args) {
        Student zhangsan = new Student("张三", 18);
        Student lisi = new Student("李四", 20);
        Student.change(zhangsan, lisi);
        System.out.print(zhangsan.toString());
        System.out.print(lisi.toString());
    }
}

A: Student [name=李四, age=18]Student [name=张三, age=20]

B: Student [name=李四, age=20]Student [name=张三, age=18]

C: Student [name=张三, age=20]Student [name=李四, age=18]

D: Student [name=张三, age=18]Student [name=李四, age=20]

A

18. Những khái niệm nào về Java là đúng?

A: Tất cả các lỗi ngoại lệ trong Java đều thuộc java.lang.Exception bao gồm cả java.lang.RuntimeException.

B: Thông qua câu lệnh try catch finally, phần finally luôn được thực thi bất kể có ngoại lệ xảy ra hay không.

C: Tất cả dữ liệu trong Java đều là đối tượng.

D: Ngôn ngữ Java là đa nền tảng, bất kỳ chương trình Java viết bằng phiên bản nào cũng có thể chạy trên nền tảng Java tương ứng.

B

19. Kết quả của chương trình sau:

class Two{
    Byte x;
}
public class Student {
    public static void main(String[] args) {
        Student student = new Student();
        student.start();
    }
    void start() {
        Two two = new Two();
        System.out.print(two.x +"  ");
        Two two2 = fix(two);
        System.out.println(two.x + " "+two2.x);
    }
    Two fix(Two tt) {
        tt.x = 42;
        return tt;
    }
}

A: null null 42

B: null 42 42

C: 0 0 42

D: 0 42 42

E: Ném ngoại lệ tại runtime

B

Phần II: Câu hỏi ngắn

1. Ưu thế vượt nền tảng của Java là gì?

Một lần biên dịch, chạy mọi nơi.

2. Sự khác biệt giữa == và equals trong Java là gì?

== với kiểu tham chiếu kiểm tra vị trí trỏ tới có giống nhau không, với kiểu cơ bản kiểm tra giá trị có giống nhau không. equals với String, lớp wrapper, lớp tự định nghĩa so sánh giá trị có giống nhau không.

3. Sự khác biệt giữa overload và override là gì?

Overload: Xảy ra trong cùng một lớp, tên phương thức giống nhau, danh sách tham số khác nhau. Override: Xảy ra giữa lớp cha và lớp con, lớp con kế thừa lớp cha rồi viết lại phương thức có chữ ký giống nhau (tăng tính linh hoạt).

4. Tại sao khi ghi đè phương thức equals thì phải ghi đè hashcode()?

Đảm bảo logic đúng đắn của tập hợp hash, giúp đối tượng được lưu trữ và tìm kiếm đúng trong tập hợp. Có ghi đè hay không liên quan đến hashmap, nếu không sử dụng hashmap thì không cần ghi đè hashCode.

5. Sự khác biệt giữa interface và abstract class là gì?

Interface: Hỗ trợ đa kế thừa, trường chỉ có thể là hằng số, không có constructor. Abstract class: Chỉ hỗ trợ đơn kế thừa, trường có thể là bất kỳ loại nào, có thể có constructor.

6. Vui lòng mô tả hệ thống ngoại lệ trong Java.

Error (lỗi hệ thống, không thể phục hồi), Exception (ngoại lệ có thể xử lý được), RuntimeException (ngoại lệ thời gian chạy, không bắt buộc kiểm tra).

7. Sự khác biệt giữa các từ khóa public, private, protected và không viết (default)?

Từ khóa truy cập, có thể chỉnh sửa biến, phạm vi truy cập như sau:

  • public: √ √ √ √ (cần import)
  • protected: √ √ × ×
  • default: √ √ × ×
  • private: √ × × ×

8. Vui lòng mô tả "bẫy 128" trong Java.

Số nguyên trong khoảng -128-127 được lưu trữ trong một mảng cache, mảng này đóng vai trò như một bộ đệm. Khi thực hiện boxing tự động trong khoảng -128-127, ta sẽ trả về địa chỉ của giá trị trong mảng, do đó khi so sánh == trong khoảng này kết quả là true. Đối với các số ngoài khoảng này, cần cấp phát vùng nhớ mới, do đó kết quả là false.

9. Làm thế nào để bỏ qua kiểm tra an toàn của các từ khóa truy cập?

Sử dụng phương pháp phản chiếu (reflection).

10. Ba cách lấy đối tượng Class thông qua phản chiếu.

Class c1 = Loại.class; Đối tượng.getClass(); Class.forName("Tên đầy đủ của lớp").

11. Vui lòng mô tả từ khóa static.

Static: Biểu thị tĩnh, dữ liệu được sửa đổi bởi static được lưu trong vùng thường số tĩnh của phương thức. Khi lớp vừa vào bộ nhớ, sẽ đọc thông tin bên trong và cấp phát không gian cho biến và phương thức được static sửa đổi. Static có thể sửa đổi phương thức, biến, khối mã. Chỉ có thể gọi qua tên lớp. Biến được static sửa đổi là biến lớp, theo lớp tạo ra nhiều đối tượng, biến được static sửa đổi sẽ được các đối tượng chia sẻ. Phương thức được static sửa đổi là phương thức tĩnh (phương thức lớp), có thể gọi qua tên lớp hoặc tên đối tượng. Trong phương thức tĩnh không thể sử dụng phương thức không tĩnh, vì khi có không gian của phương thức tĩnh, chưa có đối tượng, phương thức không tĩnh sẽ không có không gian. Trong tĩnh không thể gọi trực tiếp phương thức không tĩnh, trong không tĩnh có thể gọi trực tiếp phương thức tĩnh. Static có thể sửa đổi khối mã, khối mã có thể có hoặc không có static, khối mã được static sửa đổi gọi là khối mã tĩnh, khối mã tĩnh được thực thi khi lớp được tải, chỉ thực thi một lần, không thực thi thêm dù tạo bao nhiêu đối tượng, và chỉ có thể đặt trong lớp không được đặt trong phương thức, chủ yếu dùng để khởi tạo dữ liệu tĩnh. Khối mã tĩnh được thực thi trước phương thức.

12. Vui lòng mô tả từ khóa final.

Final: Kiểu cơ bản được final sửa đổi không thể gán lại giá trị, kiểu tham chiếu được final sửa đổi không thể thay đổi hướng trỏ, lớp được final sửa đổi không thể được kế thừa, phương thức được final sửa đổi không thể được ghi đè, final có thể ngăn chặn tái sắp xếp lệnh, hạn chế tối ưu hóa pipeline, đảm bảo khả năng nhìn thấy trong môi trường đa luồng đồng thời, final thường được dùng cùng với static.

13. Vui lòng mô tả từ khóa this.

This: Biểu thị đối tượng hiện tại, không thể sử dụng trong phương thức tĩnh. Phương thức có thể có this, ai gọi this thì this sửa đổi người đó. This có thể sửa đổi thuộc tính, sửa đổi phương thức, this() gọi hàm khởi tạo. Thuộc tính this. có thể bỏ qua this nếu tên biến trong phương thức khác tên thuộc tính. this.phương thức, một phương thức bình thường muốn gọi một phương thức khác dùng this.tên_phương_thức (this có thể bỏ qua, không thể dùng this nếu đã được static sửa đổi). this() biểu thị truy cập hàm khởi tạo trong lớp này, this() không thể sử dụng trong phương thức bình thường, chỉ có thể sử dụng trong hàm khởi tạo, và this() trong hàm khởi tạo phải là dòng đầu tiên. this có thể thêm tham số để gọi hàm khởi tạo có tham số, nếu không có tham số thì gọi hàm khởi tạo không tham số, trong cùng một lớp không thể gọi hàm khởi tạo không tham số từ hàm khởi tạo có tham số và ngược lại. this và super không thể sử dụng cùng lúc.

14. Vui lòng mô tả đặc điểm của constructor.

Constructor có cùng tên với lớp, mỗi lớp có thể có một hoặc nhiều constructor, constructor có thể không có tham số hoặc nhiều tham số, constructor không có giá trị trả về, constructor luôn được gọi kèm với thao tác new.

15. Mô tả từng kết quả đầu ra.

public class A {
    public String Show(D obj) {
        return "A and D";
    }
    public String Show(A obj) {
        return "A and A";
    }
}
public class B extends A{
    public String Show(Object obj) {
        return "B and B";
    }
    public String Show(A obj) {
        return "B and A";
    }
}
public class C extends B{
}
public class D extends B{
}

Lớp kiểm thử:

public class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();

        System.out.println("1---"+a1.Show(b));
        System.out.println("2---"+a1.Show(c));
        System.out.println("3---"+a1.Show(d));

        System.out.println("4----"+a2.Show(b));
        System.out.println("5----"+a2.Show(c));
        System.out.println("6----"+a2.Show(d));

        System.out.println("7---"+b.Show(b));
        System.out.println("8---"+b.Show(c));
        System.out.println("9---"+b.Show(d));
    }
}

Kết quả đầu ra: 1:A and A, 2:A and A, 3:A and D, 4:B and A, 5:B and A, 6:A and D, 7:B and A, 8:B and A, 9:A and D

16. Kết quả đầu ra của đoạn mã sau là gì? Tại sao?

public static void main(String[] args) {
    int a = 10;
    int b = 10;
    Integer a1 = 10;
    Integer b1 = 10;
    Integer a2 = new Integer(10);
    Integer b2 = new Integer(10);
    System.out.println(a == b);  
    System.out.println(a1 == b1);  
    System.out.println(a2 == b2); 
    System.out.println(a1 == a);  
    System.out.println(a1.equals(a));  
    System.out.println(a1 == a2);
    System.out.println(a == a2);
}

System.out.println(a == b); xuất ra true, vì hai kiểu cơ bản so sánh giá trị có giống nhau không.

System.out.println(a1 == b1); xuất ra true, vì "bẫy 128".

System.out.println(a2 == b2); xuất ra false vì đều dùng new tạo đối tượng mới nên địa chỉ trỏ tới khác nhau.

System.out.println(a1 == a); xuất ra true, vì lớp bao gói và kiểu cơ bản so sánh thì lớp bao gói cần giải nén, cuối cùng là so sánh giá trị có giống nhau không.

System.out.println(a1.equals(a)); xuất ra true, vì lớp bao gói và kiểu cơ bản so sánh thì lớp bao gói cần giải nén, cuối cùng là so sánh giá trị có giống nhau không (phương thức equals phía dưới cũng dùng ==).

System.out.println(a1 == a2); xuất ra false, vì a1 sử dụng cơ chế tự động boxing, còn a2 là tạo đối tượng Integer mới, địa chỉ trỏ tới khác nhau.

System.out.println(a == a2); xuất ra true, vì a2 cũng sẽ tự động giải nén, cuối cùng so sánh giá trị có giống nhau không.

Phần III: Bài Tập Thực Hành

Bài tập thực hành thứ nhất:

  1. Vui lòng tạo hai tệp Java có tên MyFirst.java và MySecond.java trong gói com.servlet.
  2. Vui lòng tạo một lớp Java trong gói com.qcby, chức năng chính là quét các tệp Java trong gói com.servlet và lấy tất cả tên lớp đầy đủ của các tệp dưới gói này và đóng gói chúng trong tập List.
  3. Duyệt qua dữ liệu trong tập List đã tạo ở bước 2, tạo đối tượng lớp và đóng gói chúng trong tập Map, key là tên lớp đầy đủ, value là đối tượng lớp!

Bài tập thực hành thứ hai:

Thực hiện một bộ ghi nhật ký dựa trên proxy động trong Java.

Nền tảng:

Trong phát triển phần mềm, ghi nhật ký là một chức năng rất quan trọng, giúp nhà phát triển hiểu trạng thái hoạt động của chương trình, theo dõi lỗi và ngoại lệ. Hiện tại, bạn cần thiết kế một bộ ghi nhật ký dựa trên proxy động trong Java, bộ ghi nhật ký này có thể tự động thêm chức năng ghi nhật ký cho tất cả các phương thức nghiệp vụ truy cập qua proxy mà không cần sửa đổi mã nguồn của các lớp nghiệp vụ ban đầu.

Yêu cầu nhiệm vụ:

  1. Xác định giao diện nghiệp vụ: Trước hết, xác định một giao diện nghiệp vụ BusinessService, giao diện này chứa ít nhất hai phương thức, chẳng hạn executeTaskA() và executeTaskB(), những phương thức này mô phỏng logic nghiệp vụ thực tế.
  2. Thực hiện giao diện nghiệp vụ: Thực hiện giao diện BusinessService, tạo một hoặc nhiều lớp nghiệp vụ, chẳng hạn BusinessServiceImpl, trong các lớp này thực hiện các phương thức được định nghĩa trong giao diện.
  3. Tạo và sử dụng proxy động: Viết một lớp factory LoggingProxyFactory, lớp này chịu trách nhiệm tạo đối tượng proxy động dựa trên instance của lớp nghiệp vụ truyền vào. Bên trong lớp factory nên sử dụng lớp Proxy và giao diện InvocationHandler để tạo đối tượng proxy.
  4. Kiểm thử: Viết mã kiểm thử, minh họa cách sử dụng LoggingProxyFactory để tạo đối tượng proxy của BusinessServiceImpl và gọi các phương thức executeTaskA() và executeTaskB() thông qua đối tượng proxy, kiểm tra chức năng ghi nhật ký có hoạt động như mong đợi không.

Bài tập thực hành thứ ba:

Mô tả bài toán:

Thiết kế một hệ thống quản lý thư viện với các lớp Book (sách) và Bookshelf (kệ sách), cũng như một lớp Library (thư viện) để quản lý các kệ sách này. Hệ thống cần hỗ trợ các chức năng sau:

  1. Lớp Book (sách)

- Sách nên có các thuộc tính như tiêu đề (title), tác giả (author), năm xuất bản (yearPublished) và ISBN (ISBN).

- Cung cấp hàm khởi tạo để khởi tạo thông tin sách.

- Cung cấp các phương thức getter và setter để truy cập và sửa đổi thuộc tính của sách.

- Cung cấp phương thức toString() để in thông tin chi tiết của sách.

  1. Lớp Bookshelf (kệ sách)

- Kệ sách nên có thể lưu trữ danh sách sách và cung cấp các chức năng thêm sách (addBook), xóa sách (removeBook, theo ISBN), tìm sách (findBook, theo ISBN trả về sách hoặc null).

- Sử dụng các tập hợp Java (như ArrayList) để lưu trữ sách.

- Cung cấp phương thức displayBooks() để hiển thị tất cả sách trên kệ.

  1. Lớp Library (thư viện)

- Thư viện nên có thể quản lý nhiều kệ sách, cung cấp các chức năng thêm kệ sách (addBookshelf), xóa kệ sách (removeBookshelf, theo chỉ số hoặc ID duy nhất), tìm kệ sách (findBookshelf, theo chỉ số hoặc ID duy nhất).

- Sử dụng các tập hợp Java (như ArrayList hoặc HashMap, tùy theo yêu cầu) để lưu trữ kệ sách.

- Cung cấp phương thức searchBookInLibrary(String ISBN) để tìm kiếm sách có ISBN cụ thể trong toàn bộ thư viện và trả về sách (nếu tồn tại) hoặc null.

- Cung cấp phương thức displayLibrary() để hiển thị tất cả kệ sách và sách trên chúng trong thư viện.

Yêu cầu ví dụ:

  1. Tạo một thư viện chứa một số sách.
  2. Thêm một kệ sách vào thư viện và thêm một số sách vào kệ sách đó.
  3. Thử xóa một sách khỏi kệ sách và kiểm tra xem có thành công không.
  4. Tìm kiếm sách có ISBN cụ thể trong toàn bộ thư viện và in kết quả.
  5. Hiển thị tất cả kệ sách và sách trên chúng trong thư viện.

Thẻ: Java Cơ-Bản Thi-Cử Đề-Thi Lập-Trình-Java

Đăng vào ngày 14 tháng 7 lúc 05:09