Đây là tài liệu lập trình hướng đối tượng dành cho những bạn học sinh, sinh viên và những người đam mê lập trình. Chúng tôi đã tổng hợp toàn bộ kỹ thuật lập trình từ căn bản đến nâng cao, bao gồm 12 bài trong đó.
Trang 1Bộ môn Công nghệ Phần mềm
Viện CNTT & TT Trường Đại học Bách Khoa Hà Nội
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Bài 01 Tổng quan về OOP
Nội dung
1 Lập trình hướng đối tượng
2 Công nghệ hướng đối tượng
3 Ngôn ngữ lập trình Java
4 Ví dụ và bài tập
2
Nội dung
2 Công nghệ hướng đối tượng
Trang 2Đối tượng phần mềm Đối tượng phần mềm Xe Đạp
Mô hình hóa đối tượng
Trang 3Gọi hàm vs Gửi thông điệp
Gọi hàm (Call function)
Gửi thông điệp
1 Lập trình hướng đối tượng
Trang 5c Mô đun hóa (Modularity)
Gia tăng mức độ trừu tượng hóa
Tài sản
Bất động sản
Tiết kiệm Tài khoản ngân hàng
Tiên gửi Cổ phiếu Chứng khoán
Các loại giấy tờ có giá trị
Nội dung
1 Lập trình hướng đối tượng
2 Công nghệ hướng đối tượng
Ngày nay, nhắc đến Java, không còn nhắc
đến như một ngôn ngữ mà còn là một công
Trang 6Lịch sử phát triển của J2SE
3.3 Mô hình dịch của Java
a Mô hình biên dịch truyền thống:
34
3.3 Mô hình dịch của Java (2)
b Mô hình dịch của Java:
35
3.3 Mô hình dịch của Java (3)
Máy ảo Java (Java Virtual Machine):
Máy ảo Java là trái tim của ngôn ngữ Java
36
Trang 73.4 Các tính năng của Java
Java được thiết kế:
Ngôn ngữ lập trình mạnh, đầy đủ tính năng và
thuần hướng đối tượng.
3.4 Các tính năng của Java (5)
Đa luồng (Multi-threaded)
Khả chuyển (Portable)
42
Trang 83.4 Các tính năng của Java (6)
Các môi trường phát triển
Java Development Kit
Integrated Development Environments (IDEs):
3.5 Các kiểu chương trình Java (2)
Ứng dụng Web (Web application)
45
Nội dung
1 Lập trình hướng đối tượng
2 Công nghệ hướng đối tượng
// Chuong trinh hien thi dong chu “Hello World”
public class HelloWorld {
/* Phuong thuc main se duoc goi dau tien
trong bat cu ung dung Java nao*/
public static void main(String args[]){
System.out.println( “Hello World!" );
} // ket thuc phuong thuc main
} // ket thuc lop HelloWorld
47
Ví dụ 1 (tiếp)
Chú thích (Comment)
Java phân biệt chữ hoa chữ thường
Từ khóa có sẵn của Java:
class: Khai báo lớp
public: Quy định phạm vi truy cập
Tên lớp chứa hàm main phải trùng với tên file java.
48
Trang 9Cài đặt và chạy thử chương trình Java
Bước 1: Cài đặt j2sdk1.5/6/7, cài đặt các biến môi trường
JCreator: F7 hoặc Build Build Project/File
Bước 5: Chạy chương trình
cmd: java HelloWorld.class
Textpad: Ctrl + 2
JCreator: F5 hoặc Run Run Project/File
49
Biến môi trường
PATH = …;C:\Program Files\Java\jdk1.6\bin
CLASSPATH = C:\Program Files\Java\jdk1.6\lib;.;C:\Program Files\Java\jdk1.6\include
50
51
Ví dụ 2 - GUI
import javax.swing.JOptionPane;
public class FirstDialog{
public static void main(String[] args){
JOptionPane.showMessageDialog(null,
”Xin chao ban!”);
System.exit(0);
} }
52
Ví dụ 3 – Nhập, xuất dữ liệu
import javax.swing.JOptionPane;
public class HelloNameDialog{
public static void main(String[] args){
Trang 10Bộ môn Công nghệ Phần mềm Viện CNTT & TT Trường Đại học Bách Khoa Hà Nội
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Bài 02 Cú pháp Java cơ bản
Mục tiêu bài học
trình Java, tạo ra các định danh hợp lệ
Mô tả các kiểu dữ liệu cơ bản trong Java và cách sử dụng
Các toán tử
Giải thích về phạm vi của biến
Sử dụng các câu lệnh điều khiển, cấu trúc điều kiện, cấu trúc lặp và rẽ nhánh
Khai báo, khởi tạo các biến và mảng trong Java
Trang 132.4 Khai báo và khởi tạo biến
Các biến đơn (biến không phải là mảng) cần
phải được khởi tạo trước khi sử dụng trong
Trang 143 Toán tử (Operators)
Java cung cấp nhiều dạng
toán tử
25
Thứ tự ưu tiên của toán tử
Cho biết toán tử nào thực hiện trước – được xác định bởi các dấu ngoặc đơn hoặc theo ngầm định
default action(s)
[true]
case b action(s) break
case z action(s) break
[false ]
Trang 15}
int x = 2;
do { x++;
public static void main(String args[]) {
int i=1, sum=0;
for (i=1;i<=10;i+=2) sum+=i;
System.out.println (“Sum of first five
old numbers is “ + sum);
} }
Trang 164.5 Các lệnh thay đổi cấu trúc điều khiển (2)
5.1 Khai báo và khởi tạo mảng
Khai báo, khởi tạo giá trị ban đầu:
Nếu không khởi tạo nhận giá trị mặc định
42
Trang 17-45 6 0 72 1543 -89 0 62 -3 1 6453 78
boolean bit[] = new boolean[MAX];
float[] value = new float[2*3];
b[ 2 ][ 0 ] b[ 2 ][ 1 ] b[ 2 ][ 2 ] b[ 2 ][ 3 ]
Trang 18Bộ môn Công nghệ Phần mềm Viện CNTT & TT Trường Đại học Bách Khoa Hà Nội
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Bài 03 Đóng gói và xây dựng lớp,
tạo và sử dụng đối tượng
Mục tiêu bài học
Nêu được bản chất, vai trò của trừu tượng hóa
Giải thích về đóng gói và che giấu thông tin
Định nghĩa lớp, thực hiện ẩn
Tạo các phương thức, các trường/thuộc tính
Tạo và sử dụng đối tượng
Phương thức khởi tạo
Khai báo và khởi tạo đối tượng
1.1 Trừu tượng hóa
2 loại trừu tượng hóa
1.1 Trừu tượng hóa (2)
Trừu tượng hóa điều khiển
Trừu tượng hóa dữ liệu
Trang 191.2 Trừu tượng hóa dữ liệu trong OOP
Đối tượng trong thực tế phức tạp
1.2 Trừu tượng hóa dữ liệu (3)
Any model that includes the most important,
essential, or distinguishing aspects of
something while suppressing or ignoring less
important, immaterial, or diversionary details.
The result of removing distinctions so as to
emphasize commonalties (Dictionary of
Object Technology, Firesmith, Eykholt,
1995).
9
1.2 Trừu tượng hóa dữ liệu (2)
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
10
Trang 212.1 Đóng gói (3)
21
Don’t know how
it works, but it works!
Trang 22private String name;
public String getName() { return this.name;
} public void setName(String name) {
this.name = name;
} }
28
Ví dụ: private (2)
class Student{
private String name;
public String getName() {
students[0] = new Students();
//student.name = “Hung”; error
Trang 23public final int VAL_THREE = 39;
private final int[] A = { 1, 2, 3, 4, 5, 6 };
Trang 24package com.megabank.models;
public class BankAccount {
private String owner;
private double balance;
public boolean debit(double amount){
Cơ chế che giấu dữ liệu (2)
Accessor (getter):
Mutator (setter):
Trang 263.2 Phương thức khởi tạo (4)
Phương khởi tạo mặc định (default
constructor)
49
3.3 Khai báo và khởi tạo đối tượng
Đối tượng được tạo ra, thể hiện hóa (instantiate) từ một mẫu chung (lớp).
50
3.3 Khai báo và khởi tạo đối tượng (2)
Đối tượng cần được khởi tạo trước khi sử
Department dept[] = new Department[100];
Test[] t = {new Test(1),new Test(2)};
54
Trang 27Ví dụ 1
class BankAccount{
private String owner;
private double balance;
}
public class Test{
public static void main(String args[]){
BankAccount acc1 = new BankAccount();
}
}
55
Ví dụ 2
public class BackAccount{
private String owner;
private double balance;
public BankAccount(){
owner = ”noname”;
} } public class Test{
public static void main(String args[]){
BankAccount acc1 = new BankAccount();
} }
56
Ví dụ 3
public class BankAccount {
private String owner;
private double balance;
public BankAccount(String name){
public class Test{
public static void main(String args[]){
BankAccount account1 = new BankAccount();
BankAccount account2 = new BankAccount(“Hoang”);
public class BankAccount{
private String owner;
private double balance;
public BankAccount(String name) { setOwner(name);
} public void setOwner(String o){ owner = o; } public String getOwner(){ return owner; } }
public class Test{
public static void main(String args[]){
BankAccount acc1 = new BankAccount(“”);
BankAccount acc2 = new BankAccount(“Hong”);
Trang 28Tự tham chiếu – this
Cho phép truy cập vào đối tượng hiện tại của
lớp.
61
public class BankAccount{
private String owner;
private double balance;
public BankAccount() { } public void setOwner(String owner){
this.owner = owner;
} public String getOwner(){ return owner; } }
public class Test{
public static void main(String args[]){
BankAccount acc1 = new BankAccount();
BankAccount acc2 = new BankAccount();
Trang 29Bộ môn Công nghệ Phần mềm Viện CNTT & TT Trường Đại học Bách Khoa Hà Nội
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Bài 04 Các kỹ thuật xây dựng lớp
và sử dụng đối tượng
Mục tiêu bài học
Nêu được bản chất, vai trò và biết sử dụng kỹ thuật chồng phương thức, chồng phương thức khởi tạo
Thành viên đối tượng, thành viên lớp
Hiểu về cách thức quản lý bộ nhớ và đối tượng trong Java
Biết cách sử dụng package, một số lớp tiện ích trong Java: Wrapper class, Math, System, String
3 Quản lý bộ nhớ trong Java
4 Truyền tham số cho phương thức
5 Một số lớp tiện ích trong Java
3
Nội dung
2 Thành viên ĐT và thành viên lớp
3 Quản lý bộ nhớ trong Java
4 Truyền tham số cho phương thức
5 Một số lớp tiện ích trong Java
Trang 301.1 Chồng phương thức (3)
Ví dụ 2:
class MyDate {
int year, month, day;
public boolean setMonth(int m) { …}
public boolean setMonth(String s) { …}
}
public class Test{
public static void main(String args[]){
MyDate d = new MyDate();
void prt(String s) { System.out.println(s); }
void f2(short x) { prt("f3(short)"); }
void f2(int x) { prt("f3(int)"); }
void f2(long x) { prt("f5(long)"); }
void f2(float x) { prt("f5(float)"); }
Điều gì xảy ra nếu thực hiện:
1.2 Chồng phương thức khởi tạo
Trong nhiều tình huống khác nhau cần khởi tạo đối tượng theo nhiều cách khác nhau
10
Ví dụ
public class BankAccount{
private String owner;
private double balance;
public BankAccount(){owner = “noname”;}
public BankAccount(String o, double b){
owner = o; balance = b;
}
}
public class Test{
public static void main(String args[]){
BankAccount acc1 = new BankAccount();
Trang 31Ví dụ
public class Ship {
private double x=0.0, y=0.0
private double speed=1.0, direction=0.0;
public String name;
public Ship(String name) {
this.name = name;
}
public Ship(String name, double x, double y) {
this(name); this.x = x; this.y = y;
}
public Ship(String name, double x, double y,
double speed, double direction) {
} public void move() { move(1);
} public void move(int steps) { double angle = degreesToRadians(direction);
x = x + (double)steps*speed*Math.cos(angle);
y = y + (double)steps*speed*Math.sin(angle);
} public void printLocation() { System.out.println(name + " is at ("
3 Quản lý bộ nhớ trong Java
4 Truyền tham số cho phương thức
5 Một số lớp tiện ích trong Java
JOptionPane.showMessageDialog(null,"Ban da thao tac loi", "Thong bao loi", JOptionPane.ERROR_MESSAGE);
JOptionPane.showConfirmDialog(null,"Ban co chac chan muon thoat?", "Hay lua chon",
JOptionPane.YES_NO_OPTION);
18
Trang 32Thay đổi giá trị của một thành viên static
trong một đối tượng của lớp?
20
Ví dụ 1
class TestStatic{
public static int iStatic;
public int iNonStatic;
}
public class TestS {
public static void main(String[] args) {
TestStatic obj1 = new TestStatic();
System.out.println("Gia tri cua i la" + i);
} }
22
2.2 Thành viên hằng
Ví dụ:
final double PI = 3.141592653589793;
public final int VAL_THREE = 39;
private final int[] A = { 1, 2, 3, 4, 5, 6 };
23
Instance member vs Class member
24
Trang 33Nội dung
1 Chồng phương thức
2 Thành viên ĐT và thành viên lớp
4 Truyền tham số cho phương thức
5 Một số lớp tiện ích trong Java
25
3 Quản lý bộ nhớ trong Java
Java không sử dụng con trỏ
Trang 34Phương thức void finalize()
Lớp nào cũng có phương thức finalize()
Employee a = new Employee(1);
Employee b = new Employee(1);
public class Equivalence {
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
} public class EqualsMethod2 { public static void main(String[] args) { Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));
} }
36
Trang 35Nội dung
1 Chồng phương thức
2 Thành viên ĐT và thành viên lớp
3 Quản lý bộ nhớ trong Java
thức
5 Một số lớp tiện ích trong Java
37
4 Truyền tham số cho phương thức
Có thể sử dụng bất kỳ kiểu dữ liệu nào cho tham số của phương thức hoặc constructor
38
4 Truyền tham số cho phương thức (2)
Java: pass-by-value
39
4.1 Với kiểu dữ liệu tham trị
Các giá trị nguyên thủy không thể thay đổi khi truyền như một tham số
} public void setX(double x) { this.x = x; } public void setY(double y) { this.y = y; } public void printPoint() {
System.out.println("X: " + x + " Y: " + y);
} }
42
Trang 36public class Test {
public static void tricky(Point arg1, Point
arg2) {
arg1.setX(100); arg1.setY(100);
Point temp = arg1;
arg1 = arg2; arg2 = temp;
}
public static void main(String [] args) {
Point pnt1 = new Point(0,0);
Point pnt2 = new Point(0,0);
4.3 Truyền số lượng tham số tùy ý
Được gọi là varargs.
3 Quản lý bộ nhớ trong Java
4 Truyền tham số cho phương thức
46
5.1 Package trong Java
Package giống như thư mục
47
5.1 Package trong Java (2)
Tên đầy đủ của lớp:
48
Trang 37a Tham chiếu giữa các lớp
Ví dụ:
public class HelloNameDialog{
public static void main(String[] args){
b Các package trong Java (2)
Các package cơ bản trong Java
java.util
java.io
52
b Các package trong Java (3)
Các package cơ bản trong Java
java.sql
53
5.2 Các lớp bao (Wrapper class)
Mỗi kiểu dữ liệu nguyên thủy có một lớp tương ứng gọi là lớp bao:
54
Trang 38Kiểu String là một lớp và không phải là kiểu
dữ liệu nguyên thủy
60
Trang 39a Ghép xâu
Toán tử +
Các kiểu dữ liệu cơ bản sử dụng trong lời gọi
println() được chuyển đổi tự động sang kiểu
String s1 = new String(“Hello”);
String s2 = new String(“Hello”);
64
Hello s1
s2
Hello s1
s2
Hello
d Điểm đặc biệt của String
Khởi tạo String theo 2 cách:
Gán 1 giá trị literal
Dùng toán tử new (Không khuyến khích
dùng)
Ví dụ:
String str1 = "Java is Hot";
String str2 = new String("I'm cool");
String s4 = new String("Hello");
String s5 = new String("Hello");
66
Trang 405.4 StringBuffer
String là kiểu bất biến:
StringBuffer là kiểu biến đổi:
72
Trang 42Bộ môn Công nghệ Phần mềm Viện CNTT & TT Trường Đại học Bách Khoa Hà Nội
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Bài 4B Nested Class
class NestedClass {
} }
static class StaticNestedClass {
} class InnerClass {
} }
4
3.1 Static nested classes
Được truy cập từ tên của class bao nó
Để tạo 1 đối tượng của static nested class:
Chỉ được truy cập các thành viên static của
class bao nó
5
3.1 Static nested classes (2)
public class Outside { public static class Skinside { public Skinside()
{ System.out.println("Demo static");
} } public class Inside { }
public static void main(String[] arg) { Outside.Skinside example = new Outside.Skinside();
} }
6
Trang 433.2 Inner Class
1 thể hiện (instance) của inner class chỉ tồn
tại được trong 1 thể hiện của outer class
7
3.2 Inner Class (2)
Inner class có thể truy cập tới 1 member bất kỳ của outer class
Inner class không được có thành phần static
public class Outer { private int id;
private class Inner {
private static int defaultId; //Error
public Inner() {
id = 00001; //Truy cập được id ngoài }
}
8
public class DataStructure {
private final static int SIZE = 15;
private int[] arrayOfInts = new int[SIZE];
public DataStructure() {//fill the array with ascending integer values
for (int i = 0; i < SIZE; i++) {
arrayOfInts[i] = i;
}
}
public void printEven() {//In chỉ số lẻ trong mảng
InnerEvenIterator iterator = this.new InnerEvenIterator();
while (iterator.hasNext()) {
System.out.println(iterator.getNext() + " ");
}
}
private class InnerEvenIterator { //inner class implements the Iterator pattern
//start stepping through the array from the beginning
private int next = 0;
public boolean hasNext() {
return (next <= SIZE - 1); //check if current element is the last in the array
}
public int getNext() {
int retValue = arrayOfInts[next];
next += 2; //get the next even element
return retValue;
}
}
public static void main(String s[]) {
//fill the array with integer values and print out only values of even indices
DataStructure ds = new DataStructure();
public static void main(String args[]) {
Outer outer = new Outer();
} public class Outer{
private int count = 0;
Counter getCounter(final String name) { return new Counter() {
{ System.out.println("Constructor Counter()");
} public int next() { System.out.print(name); // Access local final System.out.println(count);
return count++;
} };
} public static void main(String[] args) { Outer out = new Outer();
Counter c1 = out.getCounter("Local inner ");
c1.next();
}
12