You are on page 1of 28

ÔN THI CUỐI KÌ OOP

CHƯƠNG 1: TỔNG QUAN


So sánh OOP với lập trình cấu trúc ?
OOP (Lập trình hướng đối tượng) DSA (Lập trình cấu trúc)
- Bottom-up: từ vấn đề nhỏ tổng kết lại - Top-down: chia bài toàn lớn thành
thành bài toán lớn các bài toán con sau đó giải quyết
các bài toán con
- Chú trọng dữ liệu - Chú trọng thuật toán
- Ưu điểm: che giấu dữ liệu, tái sử dụng - Ứu điểm: cấu trúc rõ ràng, đơn
mã nguồn, dễ mở rộng giản, dễ bảo trì và quản lý
- Khuyết điểm: cấu trúc phức tạp, khó - Khuyết điểm: khó quản lý sự thay
theo dõi luồng dữ liệu, chỉ áp dụng cho đổi dữ liệu, khó mở rộng, không tái
hệ thống lớn sử dụng
Trình bày đặc điểm quan trọng của OOP ?
- Tính trừu tượng hóa: tập trung vào nhựng gì cần thiết, là quá trình tổng quát hóa,
quá trình quan trọng nhất, có trừu tượng hóa về mặt dữ liệu (thuộc tính) và trừu
tượng hóa về mặt hành vi (phương thức)
- Tính đóng gói: gom tất cả thuộc tính và hành vi vào 1 lớp giúp che giấu dữ liệu
- Tính kế thừa: gom thành phần giống nhau của các lớp để tạo lớp mới, giúp tái sử
dụng mở rộng chương trình, bảo trì dễ dàng hơn
- Tính đa hình: 1 đối tượng có nhiều hình thức, các đối tượng khác nhau thực hiện
cùng 1 hành động cho ra kết quả khác nhau, thể hiện qua nạp chồng và ghi đè
Hai ưu điểm qua trọng nhất của OOP ?
- Che giấu dữ liệu.
- Tái sử dụng, mở rộng
Tại sao OOP là lập trình dữ liệu ?
- Do phân tích bài toàn hướng đối tượng phải thông qua phân tích dữ liệu, sau đó
trừu tượng hóa.

CHƯƠNG 2: LỚP VÀ ĐỐI TƯỢNG + CHƯƠNG 3: KẾ THỪA


Khai báo lớp: public hoặc không public
- Public: cho phép các lớp khác gói sử dụng
- Không có public: chỉ cho cùng gói sử dụng
- Cú pháp
[public] class TênLớp {
[Các thuộc tính]
[Các phương thức]
}
- Đặt tên theo quy tắt UpperCamelCase
THUỘC TÍNH: [AccessModifier] KiểuDữLiệu tênThuộcTính;
PHƯƠNG THỨC:
- [AccessModifier] KiểuDữLiệu tênPhươngThức([ThamSố]);
- Đặt tên theo quy tắt lowerCamelCase

Abstract: là 1 lớp mơ hồ, trừu tượng, không rõ ràng, phương thức abstract không có
{}
Static class: chỉ có ở lớp trong của 1 lớp
Biến static: có kế thừa, không ghi đè,
Final: đi với biến là hằng, đi với phương thức thì không ghi đè, đi với class thì
không kế thừa
PHƯƠNG THỨC KHỞI TẠO
CONSTRUCTOR: không kế thừa, được gọi từ cha đến con, được gọi đầu tiên,
trùng tên lớp, không có dữ liệu trả về, cú pháp: [AccessModifier] TênLớp([ThamSố]);
- Default constructor (phương thức khởi tạo không tham số)
- Phương thức khởi tạo có tham số
- Copy constructor
DESTRUCTOR: đóng gói, giải phóng dữ liệu, tránh rò rỉ bộ nhớ (leak memory),
không kế thừa, được gọi từ con lên cha
Tại sao java không có destructor ?
- Do có Garbage collector
Sự khác nhau giữa constructor và setter
- Khác nhau ở thời điểm gọi, lần đầu tiên gọi thì dùng constructor
ACCCSESS MODIFIER:
PUBLIC > PROTECTED > DEFAULT > PRIVATE
So sánh static với biến thường
Static Non static
- Được truy cập thông qua tên lớp - Được truy cập thông qua instance
của lớp
- Có thể được truy cập bởi phương - Không thể truy cập trong phương
thức tĩnh hoặc phương thức bình thức tĩnh
thường
- Giảm dung lượng bộ nhớ được sử - Không làm giảm dung lượng bộ
dụng nhớ
- Được chia sẻ giữa tất cả instance - Cụ thể cho instance của 1 lớp
trong 1 lớp
- Như 1 biến toàn cục, dùng được - Như 1 biến cục bộ, chỉ đc truy
cho tất cả phương thức cập thông qua instance của một
lớp

