











Preview text:
Giai de oop cac nam - Giải đề oop các năm ( tham khảo thui nhe )
Lập trình hướng đối tượng (Trường Đại học Mở Thành phố Hồ Chí Minh)

Câu 1: Cơ chế hoạt động pt khởi tạo kế thừa
- Pt khởi tạo không được kế thừa ở lớp con
- Thứ tự các pt khởi tạo được gọi là lớp cha trước rồi đến con
- Pt khởi tạo lớp con phải gọi lớp cha, nếu không Java ngầm định là pt khởi tạo không tham số của cha.
Câu 2: Pb lớp trừu tượng và giao diện Giống:
- Đều định nghĩa hành vi chung.
- Không thể khởi tạo đối tượng.
- Hỗ trợ tính đa hình.
- Giúp thiết kế hệ thống rõ ràng.
Khác:
Abstract class ( trừu tượng ) | Interface ( giao diện ) | |
-Có thể cung cấp nội dung cài đặt cho pt của interface ( giao diện ).
| - - - - | Hỗ trợ đa kế thừa. Chỉ có biến static, final. Không thể cung cấp nội dung cài đặt cho abstract class. Từ “interface” được dùng để khai báo interface ( giao diện ). |
Câu 3: Sửa lỗi sai và viết lại hàm child
Note: interface ( giao diện ), implements ( lớp triển khai )
1. | Lỗi khai báo constructor trong giao diện |
- Vì constructor dành cho lớp, không được tồn tại trong interface - Sửa: xóa constructor
2. | Lớp Parents không cài đặt phương thức inc() |
- Vì khi một lớp triển khai (implements) interface, nó bắt buộc phải cài đặt tất cả các phương thức trong interface.
- Sửa: thêm cài đặt cho phương thức inc()
3. | Có final trong phương thức show |
- Vì lớp con (Child) cần ghi đè phương thức show() để cho ra kết quả 5, nếu dùng final
thì lớp con không thể ghi đè được.
- Sửa: bỏ chữ final
Đoạn code sau khi sửa:
interface IParent { void inc(); // Xóa constructor
}
class Parent implements IParent { protected int x;
public Parent(int y) {
this.x = y;
}
@Override
public void inc() {
this.x += 5;
}
public void show() { // Xóa từ khóa
final
this.inc();
System.out.println(x + 10);
}
} public class Main {
public static void main(String[] args) o1.show(); // In ra 20
{ Parent o2 = new Child(5);
Parent o1 = new Parent(5); o2.show(); // In ra 5}}
Viết lớp Child: class Child extends Parent { public Child(int y) {
super(y);
}
@Override public void inc() {
this.x += 0; // Giữ nguyên x để kết quả là 5
}
@Override public void show() { this.inc();
System.out.println(x + 15); // In ra 5
}
}

Câu 4: Bổ sung
- Thiếu getter và setter
- Thiếu khai báo constructor
class BoPhan { private String ten;
public BoPhan(String ten) { this.ten = ten;
}
public String getTen() {
return ten;
}
public void setTen(String ten) {
this.ten = ten;
}
}
class NhanVien {
private static int count = 1; // Biến đếm để tạo mã nhân viên tự động private String id; private String ten; private BoPhan boPhan;
public NhanVien(String ten, BoPhan boPhan) { this.id = "NV" + String.format("%05d", count++);
this.ten = ten;
this.boPhan = boPhan;
}
public BoPhan getBoPhan() { return boPhan;
}
public void setBoPhan(BoPhan boPhan) {
this.boPhan = boPhan;
}
public String getTen() {
return ten;
}
public void hienThi() {
System.out.println(id + "-" + ten + "-" + boPhan.getTen());
}
}
public class Main {
public static void main(String[] args) { // Tạo đối tượng bộ phận
BoPhan b1 = new BoPhan("Ban hang");
// Tạo đối tượng nhân viên n1 NhanVien n1 = new NhanVien("A", b1); n1.hienThi(); // Xuất: NV00001-A-Ban hang
// Tạo đối tượng nhân viên n2 và thay đổi bộ phận NhanVien n2 = new NhanVien(n1.getTen(), n1.getBoPhan()); n2.getBoPhan().setTen("Marketing");
n2.hienThi(); // Xuất: NV00002-A-Marketing
} }
Câu 5:
+-------------------+
| SinhVien |
+-------------------+
| - maSinhVien: String |
| - hoTen: String |
| - chuyenNganh: String|
| - baoCaoList: List<BaoCao> |
+-------------------+
| + themBaoCao(baoCao: BaoCao): void |
| + getBaoCaoList(): List<BaoCao> |
+-------------------+
+-------------------+
| BaoCao |
+-------------------+
| - maBaoCao: String |
| - tenBaoCao: String |
| - chuoiLink: String | | - danhGia: String |
| - kiemTraDaoVan: String |
+-------------------+
| + getThongTin(): String |
| + setDanhGia(danhGia: String): void |
+-------------------+
+-------------------+
| HoiDong |
+-------------------+
| - tenHoiDong: String |
| - danhSachThanhVien: List<String> |
+-------------------+
| + themThanhVien(ten: String): void |
| + hienThiThanhVien(): void |
+-------------------+
+-------------------+
| HeThongQuanLy |
+-------------------+
| - sinhVienList: List<SinhVien> | | - baoCaoList: List<BaoCao> |
| - hoiDongList: List<HoiDong> |
+-------------------+
| + timKiemBaoCao(ten: String): void |
| + sapXepBaoCao(): void |
| + hienThiBaoCao(): void |
+-------------------+


Câu 1:
a)
Pt trừu tượng không thể khai báo tĩnh vì
- Pt trừu tượng được thiết kế để buộc lớp con triển khai => ko thể tĩnh b)
Protected: phạm vi truy cập có thể khác hoặc cùng package ( dùng để chia sẻ dl giữa lớp cha, con)
Default: phạm vi giới hạn chỉ cùng package ( dùng để chia sẻ dữ liệu trong cùng package) c)
Sự khác nhau giữa static và thường (non-static):
Trong lớp đối tượng:
- Static: Thuộc về lớp, chia sẻ chung giữa tất cả các đối tượng, truy cập qua tên lớp.
- Non-static: Thuộc về đối tượng, mỗi đối tượng có bản sao riêng, truy cập qua đối tượng.
Trong quan hệ kế thừa:
- Static:
- Liên kết tĩnh (compile-time), không hỗ trợ đa hình.
- Gọi theo kiểu tham chiếu, không override mà chỉ bị ẩn (hidden).
- Non-static:
- Liên kết động (runtime), hỗ trợ đa hình.
- Gọi theo đối tượng thực tế, có thể override.
Câu 2:
- Kết quả 14 vì
- this.value +=y mà new C(10) nghĩa là y =10, y=y+y thì y=