05 Dong goi va truu tuong hoa du lieu
LẬP TRÌNH JAVA
Bài 5: Đóng gói và trừu tượng hóa dữ liệu
Mục tiêu
Kết thúc bài học bạn có thể nắm được:
Nêu được bản chất, vai trò của trừu tượng hóa dữ liệu
Giải thích về đóng gói và che giấu thông tin (Encapsulation & Information Hiding)
Thực thi trong Java
Khai báo một lớp trong Java
Tạo các phương thức, các trường/thuộc tính
Package trong Java
Nội dung
5.1 Trừu trượng hóa dữ liệu
5.2 Đóng gói và che giấu thông tin
5.3 Khai báo lớp
5.4 Các thành viên của lớp
5.5 Chồng phương thức
5.6 Gói (package)
5.1- Trừu tượng hóa dữ liệu
Trừu tượng hóa dữ liệu (Data abstraction)
Khi không thể nắm bắt toàn bộ đối tượng phức tạp
Bỏ qua những chi tiết không cần thiết, thay vào đó là một mô hình đối tượng tổng quát.
Lớp (Class) thay vì các đối tượng cụ thể, nhiều thông tin
5.1- Trừu tượng hóa dữ liệu
Trừu tượng hóa dữ liệu (Data abstraction)
Một cách nhìn hoặc cách biểu diễn một thực thể chỉ bao gồm các thuộc tính liên quan trong một ngữ cảnh nào đó.
Tập hợp các thể hiện của các thực thể thành các nhóm có chung các thuộc tính gọi là Lớp (class).
Ví dụ: Trừu tượng hóa các sinh viên cụ thể trong lớp học thành một lớp SinhVien.
Nội dung
5.1 Trừu trượng hóa dữ liệu
5.2 Đóng gói và che giấu thông tin
5.3 Khai báo lớp
5.4 Các thành viên của lớp
5.5 Chồng phương thức
5.6 Gói (package)
5.2- Đóng gói & che giấu tt
Đóng gói và che giấu thông tin
Dữ liệu/Thuộc tính và hành vi/Phương thức được đóng gói trong một lớp Encapsulation
Dữ liệu được che giấu ở bên trong lớp và chỉ được truy cập và thay đổi ở các phương thức bên ngoài Data hiding.
Nội dung
5.1 Trừu trượng hóa dữ liệu
5.2 Đóng gói và che giấu thông tin
5.3 Khai báo lớp
5.4 Các thành viên của lớp
5.5 Chồng phương thức
5.6 Gói (package)
5.3- Khai báo lớp
Đóng gói các thuộc tính (attributes/fields) và phương thức (methods)
Thuộc tính và phương thức gọi là thành viên (members) của lớp
Các lớp được nhóm lại thành package
Một package bao gồm một tập hợp các lớp có quan hệ logic với nhau.
Ví dụ: javax.swing, java.util...
Lớp giống như một bản thiết kế; được sử dụng để tạo ra các đối tượng hay các thể hiện của lớp.
5.3- Khai báo lớp
Khai báo lớp:
Định danh trong khai báo lớp xác định tên của lớp
Cú pháp khai báo:
chi_dinh_truy_cap class TenLop {
// Than lop
}
chi_dinh_truy_cap:
public: L ớp có th ể đư ợc truy c ập t ừ b ất c ứ đâu, k ể c ả bên ngoài package ch ứa l ớp đó.
private: Ch ỉ có th ể đư ợc truy c ập trong ph ạm vi l ớp đó
Không có (m ặc đ ịnh): L ớp có th ể đư ợc truy c ập t ừ bên trong package ch ứa l ớp đó.
5.3- Khai báo lớp
Khai báo lớp:
5.3- Khai báo lớp
Khai báo lớp thuộc gói (Package)
L ớp có th ể khai báo thu ộc 1 package nào đó
Cú pháp: package ;
Ví d ụ:
package com.hello;
public class HelloWorld {
...
}
Nội dung
5.1 Trừu trượng hóa dữ liệu
5.2 Đóng gói và che giấu thông tin
5.3 Khai báo lớp
5.4 Các thành viên của lớp
5.5 Chồng phương thức
5.6 Gói (package)
5.4- Các thành viên của lớp
Bao gồm: Thuộc tính và phương thức Ph ạm vi c ủa l ớp (gi ữa 2 d ấu { }):
Bên trong ph ạm vi l ớp, các thành viên c ủa l ớp có th ể truy c ập thông qua tên g ọi.
Bên ngoài ph ạm vi c ủa l ớp, có 2 ch ỉ đ ịnh truy c ập t ới các thành viên c ủa l ớp g ồm có: public và private Tương t ự như l ớp.
5.4- Các thành viên của lớp
Các chỉ định truy nhập:
5.4- Các thành viên của lớp
Ví dụ:
public class HelloWorld1 {
// Cac thuoc tinh
private int iValue = 12;
float fValue = 3.45f; //package
// Phuong thuc main
public static void main(String args[])
{
System.out.println("Hello World!");
System.out.println("Gia tri nguyen: "+iValue);
System.out.println("Gia tri thuc: "+fValue);
}
}
5.4- Các thành viên của lớp
Thuộc tính (Field/Attribute)
Các đối tượng giữ lại trạng thái trong các thuộc tính (attributes) hay các trường (fields)
Các thuộc tính được định nghĩa trong lớp.
Mỗi đối tượng có bản sao các thuộc tính của riêng nó.
Thuộc tính có thể được khởi tạo khi khai báo
Các giá trị mặc định sẽ được sử dụng nếu không được khởi tạo.
5.4- Các thành viên của lớp
Phương thức (method)
Một phương thức là một tập các câu lệnh được nhóm lại với nhau nhằm thực hiện một công việc.
Xác định cách một đối tượng đáp ứng lại thông điệp
Phương thức xác định các hoạt động của lớp
Tất cả các phương thức phải thuộc về một lớp nào đó.
Cấu trúc của phương thức:
5.4- Các thành viên của lớp
Phương thức (method)
Cấu trúc của phương thức:
parameter profile gồm kiểu, thứ tự, và số tham số của một phương thức.
method signature (header) gồm tên phương thức và parameter profiles.
Các tham số khai báo trong method header được gọi là tham số hình thức (formal parameters).
Khi phương thức được gọi, các tham số hình thức được thay thế bởi các biến hoặc dữ liệu, được gọi là các tham số thực sự (actual parameters)
5.4- Các thành viên của lớp
Phương thức (method)
Chữ ký của phương thức (signature)
Mỗi phương thức phải có một chữ ký riêng. Chữ ký của phương thức bao gồm:
Tên phương thức
Số lượng các tham số và kiểu của chúng
5.4- Các thành viên của lớp
Phương thức (method)
Kiểu dữ liệu trả về:
Khi phương thức trả về ít nhất một giá trị hoặc một đối tượng thì bắt buộc phải có câu lệnh return để trả điều khiển cho đối tượng gọi phương thức.
Nếu phương thức không trả về 1 giá trị nào thì kiểu trả về là void và có thể không cần câu lệnh return
Có thể có nhiều lệnh return trong một phương thức; câu lệnh đầu tiên mà chương trình gặp sẽ được thực thi.
5.4- Các thành viên của lớp
Phương thức (method)
Cách gọi phương thức
5.4- Các thành viên của lớp
Phương thức (method)
Cách gọi phương thức
5.4- Các thành viên của lớp
Phương thức (method)
Câu lệnh trả về giá trị bắt buộc phải có đối với một phương thức non-void.
Phương thức sau đúng về logic, nhưng có lỗi biên dịch vì trình biên dịch Java nghĩ rằng phương thức này không trả về bất kỳ giá trị nào.
public static int xMethod(int n) {
if (n > 0) return 1;
else if (n == 0) return 0;
else if (n
}
Để sửa lỗi này, xóa if (n
5.4- Các thành viên của lớp
Phương thức (method)
Đôi khi có thể có nhiều hơn một đáp ứng khi gọi một phương thức, nhưng trình biên dịch không thể xác định được đáp ứng thích hợp nhất. Điều này được gọi là "Gọi mập mờ" (ambiguous invocation) - đây là một lỗi biên dịch.
5.4- Các thành viên của lớp
Phương thức (method)
public class AmbiguousOverloading {
public static void main(String[] args) {
System.out.println(max(1, 2));
}
public static double max(int num1, double num2) {
if (num1 > num2)
return num1;
else
return num2;
}
public static double max(double num1, int num2) {
if (num1 > num2)
return num1;
else
return num2;
}
}
5.4- Các thành viên của lớp
Phương thức (method)
Biến cục bộ (local variable): biến được khai báo trong một phương thức.
Phạm vi: phần chương trình mà biến có thể được tham chiếu.
Phạm vi của một biến cục bộ bắt đầu từ khi khai báo đến cuối block chứa biến đó. Một biến cục bộ phải được khai báo trước khi sử dụng.
Có thể khai báo một biến cục bộ trùng tên nhiều lần trong các khối riêng rẽ không lồng nhau trong một phương thức, nhưng không thể khai báo một biến cục bộ 2 lần trong các khối lồng nhau
5.4- Các thành viên của lớp
Phương thức (method)
// Fine with no errors
public static void correctMethod() {
int x = 1;
int y = 1;
// i is declared
for (int i = 1; i
x += i;
}
// i is declared again
for (int i = 1; i
y += i;
}
}
5.4- Các thành viên của lớp
Phương thức (method)
// With error
public static void incorrectMethod() {
int x = 1;
int y = 1;
for (int i = 1; i
int x = 0;
x += i;
}
}
5.4- Các thành viên của lớp
Phương thức (method)
Lợi ích của phương thức:
Viết 1 lần, dùng nhiều lần.
Giấu thông tin. Giấu sự thực hiện đối với user.
Giảm độ phức tạp.
5.4- Các thành viên của lớp
Cơ chế che giấu thông tin trong Java
Các thành viên dữ liệu
Chỉ có thể truy nhập từ các phương thức bên trong lớp.
Chỉ định truy cập là private để bảo vệ dữ liệu
Các đối tượng khác muốn truy nhập vào dữ liệu riêng tư này phải thông qua các phương thức public (accessor - get và mutator - set):
5.4- Các thành viên của lớp
Mô tả lớp:
+ : public
- : private
# : protected
Ví dụ:
Xây d ựng l ớp SinhVien:
5.4- Các thành viên của lớp
Ví dụ:
public class SinhVien
{
private String HoTen;
private String MaSo;
private float Diem;
public void HienThongTin()
{
System.out.println("Họ tên sinh viên: " + HoTen);
System.out.println("Mã số sinh viên: " + MaSo);
System.out.println("Điểm: " + Diem);
}
//Các phương thức get và set
//...
}
5.4- Các thành viên của lớp
public class SinhVien
{
//...
//Các phương thức get và set
public String getHoTen() {
return HoTen;
}
public void setHoTen(String ht) {
HoTen = ht;
}
//tương tự với thuộc tính MaSo
public float getDiem() {
return Diem;
}
public void setDiem(float d) {
Diem = d;
}
}
Nội dung
5.1 Trừu trượng hóa dữ liệu
5.2 Đóng gói và che giấu thông tin
5.3 Khai báo lớp
5.4 Các thành viên của lớp
5.5 Chồng phương thức
5.6 Gói (package)
5.5- Chồng phương thức
Các phương thức có thể trùng tên nhưng các chữ ký thì phải khác nhau Chồng phương thức (Method Overloading):
Số lượng tham số khác nhau
Nếu cùng số lượng tham số thì kiểu dữ liệu các tham số phải khác nhau
Thuận tiện cho lập trình vì không cần phải nhớ quá nhiều tên phương thức mà chỉ cần nhớ một tên và lựa chọn các tham số cho phù hợp.
5.5- Chồng phương thức
Ví dụ 1:
Phương thức println() trong System.out.println() có 10 khai báo với các tham số khác nhau: boolean, char[], char, double, float, int, long, Object, String, và một không có tham số.
Không cần sử dụng các tên khác nhau (chẳng hạn "printString" hoặc "printDouble") cho mỗi kiểu dữ liệu muốn in ra.
5.5- Chồng phương thức
Ví dụ 2:
class MyDate {
public boolean setMonth(int m) { ...}
public boolean setMonth(String s) { ...}
}
...
MyDate d = new MyDate();
d.setMonth(9);
d.setMonth("September");
Nội dung
5.1 Trừu trượng hóa dữ liệu
5.2 Đóng gói và che giấu thông tin
5.3 Khai báo lớp
5.4 Các thành viên của lớp
5.5 Chồng phương thức
5.6 Gói (package)
5.6- Gói (Package)
Các lớp có thể nhóm lại với nhau thành gói (package)
Gói được coi như các thư mục, là nơi tổ chức các lớp
Theo quy ước, tên của package được viết bằng các ký tự thường
Các package khác nhau có thể chứa các lớp có cùng tên
Khi nói đến tên lớp tức là nói đến tên đầy đủ của lớp bao gồm tên gói và tên lớp.
5.6- Gói (Package)
Lợi ích của package:
Giúp tổ chức các lớp vào các đơn vị (như là các thư mục) giúp xác định vị trí trở nên dễ dàng và sử dụng các lớp một cách phù hợp.
Tránh cho việc đặt tên lớp bị xung đột (trùng tên).
Bảo vệ các lớp, dữ liệu và phương thức ở mức rộng hơn so với mối quan hệ giữa các lớp.
Các tên của gói có thể được sử dụng để nhận dạng các lớp.
Các gói cũng có thể chứa các gói khác.
5.6- Gói (Package)
Tham chiếu giữa các lớp:
Trong cùng 1 package: Sử dụng tên lớp
Khác package: Phải cung cấp tên đầy đủ cho các lớp được định nghĩa trong package khác.
Ví dụ:
public class HelloNameDialog{
public static void main(String[] args){
String result;
result = javax.swing.JOptionPane.showInputDialog
("Hay nhap ten ban:");
javax.swing.JOptionPane.showMessageDialog(null,
"Xin chao "+ result + "!");
System.exit(0);
}
}
5.6- Gói (Package)
Lệnh import:
Sử dụng lệnh import để khai báo các package hoặc các lớp để khi sử dụng không cần nêu tên đầy đủ.
Ví dụ:
import javax.swing.JOptionPane;
public class HelloNameDialog{
public static void main(String[] args){
String result;
result = JOptionPane.showInputDialog
("Hay nhap ten ban:");
JOptionPane.showMessageDialog(null,
"Xin chao "+ result + "!");
System.exit(0);
}
}
5.6- Gói (Package)
Các Package cơ bản trong Java
java.lang
Cung cấp các lớp cơ bản cho thiết kế ngôn ngữ lập trình Java
Bao gồm wrapper classes, String và StringBuffer, Object, ...
Import ngầm định vào tất cả các lớp
java.util
Bao gồm tập hợp framework, mô hình sự kiện, date time, và nhiều tiện ích khác
java.io
Cung cấp khả năng vào / ra hệ thống với các luồng dữ liệu và hệ thống file
5.6- Gói (Package)
Các Package cơ bản trong Java
java.math
Cung cấp các lớp thực thi các phép toán với số nguyên và các phép toán thập phân
java.sql
Cung cấp các API cho phép truy nhập và xử lý dữ liệu được lưu trữ trong một nguồn dữ liệu (thường sử dụng cơ sở dữ liệu quan hệ)
javax.swing
Cung cấp các lớp và giao diện cho phép tạo ra các ứng dụng đồ họa.
...
5.6- Gói (Package)
java.math
Các h ằng l ớp:
PI
E
Các phương th ức l ớp:
Các phương th ức lư ợng giác
Các phương th ức s ố m ũ
Các phương th ức làm tròn
Các phương th ức min, max, abs, và random
5.6- Gói (Package)
java.math
Các phương th ức lư ợng giác
Math.sin(double rad)
Math.cos(double rad)
Math.tan(double rad)
Math.acos(double rad)
Math.asin(double rad)
Math.atan(double rad)
Math.toRadians(double deg)
Math.toDegrees(double rad)
5.6- Gói (Package)
java.math
Các phương thức lượng giác
Phương thức Giá trị trả về
Math.sin(0) 0.0
Math.sin(Math.PI/6) 0.5
Math.cos(0) 1.0
Math.cos(Math.PI/6) 0.866
5.6- Gói (Package)
java.math
Các phương thức số mũ
Phương thức Giá trị trả về
Math.exp(double a) ea
Math.log(double a) ln(a)
Math.pow(double a, double b) ab
Math.sqrt(double a) căn bậc hai của a
5.6- Gói (Package)
java.math
Các phương thức làm tròn
double ceil(double x)
x được làm tròn lên giá trị nguyên gần nhất. Giá trị nguyên này được trả về như một giá trị thực.
double floor(double x)
x được làm tròn xuống giá trị nguyên gần nhất. Giá trị nguyên này được trả về như một giá trị thực.
double rint(double x)
x được làm tròn đến giá trị nguyên gần nhất. Nếu phần lẻ của x bằng 0.5 thì giá trị đó là số chẵn.
int round(float x)
Trả về (int)Math.floor(x+0.5)
long round(double x)
Trả về (long)Math.floor(x+0.5)
5.6- Gói (Package)
java.math
Các phương thức làm tròn
Math.ceil(2.1) 3.0
Math.ceil(-2.1) -2.0
Math.floor(2.1) 2.0
Math.floor(-2.1) -3.0
Math.rint(2.1) 2.0
Math.rint(-2.1) -2.0
Math.rint(2.5) 2.0
Math.round(2.6f) 3 (g/t int)
Math.round(-2.6) -3 (g/t long)
Math.round(2.0) 2 (g/t long)
5.6- Gói (Package)
java.math
Các phương thức min, max, abs, và random
Math.max(a, b) ; Math.min(a, b)
Trả về giá trị lớn nhất / nhỏ nhất của 2 tham số a, b.
Math.abs(a)
Trả về giá trị tuyệt đối của a.
Math.random()
Trả về một giá trị double ngẫu nhiên trong khoảng
[0.0, 1.0).
5.6- Gói (Package)
java.math
Các phương thức min, max, abs, và random
Math.max(2, 3) 3
Math.max(2.5, 3) 3.0
Math.abs(-2.4) 2.4
10+(int)(Math.random()*20)
Số nguyên thuộc [10, 29]
10 + (Math.random()*20)
Số thực thuộc [10.0, 30.0)
Bạn đang đọc truyện trên: Truyen4U.Com