Kết hợp
- public, protected, default kết hợp với được hết ngoại trừ private không đi với
abstract được
- stastic, final không đi với abstract được

Phân biệt this và super?


This Super
- Tham chiếu tới biến của lớp hiện - Gọi trực tiếp constructor của lớp
tại cha gần nhất
- Gọi phương thức của lớp hiện tại - Gọi trực tiếp biến của lớp cha gần
- Gọi constructor của lớp hiện tại, nhất
vd: this()
- Trả về instance của lớp hiện tại - Gọi trực tiếp phương thức của lớp
- Được truyền như 1 tham số trong cha gần nhất
phương thức, hay trong
constructor

Đoạn khai báo nào tốt?


private final int x = 10
private static final int x = 10
➔ Đoạn thứ hai hiệu năng tốt hơn vì đoạn đầu tạo 1000 đối tượng, ra 1000 biến x =
10, đoạn sau chỉ tạo 1 cái x
Quan hệ giữa lớp và đối tượng
- 1 lớp là sự trừu tượng của đối tượng
- 1 đối tượng là sự thể hiện của 1 lớp
- Tất cả đối tượng tạo ra từ 1 lớp có hành vi và thuộc tính giống nhau nhưng có
tráng thái (giá trị của từng thuộc tính) khác nhau.
Quan hệ 2 chiều (Association)

Nhận biết: quan hệ nhiều – nhiều, bên A có b: B[] hoặc b: B và bên B có a: A[] hoặc
a: A
Quan hệ Aggregation

Nhận biết: quan hệ 1 – nhiều, số 1 nằm trên hình thoi, has – a, phải có quan hệ
association trước, A có thuộc tính của B, lớp A bị hủy thì lớp B vẫn tồn tại
Quan hệ Composition

Nhận biết: quan hệ 1 – nhiều, số 1 nằm trên hình thoi, has – a, phải có quan hệ
association trước, A có thuộc tính của B, lớp A bị hủy thì lớp B bị hủy theo

Quan hệ Kế thừa
Nhận biết: quan hệ 1-1
Mặc định 1 lớp kế thừa lớp nào ? Trình bày vài phương thức quan trọng
- Lớp object, các phương thức gồm có:
▪ toString(): trả về chuỗi đại diện cho đối tượng.
- ▪ equals(Object obj): kiểm tra hai đối tượng có bằng nhau.
- ▪ hashCode(): trả về mã băm của đối tượng.
- ▪ clone(): sao chép đối tượng ra đối tượng mới.
- ▪ getClass(): trả về lớp mà đối tượng được tạo ra.

Immutable class
Ví dụ 1 immutable class:
- Thuộc tính là private
- Không có phương thức thay đổi
dữ liệu hay trả về tham chiếu có
thể thay đổi dữ liệu của thuộc
tính
➔ Lỗi ở dòng thứ 10, lỗi biên dịch vì không có constructor không tham số

