Đóng gói/che dấu thông tin Đóng gói dữ liệu và các thao tác tác động lên dữ liệu thành một thể thống nhất lớp đối tượng thuận tiện cho sử dụng lại Che dấu thông tin thao tác với dữ l
Trang 1Bắt đầu với Java
Trang 2Nội dung
Lịch sử của Java
Các đặc trưng cơ bản
Java applications và Java applets
Tạo ứng dụng Java đơn giản
Trang 3Lịch sử hình thành
1991: được Sun Microsystems phát triển nhằm mục đích viết phần mềm điều khiển (phần mềm nhúng) cho các
sản phẩm gia dụng
lúc đầu được đặt tên là Oak
1995: được phổ cập với sự phát triển mạnh mẽ của
Internet
thị trường phần mềm nhúng không phát triển mạnh
WWW bùng nổ (1993~)
Hiện nay, được chấp nhận rộng rãi với tư cách là một
ngôn ngữ (công nghệ) đa dụng
khả chuyển, an toàn
Trang 4Java là một công nghệ
Java bao gồm
Ngôn ngữ lập trình
Môi trường phát triển
Môi trường thực thi và triển khai
Trang 5Mục tiêu của Java
Trang 6Mục tiêu của Java
Cho phép chạy nhiều tiến trình (threads)
Nạp các lớp (classes) động vào thời điểm cần thiết từ nhiều nguồn khác nhau
Cho phép thay đổi động phần mềm trong khi hoạt động
Tăng độ an toàn
Trang 7Biên dịch và thông dịch
Chương trình nguồn được biên dịch sang
mã đích (bytecode)
Mã đích (bytecode) được thực thi trong
môi trường thông dịch (máy ảo)
Trang 8Các dạng ứng dụng của Java
Desktop applications - J2SE
Java Applications: ứng dụng Java thông
thường trên desktop
Java Applets: ứng dụng nhúng hoạt động
trong trình duyệt web
Server applications - J2EE
JSP và Servlets
Mobile (embedded) applications – J2ME
Trang 9Đặc trưng của Java
JVM – máy ảo Java
Cơ chế giải phóng bộ nhớ tự động
Bảo mật chương trình
Trang 10JVM - Máy ảo Java
Máy ảo phụ thuộc vào platform (phần cứng, OS)
Cung cấp môi trường thực thi cho chương trình Java (độc lập với platform)
Máy ảo đảm bảo an toàn cho hệ thống
Máy ảo thông thường được cung cấp dưới dạngphần mềm
JRE - Java Runtime Environment
Java platform: JVM + APIs
Trang 11Giải phóng bộ nhớ
(Garbage Collection)
Java cung cấp một tiến trình mức hệ
thống để theo dõi việc cấp phát bộ nhớ
Trang 12Chống sao chép
Trang 13javac Chương trình dịch chuyển mã nguồn sang bytecode
java Bộ thông dịch: Thực thi java application
appletviewer Bộ thông dịch: Thực thi java applet mà không
cần sử dụng trình duyệt như Nestcape, hay IE, v.v.
javadoc Bộ tạo tài liệu dạng HTML từ mã nguồn và chú
thích
jdb Bộ gỡ lỗi (java debuger)
javap Trình dịch ngược bytecode
Trang 14Công nghệ JIT
Just-In-Time Code Generator
Trang 15Java Applications
Chương trình ứng dụng hoàn chỉnh
Giao diện dòng lệnh hoặc đồ họa
Được bắt đầu bởi phương thức (hàm)
main() là phương thức public static
Trang 16Chương trình Java đơn giản
TestGreeting.java:
public class TestGreeting{
public static void main (String[] args) {
System.out.println(”Hello, world”);
}
}
public class
public static method
class object message
Trang 18Một chút cải tiến
TestGreeting.java:
public class TestGreeting {
public static void main(String[] args) {
Greeting gr = new Greeting();
gr.greet();
}
}
Greeting.java:
public class Greeting {
public void greet() {
System.out.print(”Hello, world”);
}
Trang 20Java Applets
Được nhúng trong một ứng dụng khác
(web browser)
Có giao diện hạn chế (đồ họa)
Không truy cập được tài nguyên của client
(không thực hiện được các hành vi xấu)
Trang 21Applet đơn giản
Welcome.java:
// Java packages
import java.awt.Graphics;
import java.applet.Applet;
public class Welcome extends Applet {
public void paint(Graphics g)
{
// call superclass version of method paint super.paint(g);
// draw a String g.drawString(”Welcome to Java programming!”, 25, 25);
Trang 22Nhúng vào trang Web
Trang 23Thực hiện (trong webbrowser)
Trang 24Thực hiện
appletviewer Welcome.html
Trang 25Các phương thức của Applet
init() : khởi tạo applet
start() : khởi động applet
mặc định sẽ gọi paint()
stop() : dừng applet
destroy() : giải phóng (hủy) applet
Trang 26Thực hành
Đăng nhập vào website môn học
Làm quen với môi trường phát triển Java trên Linux và Windows
Tập viết các ứng dụng nhỏ
các ví dụ trong bài giảng
chuyển các bài thực hành cơ bản của môn
C/C++ sang Java
Trang 27Bài tập: Tìm hiểu về Java
Các kiểu dữ liệu cơ bản
các kiểu số nguyên, kiểu ký tự, kiểu logic
Từ khóa, cách đặt tên (lớp, phương thức, biến
Các cấu trúc điều khiển cơ bản
điều kiện
vòng lặp
switch
Trang 28Lập trình hướng đối tượng
Khái niệm
Trang 29Nội dung
Lịch sử phát triển của kỹ thuật lập trình
Hạn chế của kỹ thuật lập trình truyền
thống
Khái niệm lập trình hướng đối tượng
Đóng gói / Che dấu thông tin
Trang 30Tài liệu tham khảo
Trang 31Mục tiêu của kỹ sư phần mềm
Tạo ra sản phẩm tốt một cách có hiệu quả
Nắm bắt được công nghệ
Kiếm được nhiều tiền hơn nữa!
Trang 32 Người dùng ngày càng đòi hỏi nhiều chức
năng, đặc biệt là chức năng thông minh
Phần mềm luôn cần được sửa đổi
Trang 33Giảm chi phí và thời gian phát triển
Nâng cao chất lượng
Trang 36Lập trình không có cấu trúc
(non-structured programming)
Là phương pháp xuất hiện đầu tiên
các ngôn ngữ như Assembly, Basic
Trang 40khó đảm bảo tính đúng đắn của dữ liệu
không tự động khởi tạo hay giải phóng dữ liệu động
Trang 41Tại sao phải thay đổi cấu trúc dữ liệu?
Cấu trúc dữ liệu là mô hình của bài toán cần giải quyết
Do thiếu kiến thức về bài toán, về miền ứng dụng , không phải lúc nào cũng tạo được cấu trúc dữ liệu
hoàn thiện ngay từ đầu
Tạo ra một cấu trúc dữ liệu hợp lý luôn là vấn đề đau đầu của người lập trình.
Bản thân bài toán cũng không bất biến
Cần phải thay đổi cấu trúc dữ liệu để phù hợp với các
Trang 42Các vấn đề
Thay đổi cấu trúc
dẫn đến việc sửa lại mã chương trình (thuật toán)
tương ứng và làm chi phí phát triển tăng cao.
không tái sử dụng được các mã xử lý ứng với cấu trúc
dữ liệu cũ.
Đảm bảo tính đúng đắn của dữ liệu
một trong những nguyên nhân chính gây ra lỗi phần mềm là gán các dữ liệu không hợp lệ
cần phải kiểm tra tính đúng đắn của dữ liệu mỗi khi
Trang 43MyDate d = new MyDate();
d.day = 32; // invalid day
d.day = 31; d.month = 2; // how to check
d.day = d.day + 1; //
Trang 44Ví dụ: MyDate (2)
Thay đổi cấu trúc dữ liệu:
MyDate.java:
class MyDate {
public short year;
public short mon_n_day;
}
Trang 45Giải pháp
Che dấu dữ liệu (che dấu cấu trúc)
Truy cập dữ liệu thông qua giao diện xác định
class MyDate {
private int year, mon, day;
public int getDay() { }
public boolean setDay(int) { }
Trang 47Đóng gói/che dấu thông tin
Đóng gói dữ liệu và các thao tác tác động lên dữ liệu thành một thể thống nhất (lớp đối tượng) thuận tiện cho sử dụng lại
Che dấu thông tin
thao tác với dữ liệu thông qua các giao diệnxác định
che dấu người lập trình khách (client
programmer) cái có khả năng thay đổi (tách
cái bất biến ra khỏi cái khả biến)
Trang 48Lớp và đối tượng
Lớp đối tượng (class) là khuôn mẫu để
sinh ra đối tượng
Đối tượng là thể hiện (instance) của một lớp Đối tượng có
định danh
thuộc tính (dữ liệu)
hành vi (phương thức)
Trang 49Hệ thống hướng đối tượng
Bao gồm một tập các đối tượng
mỗi đối tượng chịu trách nhiệm một công việc
Các đối tượng tương tác thông qua trao đổi thông điệp (message)
Các đối tượng có thể tồn tại phân tán/có
thể hoạt động song song
Trang 50Mô hình hóa đối tượng
+ getDay() + setDay(int) + getMonth() + setMonth(int) + getYear()
Trang 51Lịch sử ngôn ngữ lập trình
FORTRAN I FORTRAN II
ALGOL 58
CPL COBOL
COMTRAN FLOW-MATIC
FORTRAN IV
B
BCPL ALGOL 68
MODULA 2
MODULA 3
OBERON
Trang 52Lập trình hướng đối tượng làm tăng
năng suất lập trình (năng suất phát triển)
chất lượng phần mềm
tính hiểu được của phần mềm
vòng đời của phần mềm
Trang 53OOP và OOL
Có thể thể hiện phần nào tư tưởng đóng gói/che dấu thông tin trên ngôn ngữ thủ
tục
không triệt để, khó kiểm soát
Ngôn ngữ hướng đối tượng cung cấp khả năng kiểm soát truy cập; ngoài ra
kế thừa
đa hình
Trang 54Lớp và đối tượng trong Java
Trang 55Nội dung
Định nghĩa lớp
Thuộc tính
Phương thức
Kiểm soát truy cập
Phương thức khởi tạo
Thao tác với đối tượng
Trang 56Tài liệu tham khảo
Trang 58Đối tượng
Đối tượng được thao tác thông qua tham chiếu
Tham chiếu đóng vai trò gần giống như một con trỏ
Đối tượng phải được tạo ra một cách tường
minh bằng toán tử new
MyDate d;
d = new MyDate();
MyDate myBirthday = d;
Trang 59Thuộc tính, phương thức và kiểm soát truy cập
class MyDate {
Trang 60MyDate d = new MyDate();
d.year = 2005; // compile error
d.setYear(2005);
System.out.println(”Year=” + d.getYear());
Trang 61Phương thức trùng tên (overload)
Có thể định nghĩa các phương thức trùng tên, tuy nhiên phải phân biệt bởi danh sách tham số
class MyDate {
…
public boolean setMonth(int m) { …}
public boolean setMonth(String s) { …}
}
d.setMonth(9);
d.setMonth(”September”);
Trang 62Phương thức khởi tạo (constructor)
Dữ liệu nên được khởi tạo trước khi sử
dụng
lỗi khởi tạo là một trong các lỗi phổ biến
Phương thức khởi tạo
là phương thức đặc biệt được gọi tự động
sau khi tạo ra đối tượng
nhằm mục đích chính là khởi tạo cho các
thuộc tính của đối tượng
Trang 63Phương thức khởi tạo
Có tên trùng với tên lớp
Không nhận giá trị trả lại
Mỗi khi đối tượng được tạo ra bởi toán tử new , hệ thống sẽ tự động gọi phương
thức khởi tạo.
nếu không khai báo, hệ thống sẽ gọi
constructor mặc định là một phương thức
rỗng
Trang 65Ví dụ: Constructor mặc định
class SayMsg {
SayMsg() {
System.out.println(”Hello”);}
}
SayMsg msg = new SayMsg();
Trang 66SayMsg msg1 = new SayMsg();
SayMsg msg2 = new SayMsg(”Java”);
Trang 67SayMsg msg1 = new SayMsg(); // error
SayMsg msg2 = new SayMsg(””);
Trang 68Copy constructor
Khởi tạo đối tượng bằng một đối tượng khác
public class MyDate {
private int year, month, day;
Trang 69MyDate d = new MyDate();
Trang 70Kiểm soát truy cập
public class MyDate {
private int year, month, day;
Trang 71Hiểu thêm về Java
Trang 73Tài liệu tham khảo
Trang 74Kiểu dữ liệu nguyên thủy
Java cung cấp các kiểu nguyên thủy
số: byte, short, int, long, float, double
không có khái niệm unsigned
kích thước cố định trên mọi platform
Tồn tại lớp đối tượng tương ứng: Interger, Float,
Interger count = new Interger(0);
Trang 751.79769313486231570e+308 4.94065645841246544e-324
64
double
3.40282346638528860e+38 1.40129846432481707e-45
32
float
+ 2 63 - 1
- 2 63 64
long
+ 2 31 - 1, 0x7fffffff
- 2 31 , 0x80000000 32
int
32767 (2 15 -1) -32768 (-2 15 )
16
short
+127 (2 7 -1) -128 (-2 7 )
8
byte
0xffff 0x0
16
char
Giá trị cực đại Giá trị cực tiểu
Độ rộng (bits) Kiểu
dữ liệu
Trang 76Dữ liệu được lưu trữ ở đâu
Dữ liệu kiểu nguyên thủy
thao tác thông qua tên biến
Dữ liệu là thuộc tính của đối tượng
Đối tượng được thao tác thông qua tham
chiếu
Vậy biến kiểu nguyên thủy, tham chiếu và đối tượng được lưu trữ ở đâu?
Trang 77temporary data
dynamic data
Trang 78Tham chiếu
Đối tượng được thao tác thông qua tham chiếu
là con trỏ tới đối tượng
thao tác trực tiếp tới thuộc tính và phương thức
không có các toán tử con trỏ
phép gán (=) không phải là phép toán copy nội dung đối tượng
tham chiếu được lưu trữ trong vùng nhớ
static/stack như các con trỏ trong C/C++
Trang 79Toán tử New
Phải tạo mọi đối tượng một cách tường
minh bằng toán tử new
Trang 80Phép gán “=”
Phép gán không phải là copy thông thường
copy nội dung của tham chiếu
hai tham chiếu sẽ tham chiếu đến cùng đối tượng
Integer m = new Integer(10);
Integer n = new Integer(20);
m = n;
n.setValue(50);
System.out.print(m);
Trang 82Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1 == n2);
System.out.println(n1 != n2);
false
Trang 83So sánh nội dung đối tượng
MyDate d1 = new MyDate(10,10,1954);
MyDate d2 = new MyDate(d1);
System.out.println(d1.equalTo(d2));
Trang 84Không phải viết mã giải phóng đối tượng
Do đó, không bao giờ quên giải phóng đối tượng
Trang 85GC hoạt động như thế nào
Sử dụng cơ chế đếm?
mỗi đối tượng có một số đếm các tham chiếu trỏ tới
giải phóng đối tượng khi số đếm = 0
Giải phóng các đối tượng chết
kiểm tra tất cả các tham chiếu
đánh dấu các đối tượng còn được tham chiếu
giải phóng các đối tượng không được tham chiếu
Trang 86Garbage Collection
MyDate openDate = new MyDate(1,10,2005);
MyDate startDate = new MyDate(10,10,2005);
Trang 87Truyền tham số và nhận giá trị trả lại
Truyền giá trị
đối với dữ liệu kiểu nguyên thủy
giá trị của tham số (RValue) được copy lên stack
có thể truyền hằng số (vd: 10, 0.5, …)
Truyền tham chiếu
đối với đối tượng
nội dung của tham chiếu (LValue) được copy lên stack
Trang 89Truyền tham chiếu
class MyDate {
int year, month, day;
public MyDate(int y, int m, int d) {
year = y; month = m; day = d;
public MyDate copy() {
return new MyDate(day, month, year);
}
Trang 90
Truyền tham chiếu
Trang 91Tham chiếu this
Java cung cấp tham chiếu this để trỏ tới chính đối tượng đang hoạt động
this được sử dụng vào các mục đích
như
tham chiếu tường minh đến thuộc tính và
phương thức của đối tượng
truyền tham số và trả lại giá trị
dùng để gọi constructor
Trang 92this làm giá trị trả lại
Trang 94Gọi constructor bằng this
class MyDate {
private int year, month, day;
public MyDate(int y, int m, int d) {
}
// copy constructor
MyDate(MyDate d) {
this(d.year, d.month, d.day);
System.out.println(”copy constructor called”);
Trang 95Phương thức và thuộc tính static
Có thể khai báo phương thức và thuộc
tính là tĩnh (static)
độc lập với đối tượng
có thể sử dụng mà không cần có đối tượng
Trang 96Gói các lớp đối tượng (package)
Các lớp đối tượng được chia thành các gói
nếu không khai báo thì các lớp thuộc gói default
các lớp trong cùng một tệp mã nguồn luôn thuộc cùng một gói
Tồn tại mức truy cập package
mức package là mặc định (nếu không khai báo tường minh là public hay private)
các đối tượng của các lớp thuộc cùng gói có thể truy cập đến non-private members của nhau
chỉ có thể tạo (new) đối tượng của lớp được khai báo
là public của gói khác
Trang 97class HelloMsg {
void sayHello() {
System.out.println(”Hello, world!”); }
}
public class Hello {
public static void main(String[] args) {
HelloMsg msg = new HelloMsg();
msg.sayHello();
Trang 98Khai báo và sử dụng package
Khai báo gói bằng lệnh package
các gói được lưu trữ theo cấu trúc cây thư
Trang 99Đối tượng hợp thành (Composition)
Đối tượng có thể chứa các đối tượng khác (các thuộc tính không thuộc kiểu nguyên thủy)
Thuộc tính là tham chiếu phải được tạo ra bằng new
hoặc được gán cho một đối tượng đã tồn tại
class Person {
private String name;
private MyDate birthday;
}
Trang 100Get và Set thuộc tính không thuộc kiểu nguyên thủy
Trang 101Sử dụng copy constructor
class Person {
private String name;
private MyDate birthday;
public Person(String s, MyDate d) {
name = s;
birthday = new MyDate(d);
}
public MyDate getBirthday() {
return new MyDate(birthday);
}
public void setBirthday(MyDate d) {
birthday = new MyDate(d);
}
Trang 102
Vào ra từ luồng dữ liệu chuẩn
Luồng ra chuẩn: System.out
xuất ra luồng ra chuẩn (standard output)
có thể tái định hướng
Luồng thông báo lỗi: System.err
xuất ra Console (thiết bị output chuẩn)
không thể tái định hướng
Luồng dữ liệu vào chuẩn: System.in
chưa sẵn sàng cho sử dụng
Trang 103Nhập dữ liệu từ luồng vào chuẩn
InputStream: lớp đối tượng ứng với luồng vào
chuẩn
System.in : đối tượng tương ứng
chưa có phương thức nhập dữ liệu
InputStreamReader: nhập dữ liệu không thông qua buffer
đọc từng ký tự (kể cả ký tự đặc biệt)
BufferedReader: sử dụng buffer
đọc từng dòng
Trang 104Ví dụ
import java.io.*;
public class Echo {
public static void main(String[] args)
throws IOException {
InputStreamReader reader;
BufferedReader bufReader;
reader = new InputStreamReader(System.in);
bufReader = new BufferedReader(reader);
Trang 107Tham số dòng lệnh
CmdLineParas.java:
public class CmdLineParas {
public static void main( String[] args ) {
for (int i=0; i< args.length ; i++)
Trang 108Kế thừa
Trang 109thêm phương thức, thuộc tính
kiểm soát truy cập
constructor
Trang 110Tài liệu tham khảo
Trang 111Sử dụng lại
Tồn tại nhiều loại đối tượng có các thuộc tính và hành vi tương tự hoặc liên quan
đến nhau
Person, Student, Manager,…
Xuất hiện nhu cầu sử dụng lại các mã
nguồn đã viết
Sử dụng lại thông qua copy
Sử dụng lại thông qua quan hệ has_a