bài giảng java
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN CÔNG NGHỆ PHẦN MỀM
-o0o -
BÀI GIẢNG MÔN HỌC
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Bộ Môn: Công nghệ phần mềm
Nhóm giảng viên: Ths.Tô Hữu Nguyên
Ths.Phạm Thị Thương Ths.Ngô Thị Lan
Ths.Nguyễn Văn Việt
Trang 2MỤC LỤC
CHƯƠNG 1: GIỚI THIỆU VỀ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 4
1.1 Các phương pháp tiếp cận trong lập trình 4
1.2 Một số khái niệm của Lập trình hướng đối tượng 6
1.3 Các ngôn ngữ lập trình hướng đối tượng 11
CHƯƠNG 2:NGÔN NGỮ JAVA 12
2.1 Đặc điểm ngôn ngữ Java 12
2.2 Các dạng chương trình có thể phát triển với java 12
2.3 Môi trường Java(java flatform) 13
2.4 Cấu trúc 1 tiệp chương trình java 13
2.5 Các phần tử cơ sở của Java 15
2.6 Các kiểu dữ liệu nguyên thủy(cơ bản) 16
2.7.Các phép toán và biểu thức 18
2.8 Các quy tắc chuyển đổi kiểu 22
2.9 Biến và khai báo biến trong java 24
CHƯƠNG 3: LỚP VÀ CÁC THÀNH PHẦN CỦA LỚP 26
3.1 Định nghĩa lớp 26
3.2 Định nghĩa các hàm thành phần 27
3.3 Nạp chồng các hàm thành phần (overloading) 29
3.4 Viết đè các hàm thành phần( kế thừa) 30
3.5 Toán tử tạo lập đối tượng.(Constructor) 33
3.6 Truyền tham số trong lời gọi hàm 34
3.7 Quan hệ kế thừa giữa các lớp 38
3.8 Toán tử móc xích giữa các lớp kế thừa this() và super() 39
1.9.Lớp trừu tượng và giao diện 40
3.10 Phạm vi và các thuộc tính kiểm soát truy nhập các thành phần của lớp 43
CHƯƠNG 4: CÁC CÂU LỆNH ĐIỀU KHIỂN DÒNG THỰC HIỆN VÀ XỬ LÝ NGOẠI LỆ 49
4.1 Các câu lệnh rẽ nhánh: 49
4.3 Các câu lệnh chuyển vị 51
4.4 Ngoại lệ và xử lý ngoại lệ 52
Trang 3CHƯƠNG 5: CÁC LỚP CƠ SỞ VÀ CẤU TRÚC DỮ LIỆU 56
5.1 Cấu trúc mảng 56
5.2 Các lớp cơ sở 58
5.3 Lớp chuỗi (Lớp String) 70
5.4 Lớp StringBuffer 77
5.5 Lớp StringTokenizer 81
TÀI LIỆU THAM KHẢO 82
Trang 4CHƯƠNG 1: GIỚI THIỆU VỀ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 1.1 Các phương pháp tiếp cận trong lập trình
Để phát triển một hệ thống phần mềm, hiện nay ta có hai cách tiếp cận cơ bản đó là:
1) Cách tiếp cận hướng chức năng – Function Oriented
2) Cách tiếp cận hướng đối tượng (Object Oriented)
=> Ta cần phân biệt những đặc trưng cơ bản nhất, đánh giá mặt mạnh, mặt yếu của từng phương pháp để hiểu rõ chúng và áp dụng chúng một cách hiệu quả nhất
1.1.1.Lập trình hướng chức năng (thủ tục)
Trọng tâm của cách tiếp cận này là các hàm chức năng Chức năng chính của bài toán
sẽ thành những chức năng đơn giản hơn và thực hiện làm mịn dần từ trên xuống
Trang 5 Kỹ thuật phân rã các chức năng (hàm) theo cách tiếp cận top-down để tạo ra cấu
-Thuận tiện cho việc thiết kế dữ liệu và nắm bắt thông tin
-Phù hợp với các bài toán vừa và nhỏ
-Tính mở của hệ thống là kém không tận dụng được tài nguyên
-Việc tách rời dữ liệu ra khỏi chức năng xử lý dẫn tới việc che dấu và bảo vệ thông tin trong hệ thống là kém
1.1.2 Lập trình hướng đối tượng
-Chiến lược phát triển phần mềm hướng đối tượng là quan sát thế giới như tập các đối tượng lấy đối tượng làm trung tâm
-Hệ thống bằng tập hợp các đối tượng và quan hệ giữa các đối tượng
VD: Để thực hiện xây một ngôi nhà ta cần 1 kiến trúc sư, 2 kĩ sư xây dựng, 6 thợ xây, 3 phụ vữa, vV……
-Các đối tượng trao đổi với nhau bằng thông điệp (Message)
Trang 6-Không phân tách dữ liệu và chức năng Tiếp cận hướng đối tượng tập trung vào cả thông tin và hành vi
-Cho khả năng mềm dẻo, có khả năng kế thừa cao
Đối tượng=∑ Cấu trúc dữ liệu+Giải thuật
Lập trình hướng đối tượng có hai đặc trưng cơ bản:
• Đóng gói dữ liệu: dữ liệu luôn được tổ chức thành các thuộc tính của lớp đối
tượng Việc truy nhập đến dữ liệu phải thông qua các phương thức của đối tượng lớp
• Sử dụng lại mã nguồn: việc sử dụng lại mã nguồn được thể hiện thông qua cơ
chế kế thừa Cơ chế này cho phép các lớp đối tượng có thể kế thừa từ các lớp đối tượng khác Khi đó, trong các lớp kế thừa, có thể sử dụng các phương thức (mã nguồn) của các lớp bị kế thừa, mà không cần phải định nghĩa lại
1.2 Một số khái niệm của Lập trình hướng đối tượng
1.2.1 Đối tượng(Object)
Đối tượng là khái niệm cơ sở quan trọng nhất của phương pháp tiếp cận LTHĐT, đối tượng là thực thể của hệ thống, cấu thành lên hệ thống các các khái niệm liên quan đến
hệ thống VD: KhachHang, HoaDon, MatHang vv
Đối tượng là khái niệm cho phép mô tả các sự vật, thực thể trong thế giới thực
Đối tượng=Trạng thái+Hành vi+Định danh
VD:Máy tính của tôi, SV Nguyễn Thị A
Trong đó:
*Trạng thái: là tập hợp của các giá trị của các thuộc tính mà đối tượng đang
Có tại một thời điểm
VD:HP, HP Pavilion Entertaiment PC, Core i3, vv…
Trang 71.2.2 Lớp các đối tượng (Class)
Lớp là khái niệm dùng để mô tả tập hợp các các đối tượng có cùng một cấu trúc, cùng hành vi và có cùng mối quan hệ với các đối tượng khác
VD: Sinh Viên, Máy tính Laptop Lớp=các thuộc tính+Các phương thức
Sinh Viên
Thuộc tính
+Mã SV +Họ tên +Địa chỉ +Năm sinh +Chuyên ngành
……
Phương Thức
Trang 8+Học() +Thi()
……
Lớp là sự trừu tượng hóa của đối tượng(tìm kiếm những điểm chung nhất(giống nhau)
bỏ qua những điểm khác nhau
1.2.3 Bao bọc và che dấu thông tin
Việc đóng gói dữ liệu và các hàm vào 1 đơn vị cấu trúc(gọi là lớp) được xem như là 1 nguyên tắc bao bọc và che dấu thông tin Kỹ tuật này cho phép xác định các vùng đặc trưng riêng, công khai bao gồm cả dữ liệu và các hàm nhằm điều khiển hoặc hạn chế những truy nhập tùy tiện của những đối tượng khác
-Các hàm công khai của lớp sẽ đóng vai trò như giao diện của các đối tượng với phần còn lại của hệ thống
-Nguyên tắc bao bọc dữ liệu để ngăn cấm sự truy nhập trực tiếp trong lập trình được gọi
là che dấu thông tin
VD:
Thuốc bổ
+Thành phần//dữ liệu công khai
+Công dụng//dữ liệu công khai
+Tác dụng phụ//dữ liệu công khai
Dữ liệu riêng Hàm riêng
Dữ liệu công khai Hàm công khai
Trang 9+Một số thành phần đặc biệt// dữ liệu che dấu
+Cách dùng()//công khai
+Cách sản xuất()//hàm che dấu
1.2.4 Tính đa hình (polymorphism):
Thể hiện thông qua việc gửi các thông điệp (message) Việc gửi các thông điệp này có
thể so sánh như việc gọi các hàm bên trong của một đối tượng Các phương thức dùng trả lời cho một thông điệp sẽ tùy theo đối tượng mà thông điệp đó được gửi tới sẽ có phản ứng khác nhau Người lập trình có thể định nghĩa một đặc tính (chẳng hạn thông qua tên của các phương thức) cho một loạt các đối tượng gần nhau nhưng khi thi hành thì dùng cùng một tên gọi mà sự thi hành của mỗi đối tượng sẽ tự động xảy ra tương ứng theo đặc tính của từng đối tượng mà không bị nhầm lẫn
Thí dụ khi định nghĩa hai đối tượng "hinh_vuong" và "hinh_tron" thì có một phương thức chung là "chu_vi" Khi gọi phương thức này thì nếu đối tượng là "hinh_vuong" nó
sẽ tính theo công thức khác với khi đối tượng là "hinh_tron"
-Theo nguyên lý chung của đối tượng thì chỉ những thuộc tính và hàm thành phần công khai là được quyền kế thừa còn những hàm thành phần riêng không được phép kế thừa
Trang 101.2.5 Truyền thông điệp
Nguyên lý trao đổi thông tin bằng cách truyền thông điệp cho phép chúng ta xây dựng được những hệ thống mô phỏng gần hơn với thế giới thực
Truyền thông điệp cho một đối tượng tức là phải báo cho nó phải thực hiện một việc, một yêu cầu nào đó Cách ứng xử của của đối tượng sẽ được mô tả trong các hàm công khai
VD:
Trang 111.3 Các ngôn ngữ lập trình hướng đối tượng
C++,C#,Java
C++
Ngôn ngữ C++ được phát triển từ ngôn ngữ C Có thể coi C++ là một cải tiến của C Nó mang đầy đủ các đặc tính của C Một chương trình viết bằng C có thể biên dịch được bằng trình biên dịch của C++ Ở những phiên bản đầu tiên, thực chất mã nguồn C++ đầu tiên được dịch sang mã nguồn C, rồi từ mã nguồn C tiếp tục được biên dịch tiếp C++ là ngôn ngữ lập trình hướng đối tượng, do vậy nó có đầy đủ các tính chất của một ngôn ngữ lập trình hướng đối tượng: tính kế thừa, tính đóng kín và tính đa dạng
Nhưng C++ không phải là ngôn ngữ hướng đối tượng hoàn toàn mà là ngôn ngữ "đa hướng" Vì C++ hỗ trợ C lập trình hướng hành động và lập trình hướng đối tượng C++ kết hợp những ý tưởng hay nhất của lập trình có cấu trúc với việc phân chia một bài toán thành các nhóm nhỏ có quan hệ với nhau, mỗi nhóm con đó là một đối tượng chứa các lệnh và dữ liệu riêng của nó
C++ đưa vào các khái niệm hàm ảo, quá tải hàm, quá tải toán tử cho phép tạo ra các kiểu dữ liệu trừu tượng, hỗ trợ thừa kế bội
Mục tiêu của C++ là tiếp cận những ý tưởng của phương pháp luận hướng đối tượng và trừu tượng dữ liệu
Các đặc tính của C ++ cho phép người lập trình xây dựng những thư viện phần mềm có chất lượng cao phục vụ những đề án lớn
C++ là ngôn ngữ thích hợp cho việc xây dựng những chương trình lớn như các hệ soạn thảo, chương trình dịch, các hệ quản trị cơ sở dữ liệu, các hệ truyền thông,
C#
Trang 12CHƯƠNG 2: NGÔN NGỮ JAVA 2.1 Đặc điểm ngôn ngữ Java
*Đơn giản: java được phát triển trên nền tảng C++ nhưng đơn giản hơn C++ rất nhiều do không kế thừa bội(đa kế thừa), không sử dụng biến con trỏ không sử dụng struct và Union
*Hướng đối tượng: Java được thiết kế xoay quanh mô hình hướng đối tượng vì vậy java tiêu điểm là dữ liệu và các phương thức thao tác lên dữ liệu đó Dữ liệu
và các phương pháp mô tả trạng thái và cách ứng xửa cảu một đối tượng trong java
*Phân tán Java là một ngôn ngữ thông dụng trong việc xây dựng các ứng dụng trên mạng nói chung và ứng dụng web nói riêng
*Trung lập kiến trúc hệ thống
Đây là khả năng một chương trình được viết tại một máy nhưng có thể cahy được tại bất kì đâu
*bảo mật cao
Java cung cấp một số lớp để kiểm tra bao mật và an toàn hệ thống
*Khả năng đa tuyến
Chương trình java sử dụng kĩ thuật đa tiến trình (Multi Thread để thực thi các công việc đồng thời và cung cấp giải pháp đồng bộ giữa các tiến trình)
2.2 Các dạng chương trình có thể phát triển với java
1 Desktop Applications (J2SE)
Chươnng trình ứng dụng độc lập Console, và J2SE(giao diện đồ họa)
2.Server Applications J2EE
JSP và Servlets 3.Mobile Applications J2ME
Trang 132.3 Môi trường Java(java flatform)
Chương trình java có thể biên dịch và thực hiện trên mọi môi trường hệ điều hành
Môi trường java bao gồm 2 thành phần chính
+Máy ảo java(JVM java vitual Machine) là một khái niệm phần mềm dựa trên ý tưởng là một máy tính ảo cung cấp môi trường thực thi cho chương trình java +Java API(java Application interface) là tập hợp gồm các thư viện và các lớp liên quan và các giao diện lập trình được tổ chức thành các gói(packages)
Cài đặt:
+JDK(Java Develop Kit) 1.6
+Công cụ soạn thảo Elipse, Jcreator, NetBean 7.1
public static void main(String[] args) {
// TODO code application logic here
System.out.println("Xin chao");
}
}
2.4 Cấu trúc 1 tiệp chương trình java
//Phần 1(Tùy chọn) Định nghĩa gói
Package <Tên gói>
//Phần 2( không hoặc nhiều) Khai báo các gói cần sử dụng
Import <Tên gói>
Trang 14Phần 3 (Không hoặc nhiều) Định nghĩa các lớp và các giao diện
public static void main(String args[])
{ Scanner input=new Scanner(System.in);// khởi tạo 1 đối tượng thuộc lớp Scanner
System.out.print("Nhap vao ho ten: ");
Phương thức main luôn có dạng;
Public static void main(String args[])
Trang 15{}
Nội dung của hàm main xác định tất cả các công việc để hệ thống thực hiện
Trong chương trình java không có các khai báo tách rời khỏi lớp
*Sử dụng gói(Package)
Package được dùng để đóng gói các lớp trong chương trình lại với nhau thành một khối Đây là một cách hữu hiệu để lưu trữ các lớp gần giống nhau hoặc có cùng một module thành một khối thống nhất
Để đặt tên package trong chương trình, người ta có thể tiến hành như đặt tên thư mục trên ổ đĩa
Nghĩa là bắt dầu bằng tên có phạm vi lớn, cho đến các tên có phạm vi nhỏ, cuối cùng là tên các gói trực tiếp chứa các lớp Phạm vi đặt tên gói, trên thực tế, được tiến hành theo thứ tự phạm vi
lớn đến nhỏ như sau:
• Tên tổ chức
• Tên công ty
• Tên dự án
2.5 Các phần tử cơ sở của Java
2.5.1 Tên gọi( định danh)
-Định danh bao gồm một dãy các ký tự bao gồm chữ cái và chữ số và một số ký
tự đặc biệt định danh dùng để xác định các phần tử như: biến, kiểu biến, tên hàm, tên lớp, tên đối tượng vv…
-Trong java định danh không bắt đầu bằng chữ số không chứa dấu”-“ phân biệt chữ hoa và chữ thường
VD:
Định danh không hợp lệ: 1sinhvien, Sinh-Vien, sinhVien ≠SinhVien
Trang 162.6 Các kiểu dữ liệu nguyên thủy(cơ bản)
Trong mỗi ngôn ngữ lập trình đều định nghĩa một số kiểu dữ liệu cơ bản gọi là những kiểu nguyên thủy
Các kiểu dữ liệu nguyên thủy của java được chia làm ba nhóm:
Kiểu Nguyên
Trang 17Kiểu số nguyên: byte,short,int,long Kiểu ký tự: char
Kiểu thực: float, double
Kiểu logic: boolean
Bảng B3.1 Miền xác định của các giá trị có kiểu nguyên thủy
tượng Ví dụ ứng với kiểu int có lớp Integer, ứng với char là Character, v.v
Mỗi kiểu dữ liệu nguyên thủy đều có miền xác định và các phép toán định nghĩa trên nó
Trang 182.7.Các phép toán và biểu thức
2.7.1 Các phép toán số học được chia thành hai loại:
3 1/ Các phép toán 1 ngôi (đơn nguyên): + (cộng) và - (trừ), các phép đổi dấu,
4 2/ Các phép toán 2 ngôi (nhị nguyên): * (nhân), / (chia), % (lấy modul - phép
chia lấy số dư), + (cộng) và - (trừ)
Chú ý:
Thứ tự thực hiện các phép toán số học hai ngôi là từ trái qua phải
VD int i=10%4*2; i=4;
Khi muốn thay đổi thứ tự ưu tiên thêm cặp() VD int i=10%(4*2);i=2;
Khi hai toán hạng khác nhau về kiểu thực hiện ép kiểu
Phép chia hai toán hạng đều là kiểu nguyên đòi hỏi mẫu #0
Phieps chia số thực cho 0.0 là INF hoặc –INF
Trong java phép lấy phần dư thực hiện được cả với số thực float m=11.5%2.5=1.5;
Các biểu thức tính toán với số nguyên trả về kiểu int khi gán với các biến byte,short, char phải thực hiện ép kiểu tường minh
Trang 19! not
VD: if((diemTB>=6.5)&&(diemTB<=7.0)
{xeploai=”kha”;
}
2.7.3 Toán tử điều kiện
Toán tử điều kiện là loại toán tử đặc biệt vì nó gồm ba thành phần cấu thành lên biểu thức điều kiện
<bt1>?<bt2>:<bt3>;
Bt1: là biểu thức logic(trả về gt true,false)
Bt2: là biểu trức trả về nếu bt1 =true;
Bt2: là biểu thức trả về nếu bt1=false;
Kiểu Tham chiếu
SinhVien sv1=new SinhVien();
SinhVien sv2=sv1;
Trang 20-Trên các giá trị kiểu tham chiếu đối tượng
Cho trước r và s là hai biến tham chiếu đối tượng
+r==s cho giá trị là true nếu r và s cùng tham chiếu đến 1 đối tượng ngược lại cho giá trị là false;
+r!=s cho giá trị là true nếu r và s không cùng tham chiếu đến 1 đối tượng, ngược lại cho giá trị là false;
VD:
SinhVien sv1=new SinhVien();
SinhVien sv2=new SinhVien();
Trang 21<var> = (<type>) (<var> <op> (<exp>));
Trong đó <type> là các kiểu số của <var> Bảng B3.5 mô tả chi tiết hơn các phép gán
Trang 22boolean b1 = false, b2 = false, b3 = true;
b3 &= b1 | b2; // false vì b3 = (b3 & (b1 | b2));
2.8 Các quy tắc chuyển đổi kiểu
Trong nhiều trường hợp đặc biệt ta thực hiện các phép gán mà hai toán hạng không tương tích với nhau về kiểu(VD) trong trường hợp như vậy ta phải sử dụng quy tắc ép kiểu
Quy tắc chung
Trang 23Qui tắc ép kiểu có dạng:
(<type>) <exp>
Trong đó: <type>: kiểu dữ liệu cần ép sang
<exp>: là biểu thức cần ép kiểu cho giá trị trả vê của biểu thức Tác dụng:
Lúc thực hiện hệ thống sẽ chuyển kết quả tính toán của biểu thức <exp> sang kiểu được ép là <type>
Kiểu nguyên thủy:
Ví dụ:
float f = (float) 100.15D; // Chuyển số 100.15 dạng kiểu double sang float
Lưu ý:
Không cho phép chuyển đổi giữa các kiểu nguyên thủy với kiểu tham chiếu,
ví dụ kiểu double không thể ép sang các kiểu lớp như HocSinh được
Kiểu giá trị boolean (logic) không thể chuyển sang các kiểu dữ liệu số và ngược lại
Thu hẹp kiểu:
Đối với các kiểu dữ liệu nguyên thủy giá trị của kiểu hẹp hơn(chiếm số byte ít hơn) có thể được chuyển xang kiể rộng hơn(chiếm số byte nhiều hơn) mà tổn thất byte short int long float double
Char
Trang 24về thông tin Chuyển kiểu đó được gọi là mở rộng kiểu và không cần sử dụng quy tắc ép kiểu
VD: int i=6;
Float f=i; //ok
Nếu chuyển đổi theo chiều ngược lại từ kiểu rộng về kiểu hẹp được gọi là thu hẹp kiểu(có thể mất mát thông tin) trong trường hợp như thế ta phải sử dụng quy tắc
ép kiểu tường minh
VD: float f=6.6; int i=f; //Lỗi
Sử dụng quy tắc ép kiểu: int i=(int)f;// ok
*Các ngữ cảnh phải sử dụng quy tắc ép kiểu
Thực hiện các phép gán đối với kiểu nguyển thủy hoặc kiểu tham chiếu
Thực hiện các lời gọi hàm
Thực hiện các tính toán số học
Chuyển đổi các kiểu khác kết hợp với kiểu xâu
2.9 Biến và khai báo biến trong java
[<phạm vi truy nhập>] <kiểu biến> < tên biến>[<=giá trị khởi tạo>]
VD: int i; public int k=9;
-Phân loại biến trong java
Trong java có 4 loại biến
1.Các biến dữ liệu thành phần
Là các thành phần của lớp thông thường là các thuộc tính mô tả lớp các đối tượng
Và được khởi tạo giá trị mỗi khi một đối tượng của lớp được tạo ra
2.Các biến cục bộ
Là các biến được khai báo trong các phương thức và các khối
3.Các biến tĩnh(static)
Trang 25Cũng là các thành phần của lớp nhưng không phải đại diện cho từng đối tượng mà đại diện cho cả lớp
4 Các biến tham chiếu đối tượng
Gọi tắt là các biến tham chiếu và kiểu lớp được gọi là kiểu tham chiếu là các biến được sử dụng để xử lý các đối tượng Biến tham chiếu phải được khai báo và khởi tạo trước khi sử dụng
Chú ý: giá trị khởi tạo mặc định đối với kiểu Nguyên thủy và kiểu tham chiếu 0,0.0 false;null
VD:
public class SinhVien {
String maSV,hoTen,diaChi;//biến dữ liệu thành phần
int namSinh; ;//biến dữ liệu thành phần
static int siSo;//biến tĩnh
float d1,d2,d3; static int siSo;//
public static void main(String args[])
{SinhVien sv1//biến tham chiếu đối tượng
}
}
Trang 26CHƯƠNG 3: LỚP VÀ CÁC THÀNH PHẦN CỦA LỚP 3.1 Định nghĩa lớp
Định nghĩa lớp là đặc tả một kiểu dữ liệu mới và mô tả cách cài đặt kiểu dữ liệu đó
- Lớp là khuôn mẫu dùng để tạo ra đối tượng Lớp định nghĩa dữ liệu trong một đối tượng cùng những phương thức truy cập dữ liệu đó
- Lớp có tính chất kế thừa: Một lớp có thể kế thừa các thuộc tính dữ liệu và các phương thức của lớp khác
- Lớp có tính chất đa dạng: Cho phép cài đặt các lớp dẫn xuất (lớp con) rất khác nhau từ cùng một lớp nguồn (lớp cha)
Trang 27public void nhapTTDiem()
{ Scanner input=new Scanner(System.in);
System.out.print("Nhap vao toa X: ");
x=input.nextFloat();
System.out.print("Nhap vao toa Y: ");
Trang 28public class ThucHanhSo1 {
public static void main(String[] args) {
// TODO code application logic here
Diem d1=new Diem();
Diem d2=new Diem();
System.out.println("Nhap thong tin cho diem 1");
Trang 29System.out.println("Khoang cach d1 va d2 la: "+d1.tinhKhoangCach(d2)); System.out.println("Khoang cach d2 va d1 la: "+d2.tinhKhoangCach(d1)); }
public class ToanHoc {
public static int tinhTong(int a,int b)
Trang 30System.out.println("tong cua 6 va 3 la :"+ToanHoc.tinhTong(5,6));
System.out.println("tong cua 4 va 3 va 9 la :"+ToanHoc.tinhTong(4,3,9));
VD:
import java.util.Scanner;
public class Nguoi {
String hoTen,diaChi;
Trang 31int namSinh;
public void inTT()
{System.out.println("Ho ten: "+hoTen+"\nDia chi: "+diaChi+"\nnamSinh:
"+namSinh);
}
public void nhapTT()
{Scanner input=new Scanner(System.in);
Trang 32// hoac // System.out.println("Ho ten: "+hoTen+"\nDia chi:
"+diaChi+"\nnamSinh"+namSinh);
}
public void nhapTT()
{Scanner input=new Scanner(System.in);
Nguoi ng1=new Nguoi();
SinhVien sv1=new SinhVien();
System.out.println("Nhap thong tin cho ng1");
Trang 33+Định nghĩa của những hàm viết đè không được khai báo final ở lớp cha
3.5 Toán tử tạo lập đối tượng.(Constructor)
Mục đích của toán tử tạo lập là đặt các giá trị khởi tạo cho đối tượng khi một đối tượng được tạo ra bằng toán tử new
Ta có thể định nghĩa toán tử tạo lập mặc định tường minh theo cú pháp sau:
//Lơp chuong trinh
Diem d1=new Diem(3,6);//sử dụng toán tử tạo lập
Diem d2=new Diem();// sử dụng toán tử tạo lập mặc định
D2.nhapTTDiem();
D1.inTTDiem();
Trang 34VD: Diem d3=new Diem();
3.6 Truyền tham số trong lời gọi hàm
a) Truyền các giá trị kiểu nguyên thủy
Bởi vì các biến hình thức là cục bộ trong định nghĩa của một hàm nên mọi thay đổi của
biến hình thức không ảnh hưởng đến các tham biến hiện thời
Các tham biến có thể là các biểu thức và chúng phải được tính trước khi truyền vào lời gọi hàm
Với các tham bién hình thức có kiểu nguyên thủy, java truyền theo cơ chế tham trị (giá trị của các tham biến hiện thời truyền vào trong lời gọi hàm không đổi khi thoát khỏi hàm mặc dù trong thân hàm có các câu lệnh tác động là thay đổi giá trị của chúng )
Ví dụ 3.5 Truyền các giá trị nguyên thủy
class KhachHang1{ // Lớp khách hàng
public static void main(String[] arg){
HangSX banh = new HangSX(); // Tạo ra một đối tượng
Trang 35int giaBan = 20;
double tien = banh.tinh(10,giaBan);
System.out.println("Gia ban: " + giaBan);// giaBan không đổi
System.out.println("Tien ban duoc : " + tien);
} }
// Lớp Hãng sản xuất
class HangSX{
double tinh(int num, double gia){
gia = gia /2;
return num * gia;// Thay đổi gia nhưng không ảnh hưởng tới giaBan,
// nhưng số tiền vẫn bị thay đổi theo
}
}
b) Truyền các giá trị tham chiếu đối tượng
Khi biến hiện thời tham chiếu tới đối tượng, thì giá trị tham chiếu của đối tượng sẽ được truyền cho biến hình thức java truyền theo cơ chế tham trị đối với bản thân đối tượng, tham biến đối với các thành phần (thuộc tính, hàm ) của đối tượng (nghĩa là các thành phần của đối tượng lưu lại sự thay đổi được tác động trong thân hàm khi thoát khỏi hàm)
Ví dụ 3.6 Truyền theo giá trị tham chiếu
//KhachHang2.java
class KhachHang2{ // Lớp khách hàng
public static void main(String[] arg){
Banh banhMoi = new Banh(); // Tạo ra một đối tượng (1)
Trang 36System.out.println("Nhoi thit vao banh truoc khi nuong:" + banhMoi.thit);
System.out.println("Thit cua banh sau khi
nuong:"+banhMoi.thit);
} public static void nuong(Banh banhNuong){ // (3)
banhNuong.thit = “Thit vit”; // Người nướng bánh đổi nhân thành thịt vit
}
}
String thit = “Thit ga”; // Qui định của hãng làm nhân bánh bằng thịt gà
}
Kết quả:
- banhNuong sau khi gán giá trị = null trong than hàm, sau khi thoát khỏi hàm vẫn tồn tại – truyền theo cơ chế tham trị đối với cả bản thân đối tượng
- Thuộc tính thit của banhNuong sau khi thoát khỏi hàm được đổi thành
“thịt vịt” – truyền theo cơ chế tham biến đối với thuộc tính của đối tượng
c ) Truyền các tham chiếu theo mảng
Mảng (array) trong Java được xem như là đối tượng Các phần tử của mảng có thể có kiểu nguyên thủy hoặc kiểu tham chiếu (kiểu lớp)
java truyền theo cơ chế tham biến đối với các phần tử lưu trong mảng
Trang 37Ví dụ 3.7 Truyền các tham chiếu kiểu mảng
// Loc.java
class Loc{
public static void main(String[] args){
int[] day = {8, 1, 4, 3, 2, 5};// Khởi tạo mảng day và gán trị đầu // Hiển thị các phần tử của dãy trước khi lọc
for (int i = 0; i < day.length; i++) System.out.print(“ “ + day[i]);
int maxIndex = 0;
// Lọc ra phần tử cực đại và đưa về cuối for (int index = 1; index < day.length; index++) {
if (day[maxIndex] > day[index])
} // Hiển thị dãy sau khi lọc for (int i = 0; i < day.length; i++) System.out.print(“ “ + day[i]);
System.out.println();
}
public static void doiCho(int[] bang,int i, int k){ // (2)
int tg = bang[i]; bang[i] = bang[k]; bang[k] = tg;
Trang 38} }
3.7 Quan hệ kế thừa giữa các lớp
Một trong những cơ chế để sử dụng lại được các đoạn chương trình trong lập trình hướng đối tượng là cơ chế kế thừa Từ một lớp được xây dựng tốt, ta có thể dẫn xuất ra nhiều lớp mới nhiều kiểu mới( được gọi là lớp con, lớp dẫn xuất, hay lớp kế thừa) Lớp
cơ sở được gọi là lớp cha Lớp con có thể được bổ xung thêm một số tính chất, hành vi của những đối tượng cụ thể hoặc thay đổi các hàm được kế thừa từ lớp cha
Java chỉ hỗ trợ kế thừa đơn hay một lớp chỉ được kế thừa từ một lớp cha
VD:
Cú pháp kế thừa
<Tên lớp con> extends <Tên lớp cha>
{ // các thuộc tính dữ liệu bổ xung
//Các hàm thành phần bổ xung hay viết đè
Trang 39Hình H4-6 Quan hệ kế thừa giữa các lớp
Chú ý:
Mọi đối tượng của lớp con cũng sẽ là đối tượng thuộc lớp cha Do vậy việc gán một đối tượng của lớp con sang cho biến tham chiếu đối tượng của lớp cha là sự
mở rộng kiểu và do đó không cần ép kiểu
Ngược lại gán một đối tượng của lớp cha cho biến tham chiếu đối tượng thuộc lớp con sẽ phải thực hiện ép kiểu Lưu ý khi đó sẽ có thể bị tổn thất thông tin Ví
public static main(String args[]){
SuperClass super1 = new SuperClass();// Tạo ra đối tượng lớp cha
SubClass sub1 = super1; // Mở rộng kiểu
SuperClass super2 = (SubClass) sub1; // Thu hẹp kiểu nên phải ép kiểu
}
3.8 Toán tử móc xích giữa các lớp kế thừa this() và super()
Các toán tử tạo lập không thể viết đè ở các lớp dẫn xuất (lớp con) Chúng có thể được nạp chồng nhưng phải trong cùng lớp
Trong Java có 2 toán tử tạo lập đặc biệt có tên là this() và super() được sử dụng để móc xích giữa các lớp có quan hệ kế thừa với nhau
a) Toán tử tạo lập this(), biến this
Trang 40- Mỗi lớp của java luôn tồn tại một biến ần đặc biệt this, thường được sử dụng trong các toán tử tạo lập để chỉ chính bản thân lớp đó Toán tử tạo lập this()này được sử dụng để tạo ra đối tượng của lớp hiện thời
b) Toán tử tạo lập super(), biến super
Biến super dùng để chỉ bản thân lớp cha (thường dùng trong lớp con để gọi đến các hàm của lớp cha đã bị nạp chồng trong lớp con, các biến trong lớp cho đã bị che bóng ở lớp con ), toán tử super() được sử dụng trong các toán tử tạo lập của lớp con (subclass)
để gọi tới các toán tử tạo lập của lớp cha (superclass) trực tiếp
1.9.Lớp trừu tượng và giao diện
a>Lớp trừu tượng (abstract)
Lớp trừu tượng là 1 lớp đặc biệt trong đó các phương thức chỉ được khai bảo ở dạng khuôn mẫu(template) mà không được cài đặt chi tiết các phương thức chỉ được thực hiện ở các lớp con kế thừa từ lớp trừu tượng đó
Lớp trừu tượng được sử dụng khi muốn định nghĩa một lớp không thể biết và định nghĩa ngay được các thuộc tính và phương thức của nó
Abstract class Animal
{ abstract String getNam();
Abstract int get feet();}
Public class Bird extends Animal
{public String getName()
{return “Bird”;}
}