➔ p1, p6
public class PhanSo { System.out.println(this.tuSo + "/"
+ this.mauSo);
private int tuSo;
}
private int mauSo;

public int getTuSo() {


public PhanSo(int tuSo, int mauSo){
return tuSo;
this.tuSo = tuSo;
}
this.mauSo = mauSo;
}
public void setTuSo(int tuSo) {
this.tuSo = tuSo;
public PhanSo(int tuSo){
}
this(tuSo, 1);
}
public int getMauSo() {
return mauSo;
public PhanSo cong(PhanSo ps){
}
return new PhanSo((this.tuSo *
ps.mauSo) + (ps.tuSo * this.mauSo),
this.mauSo * ps.mauSo);
public void setMauSo(int mauSo) {
}
this.mauSo = mauSo;
}
public void hienThi(){
}
Lỗi ở dòng thứ 10, lỗi biên dịch, do trong constructor public Person(String n), n =
name sai, phải sửa lại name = n

Kết quả: 10
999
Giải thích:
Kết quả: 4
10
Giải thích:
Kết quả: 9
Giải thích:

Khối lệnh (1): lỗi do private


Khối lệnh (2): 6 + 8

Trong phương thức tĩnh không truy xuất được thành viên riêng của lớp

Ra 4, tự nhẩm đi anh này không giải thích nữa


Lỗi biên dịch, lỗi dòng 4, do hai method đầu có chung tham số nên java tính chung là
1 cái, không phải nạp chồng

public class SanPham {


public static int dem = 0;
private String maSp = String.format("SP%05d", ++dem);
private String tenSp;
private int giaSp;

public SanPham(String tenSp){


this.tenSp = tenSp;
}

public SanPham(String tenSp, int giaSp){


this.tenSp = tenSp;
this.giaSp = giaSp;
}

public static int getDem(){


return dem;
}
public void show(){
System.out.println("Mã sản phẩm: " + this.maSp);
System.out.println("Tên sản phẩm: " + this.tenSp);
if(this.giaSp != 0){
System.out.println("Giá sản phẩm: " + this.giaSp + " triệu");
}
}

public String getMaSp() {


return maSp;
}

public void setMaSp(String maSp) {


this.maSp = maSp;
}

public String getTenSp() {


return tenSp;
}

public void setTenSp(String tenSp) {


this.tenSp = tenSp;
}

public int getGiaSp() {


return giaSp;
}
public void setGiaSp(int giaSp) {
this.giaSp = giaSp;
}
}
Dynamic Binding: cơ chế xác định địa chỉ phương thức lớp nào được gọi tại thời
điểm thực thi chương trình, có hai kiểu khai bảo là declare type (cha) và actual
type(con)
Static Binding: quyết định phương thức của lớp con tại thời điểm biên dịch

So sánh ghi đè và nạp chồng


Giống: đều là phương thức cùng tên
Khác:
Ghi đè (overriding) Nạp chồng (overloading)
- Dùng trong kế thừa - Dùng trong lớp bất kì
- Cùng tên, cùng danh sách tham số - Cùng tên, khác danh sách tham số
- Có phạm vi truy cập - Không có phạm vi truy cập

ABC
Lỗi ở dòng 7, lỗi biên dịch, lớp A không có constructor không tham số

Kết quả: A()


B(5)
Lỗi dòng 6, lỗi biên dịch, lớp final không kế thừa được

Kết quả đoạn 1: A


Kết quả đoạn 2: CA
Kết quả đoạn 3: Lỗi dòng a.show(“ “); do phương thức show 1 tham số trong class A
là private nên phương thức show trong class B không ghi đè được nên không truy xuất
được → private ở cha thì con không ghi đè được
Lỗi dòng 9, lỗi biên dịch do super(name); không nằm ở hàng đầu tiên

ATB
Lỗi dòng 7, phạm vi truy cập của B phải lớn hơn của A

CAB

Lỗi ngay super.hienThi(), do hienThi() của cha là private

