OOP
OOP
Class Người:
package mainbai2_buoi2; }
import java.util.ArrayList; }
import java.util.Scanner; public static void hienThiThongTinKhachSan() {
public class QuanLyKhachSan { for (KhachSan khachSan : danhSachKhachSan) {
private static ArrayList<KhachSan> danhSachKhachSan = new System.out.println("Ho va ten khach: " +
ArrayList<>(); khachSan.getNguoiTro().getHoTen());
public static void nhapThongTinKhachSan() { System.out.println("Ngay sinh cua khach: " +
Scanner scanner = new Scanner(System.in); khachSan.getNguoiTro().getNgaySinh());
System.out.print("Nhap so luong khach tro: "); System.out.println("So cmnd cua khach: " +
int n = scanner.nextInt(); khachSan.getNguoiTro().getSoCMND());
scanner.nextLine(); System.out.println("so ngay tro: " + khachSan.getSoNgayTro());
for (int i = 0; i < n; i++) { System.out.println("Loai phong tro: " + khachSan.getLoaiPhong());
System.out.print("Nhap ho ten khach tro: "); System.out.println("gia phong: " + khachSan.getGiaPhong());
String hoTen = scanner.nextLine(); System.out.println();
System.out.print("Nhap ngay sinh khach tro: "); }
String ngaySinh = scanner.nextLine(); }
System.out.print("Nhap so cmnd khach nguoiTro: "); public static void xoaThongTinKhachSan(String soCMND) {
String soCMND = scanner.nextLine(); for (KhachSan khachSan : danhSachKhachSan) {
System.out.print("Nhap so ngay cua khach tro: "); if (khachSan.getNguoiTro().getSoCMND().equals(soCMND)) {
int soNgayTro = scanner.nextInt(); danhSachKhachSan.remove(khachSan);
scanner.nextLine(); System.out.println("Da xoa thong tin khach tro co cmnd la " +
System.out.print("Chon loai phong : "); soCMND);
String loaiPhong = scanner.nextLine(); return;
System.out.print("gia loai phong: "); }
double giaPhong = scanner.nextDouble(); }
scanner.nextLine(); System.out.println("Khong tim thay khach tro co cmnd la " + soCMND);
Nguoi nguoiTro = new Nguoi(hoTen, ngaySinh, soCMND); }
KhachSan khachSan = new KhachSan(soNgayTro, loaiPhong, giaPhong, public static void quanLyKhachSan() {
nguoiTro); }
danhSachKhachSan.add(khachSan); public static double tinhTienPhaiTra(String soCMNDThanhToan) {
return 0;
}
}
Class Main
Class Người
import java.util.Scanner; System.out.println("Danh sach hoc sinh sinh nam 1985 va que o Thai
public class Main { Nguyen:");
public static void main(String[] args) { for (int i = 0; i < n; i++) {
Scanner scanner = new Scanner(System.in); if (hocSinhs[i].sinhNam1985VaQueThaiNguyen()) {
System.out.print("Nhap so luong hoc sinh: "); hocSinhs[i].hienThi();
int n = scanner.nextInt(); }
HSHocSinh[] hocSinhs = new HSHocSinh[n]; }
for (int i = 0; i < n; i++) { System.out.println("Danh sach hoc sinh cua lop 10A1:");
hocSinhs[i] = new HSHocSinh(); for (int i = 0; i < n; i++) {
System.out.println("Nhap thong tin hoc sinh thu " + (i + 1) + ":"); if (hocSinhs[i].laHocSinh10A1()) {
hocSinhs[i].nhap(); hocSinhs[i].hienThi();
} }
}
}
}
Class khachhang
import java.util.Scanner; }
public class Main { public static KhachHang nhapThongTinKhachHang() {
public static void main(String[] args) { Scanner scanner = new Scanner(System.in);
Scanner scanner = new Scanner(System.in); System.out.println("Nhap thong tin khach hang:");
System.out.print("Nhap so ho gia dinh: "); System.out.print("Ho ten: ");
int n = scanner.nextInt(); String hoTen = scanner.nextLine();
BienLai[] bienLais = new BienLai[n]; System.out.print("So nha: ");
for (int i = 0; i < n; i++) { String soNha = scanner.nextLine();
KhachHang khachHang = nhapThongTinKhachHang(); System.out.print("Ma so cong to: ");
int chiSoCu = nhapChiSoCu(); String maSoCongTo = scanner.nextLine();
int chiSoMoi = nhapChiSoMoi(); return new KhachHang(hoTen, soNha, maSoCongTo);
BienLai bienLai = new BienLai(khachHang, chiSoCu, chiSoMoi); }
bienLais[i] = bienLai; public static int nhapChiSoCu() {
} Scanner scanner = new Scanner(System.in);
// Hiển thị thông tin biên lai của các hộ gia đình System.out.print("Nhap chi so dien cu: ");
for (int i = 0; i < n; i++) { return scanner.nextInt();
System.out.println("Thong tin bien lai cua ho gia dinh " + (i + 1)); }
System.out.println(bienLais[i].toString()); public static int nhapChiSoMoi() {
} Scanner scanner = new Scanner(System.in);
// Tính tiền điện phải trả của từng hộ gia đình System.out.print("Nhap chi so dien moi: ");
for (int i = 0; i < n; i++) { return scanner.nextInt();
System.out.println("Ho gia dinh " + (i + 1) + " can phai tra " + }
bienLais[i].tinhTienDien() + " dong tien dien."); }
}
Bài 1:
Bài 5:
Bài 6:
Bài 8:
Bai 9:
Bài 10:
Class Người
import java.util.Scanner; }
public class Nguoi { public String getDiachi() {
private String HovaTen; return diachi;
private String diachi; }
private int Sodienthoai; public void setDiachi(String diachi) {
public Nguoi(String hovaTen, String diachi, int sodienthoai) { this.diachi = diachi;
super(); }
HovaTen = hovaTen; public Integer getSodienthoai() {
return Sodienthoai;
this.diachi = diachi; }
Sodienthoai = sodienthoai; public void setSodienthoai(int sodienthoai) {
} Sodienthoai = sodienthoai;
}
public String getHovaTen() { @Override
return HovaTen; public String toString() {
} return super.toString() + "\nHọ và tên là : " + HovaTen +
public void setHovaTen(String hovaTen) { ",\nđịa chỉ là : " + diachi
HovaTen = hovaTen; + ",\nSố Điện Thoại là : " +
Sodienthoai + "]";
}
}
Class QLSV
Class Chạy
- Tổ chức và quản lý mã nguồn: Package giúp tổ chức mã nguồn thành các nhóm chức năng, làm cho việc quản lý và bảo trì mã
nguồn trở nên dễ dàng hơn.
- Tính tái sử dụng cao: Package cho phép chia sẻ code giữa các thành phần khác nhau trong cùng một ứng dụng hoặc giữa các
ứng dụng khác nhau, giúp tăng tính tái sử dụng của mã nguồn.
- Tạo ra các tầng phân cấp: Package cung cấp cho người phát triển khả năng tạo ra các tầng phân cấp của mã nguồn, giúp cho
việc phát triển và bảo trì các hệ thống lớn trở nên dễ dàng hơn.
- Tính bảo mật cao: Package có khả năng che giấu các thành phần của nó, giúp cho các class và interface không thể truy cập vào
các thành phần không được phép.
- Quản lý version: Package giúp quản lý version của các thành phần bên trong nó, cho phép người phát triển dễ dàng theo dõi và
kiểm soát các thay đổi và cập nhật mã nguồn.
- Tăng tính module hóa: Package làm cho mã nguồn trở thành các module độc lập, giúp cho việc phát triển các module riêng lẻ và
kết hợp chúng thành một hệ thống lớn trở nên dễ dàng hơn.
- Phân chia các chức năng: Package giúp phân chia các chức năng riêng biệt của ứng dụng, làm cho việc phát triển và bảo trì ứng
dụng trở nên dễ dàng và hiệu quả hơn.
Câu 2:
c. Trong lập trình hướng đối tượng bằng ngôn ngữ java, tính bao đóng thể hiện bằng cách nào
a. Tính bao đóng (encapsulation) trong OOP là khả năng che giấu thông tin và hành vi của một đối tượng khỏi bên ngoài, thông qua việc
đóng gói các thuộc tính và phương thức của đối tượng lại thành một đơn vị độc lập và đưa ra những phương thức public để cho phép các
đối tượng khác tương tác với nó.
b. Mục đích của tính bao đóng trong OOP là tăng tính bảo mật và bảo trì của chương trình, giúp hạn chế sự can thiệp từ bên ngoài, đồng
thời giúp cho mã nguồn dễ bảo trì hơn, khiến nó dễ dàng được mở rộng và tái sử dụng.
c. Trong lập trình hướng đối tượng bằng ngôn ngữ Java, tính bao đóng thể hiện bằng cách sử dụng các từ khóa "public", "private", và
"protected" để quản lý việc truy cập đến các thuộc tính và phương thức của đối tượng. Các thuộc tính và phương thức được đánh dấu là
private chỉ có thể truy cập và sửa đổi bên trong lớp đó, trong khi các phương thức public được sử dụng để truy cập và thay đổi các giá trị
của thuộc tính từ bên ngoài. Việc sử dụng các từ khóa này giúp tạo ra các "bộ đóng gói" (packages) các thuộc tính và phương thức trong
đối tượng, che giấu các chi tiết triển khai của đối tượng và giúp mã nguồn dễ dàng quản lý hơn.
Câu 3 :
c. Trong lập trình hướng đối tượng bằng ngôn ngữ java, tính trừu tượng thể hiện bằng cách nào
a. Tính trừu tượng (abstraction) trong OOP là khả năng tập trung vào các đặc tính quan trọng của một đối tượng mà bỏ qua các chi tiết
không cần thiết, thông qua việc định nghĩa các lớp và phương thức trừu tượng mà không cần biết cụ thể triển khai nó.
b. Mục đích của tính trừu tượng trong OOP là giúp tách biệt giữa khía cạnh trừu tượng và khía cạnh cụ thể của một đối tượng, giúp cho mã
nguồn trở nên dễ đọc, dễ bảo trì và dễ mở rộng hơn. Nó cũng giúp giảm sự phức tạp của hệ thống, tăng tính tái sử dụng và khả năng đa
dạng hóa trong lập trình.
c. Trong lập trình hướng đối tượng bằng ngôn ngữ Java, tính trừu tượng thể hiện bằng cách sử dụng các lớp trừu tượng (abstract class) và
các phương thức trừu tượng (abstract method). Lớp trừu tượng là một lớp mà không thể tạo ra đối tượng từ đó, nhưng nó chứa các
phương thức trừu tượng mà các lớp con phải định nghĩa lại. Các phương thức trừu tượng chỉ có chữ ký, mà không có thân phương thức,
các lớp con phải triển khai lại các phương thức này. Việc sử dụng các lớp và phương thức trừu tượng giúp giảm sự phức tạp của hệ thống,
cho phép tách biệt khía cạnh trừu tượng của đối tượng với khía cạnh cụ thể, giúp cho mã nguồn trở nên dễ đọc, dễ bảo trì và dễ mở rộng
hơn.
KHÁI NIỆM :
Trạng thái:
Trạng thái của một đối tượng là một trong các điều kiện tại đó mà đối tượng tồn tại
Trạng thái của 1 đối tượng có thể thay đổi theo thời gian
Hành vi
Hành vi quyết định đối tượng đó hành động và đáp trả như thế nào đối với bên ngoài
Hành vi nhìn thấy được của 1 đối tượng được mô hình thành một tập các thông điệp nó có thể đáp trả
Đối tượng
Đối tượng là một thực thể phần mềm bao bọc các thuộc tính và các phương thức liên quan
- Thuộc tính được xác định bởi giá trị cụ thể gọi là thuộc tính thể hiện
- Một đối tượng cụ thể được gọi là 1 thể hiện
1. Tương tác giữa các đối tượng
Các đối tượng trong thế giới thực có thể tương tác với nhau
Trong lập trình:
- Các đối tượng giao tiếp với nhau bằng cách gửi thông điệp
2. Gọi hàm và gửi thông điệp
Gọi hàm:
- Chỉ ra chính xác đoạn mã nào sẽ được thực hiện
- Chỉ có duy nhất một sự thực thi của một hàm với một tên nào đó
- Không có hai hàm trùng tên
Gửi thông điệp
- Yêu cầu một dịch vụ từ một đối tượng và đối tượng sẽ quyết định cần phải làm gì
- Các đối tựng khác nhau sẽ có các cách thực thi các thông điệp theo cách khác nhau
3. Thông điệp và phương thức
Thông điệp
- Được gửi từ đối tượng này đến đối tượng kia, không bao gồm đoạn mã thực thi sẽ được thực thi
Phương thức
- Thủ tục/hàm trong ngôn ngữ lập trình cấu trúc
- Là sự thực thi dịch vụ được yêu cầu bởi thông điệp
- Là đoạn mã sẽ được thực thi để đáp ứng thông điệp được gửi đến cho đối tượng
1. Trừu tượng hóa
Là quá trình loại bỏ đi các thông tin cụ thể và giữ lại những thông tin chung
Tập trung vào các đặc điểm cơ bản của thực thể, các đặc điểm phân biệt nó với các loại thực thể khác
Phụ thuộc vào góc nhìn
- Quan trọng trong ngữ cảnh này nhưng lại không có ý nghĩa nhiều trong ngữ cảnh khác
2. Đóng gói
Che giấu, ẩn đi chi tiết thực hiện bên trong
Cung cấp cho thế giới bên ngoài một giao diện
Người dùng không phụ thuộc vào việc sửa đổi sự thực thi bên trong
- Cho phép điều khiển
Việc sử dụng đối tượng được kiểm soát thông qua các method public
- Hỗ trợ sự thay đổi
Việc sử dụng đối tượng không bị ảnh hưởng nếu dữ liệu nội tại bị thay đổi
3. Module hóa
chia nhỏ hệ thống phức tạp thành những thành phần nhỏ có thể quản lý được
cho phép người dùng hiểu được về hệ thống
chia nhỏ một hệ thống phức tạp thành các mô đun nhỏ hơn
4. phân cấp
xếp hạng hay xếp thứ tự các mức trừu tượng vào 1 cấu trúc cây
tổ chức để phân loại. sử dụng phân cấp rất dễ dàng nhận ra sự giống và khác nhau giữa các đối tượng
phân tích thiết kế hướng đối tượng
1. phân tích thiết kế hướng đối tượng
phương pháp luận trong PT&TK phần mềm thông thường được định nghĩa như là một tập các quá trình và thao tác để tìm và
khám phá cách có thể giải quyết được bài toán phần mềm.
một trong cá phương pháp hiệu quả nhất để phát triển phần mềm
2. phát triển phần mềm
6 giai đoạn:
- Gđ0: lập kế hoạch
- Gđ1: xác định mục tiêu – làm gì
- Gđ2: xác định cách làm thế nào
- Gđ3: xây dựng phần lõi
- Gđ4: lặp lại các trường hợp sử dụng
- Gđ5: phát triển
3. Xác định mục tiêu
Gđ1: xác định mục tiêu – làm gì
Trong giai đoạn này chúng ta có nhiệm vụ xác định cụ thể các mục tiêu, chức năng và nhiệm vụ mà phần mềm chúng ta cần xây
dựng phải đáp ứng
Trong phương pháp lập trình cổ điển hướng thủ tục người ta gọi giai đonạ này là giai đoạn tạo ra “phân tích yêu cầu và mô tả
hệ thống”
Trong PT&TK hướng đối tượng người ta sử dụng các ký pháp và kỹ thuật Use case để mô tả các công việc này
Mảng (array)
Tập hợp hữu hạn các phần tử cùng kiểu
Phải được khai báo trước khi sử dụng
Khai báo:
kieu_dlieu[] ten_mang new kieu_dlieu [KT_MANG];
kieu_dlieu ten_mang[] = new kieu_dlieu [KT_MANG];
Ví dụ:
char c[] = new char[12];
Khởi tạo mảng
• Khai báo, khởi tạo giá trị ban đầu:
• Cú pháp:
kieu_dl[] ten_mang = {ds_gia_tri_cac_ptu};
• Ví dụ:
int[] number {10, 9, 8, 7, 6};
• Nếu không khởi tạo -> nhận giá trị mặc định tùy thuộc vào kiểu dữ liệu.
• Luôn bắt đầu từ phần tử có chỉ số 0
Mảng nhiều chiều
• Bảng với các dòng và cột
• Thường sử dụng mảng hai chiều
• Ví dụ khai báo mảng hai chiều b[2][2]
int b[] []={{1, 2}, {3,4}};
• 1 và 2 được khởi tạo cho b[0][0] và b[0][1]
• 3 và 4 được khởi tạo cho b[1][0] và b[1][1]
• int b[3][4];
Đa hình là gì?
Tính đa hình đề cập đến khả năng tồn tại ở nhiều dạng. Nhiều định nghĩa có thể được đưa ra cho một giao diện duy nhất. Ví
dụ: nếu bạn có một lớp tên là Xe, nó có thể có một phương thức có tên là tốc độ nhưng bạn không thể định nghĩa nó vì các
loại xe khác nhau có tốc độ khác nhau. Phương thức này sẽ được định nghĩa trong các lớp con với các định nghĩa khác nhau
cho các loại xe khác nhau.
Tính đa hình tĩnh (liên kết tĩnh) là một loại đa hình xảy ra tại thời điểm biên dịch. Một ví dụ về tính đa hình thời gian biên dịch là
nạp chồng phương thức.
Đa hình thời gian chạy hay đa hình động (liên kết động) là một loại đa hình được phân giải trong thời gian chạy. Một ví dụ về
tính đa hình thời gian chạy là ghi đè phương thức.
Nạp chồng phương thức là một tính năng của OOP giúp có thể đặt cùng một tên cho nhiều phương thức trong một lớp nếu
các đối số được truyền khác nhau.
Ghi đè phương thức là một tính năng của OOP mà lớp con hoặc lớp con có thể xác định lại các phương thức có trong lớp cơ
sở hoặc lớp cha. Ở đây, phương thức được ghi đè có cùng tên cũng như chữ ký có nghĩa là các đối số được truyền và kiểu trả
về.
Nạp chồng toán tử đề cập đến việc triển khai các toán tử sử dụng kiểu do người dùng xác định dựa trên các đối số được
truyền cùng với nó.