class B extends A { public void show() {


super.show(); public static void main(String[] args)
{
System.out.print("B");
A a = new B();
super.show();
a.show();
}
}
public class Demo {
}

Kết quả: AA (private không đc ghi đè)

Lỗi biên dịch dòng số 7, final không đc ghi đè


A

A
Ra 1 do B khác gói A nên trong B không thừa hưởng void inc() của A -> không ghi đè

ERROR

A
DONE
Finally
DivideByZero
CHƯƠNG 4:
So sánh lớp abstract & interface ?
Giống:
- Không được tạo đối tượng
- Đều chứa phương thức trừu tượng
Khác:
Abstract Interface
- Có đủ đặc tính lớp thường - Chứa phương thức trừu tượng,
tĩnh không có phương thức khởi
tạo
- Đơn kế thừa - Đa hiện thực
- Có constructor, static,… - Chỉ chứa thuộc tính final, static

Tại sao có lớp abstract còn có interface?


- Vì lớp trừu tượng chỉ có đơn kế thừa, mục tiêu của interface là đa hiện thực
Lỗi dòng 1, lỗi biên dịch, lớp HinhVe là lớp thường nên không chứa được phương
thức trừu tượng (public abstract double tinhDienTich()
Lỗi dòng 5, lỗi biên dịch, lớp B chưa override phương thức hiển thị của lớp A

public class C extends B{


@Override @Override
void show1() { void show2() {
System.out.print("A"); System.out.print("C");
super.show1(); }
} }
Phát biểu đúng/sai?
1. Lớp trừu tượng chỉ chứa các phương thức trừu tượng.
➔ Sai, lớp trừu tượng chứa cả phương thức thường
2. Lớp trừu tượng không có phương thức khởi tạo.
➔ Sai, lớp trừu tượng chỉ không tạo đối tượng được nhưng vẫn có constructor để
lớp khác kế thừa
3. Các lớp trừu tượng không thể kế thừa lẫn nhau.
➔ Sai, vẫn kế thừa vì lớp trừu tượng vẫn có tính chất như 1 lớp
4. Trong lớp trừu tượng không thể khai báo phương thức tĩnh
➔ Sai, vẫn khai báo được
5. Lớp không có phương thức trừu tượng nào không thể khai báo là lớp trừu
tượng.
➔ Sai, lớp có ít nhất 1 phương thức trừu tượng phải là lớp trừu tượng nhưng lớp
trừu tượng không phải có ít nhất 1 phương thức trừu tượng
6. Phương thức trừu tượng có thể khai báo là private hoặc final hoặc static.
➔ Sai, private cấm ghi đè, final là lớp cuối không ghi đè được, static không có
khái niệm ghi đè nên không đi với abstract được
7. Lớp trừu tượng bắt buộc phải có ít nhất một phương thức trừu tượng.
➔ Sai, như câu 5
8. Các lớp trừu tượng có thể kế thừa nhau.
➔ Đúng
9. Lớp con không thể truy cập vào phương thức public abstract của lớp cha.
➔ Sai, vẫn truy cập đc, còn sao tự hỉu
10. Lớp trừu tượng có thể kế thừa lớp thường.
➔ Đúng, giải thích như câu 3
Lớp giao diện (interface)
▪ Không thể tạo thể hiện từ giao diện.
▪ Giao diện không có phương thức khởi tạo.
▪ Giao diện không được phép kế thừa lớp.
▪ Các giao diện được phép kế thừa nhau.

Lỗi biên dịch tại dòng void show() của lớp B do phương thức override phải public
Lỗi biên dịch tại dòng class AB, do chưa override phương thức void show(String s)
của interface IB

Lỗi thực thi, chưa chỉ chương trình biết sort thế nào, sửa:
class Student implements }
Comparable<Student>{
private int id;
@Override
public Student(int id) {
public int compareTo(Student t) {
this.id = id;
return -(this.id - t.id);
}
}

You might also like