thao tác giải phóng, dọn dẹp vùng nhớ đã cấp phát cho các đối tượng dữ liệu trong phương thức finalize() sẽ giúp cho người lập trình chủ động kiểm soát tốt quá trình hủy [r]
(1)System.out.print("\n"); }
}
C
Chhưươơnngg 33: : HHƯƯỚỚNNGG ĐĐỐỐII TTƯƯỢỢNNGG TTRROONNGG JJAAVVAA 3
3 11 MMở ởđầđầuu
(2)rất hiệu để xây dựng nên chương trình ứng dụng máy tính Từ đời lập trình OOP chứng tỏ sức mạnh, vai trò đề án tin học Chhưươơnngg n
nààyyssẽẽggiiúúppbbạạnnđđọọccttììmmhhiiểểuuvvềềccáácckkiiểểuuddữữlliiệệuuddẫẫnnxxuuấấttđđóóllàà l
lớớpp((ccllaassss))vvààggiiaaoo ttiiếếpp((iinntteerrffaaccee)),,ccũũnngg nnhhưưccáácc vvấấnnđđềềccơơbbảảnn v
vềềllậậpp ttrrììnnhh hhưướớnnggđđốốii ttưượợnngg ttrroonnggjjaavvaatthhơơnnggqquuaa vviiệệccttạạoo llậậpp c
cááccllớớpp,,ccááccđđốốiittưượợnnggvvààccááccttíínnhhcchhấấttccủủaacchhúúnngg 3
3 22 LLớpớp((CCllaassss)) 3
3 22 11 KKhhááiinniiệmệm
Chúng ta xem lớp khn mẫu (template) đối tượng (Object) Trong bao gồm liệu đối tượng (fields hay properties) phương thức(methods) tác động lên thành phần liệu gọi phương thức lớp
Các đối tượng xây dựng lớp nên gọi thể lớp (class instance)
3
3 22 22 KKhhaaiibbááoo//địđịnnhhnngghhĩaĩallớớpp
class <ClassName> {
<kiểu liệu> <field_1>; <kiểu liệu> <field_2>; constructor
method_1 method_2 }
class: từ khóa java
ClassName: tên đặt cho lớp
field_1, field_2: thuộc tính, biến, hay thành phần liệu lớp
constructor: xây dựng, khởi tạo đối tượng lớp
(3)3
3 22 33 TTạạoođốđốiittượượnnggccủaủallớpớp
ClassName objectName = new ClassName(); 3
3 22 44 TThhuuộcộcttíínnhhccủaủallớpớp
Vùng liệu (fields) hay thuộc tính (properties) lớp khai báo bên lớp sau:
class <ClassName> {
// khai báo thuộc tính lớp <tiền tố> <kiểu liệu> field1; // …
}
Để xác định quyền truy xuất đối tượng khác vùng liệu lớp người ta thường dùng tiền tố sau:
• public: truy xuất từ tất đối tượng khác
• private: lớp khơng thể truy xuất vùng private
lớp khác
• protected: vùng protected lớp cho phép
thân lớp lớp dẫn xuất từ lớp truy cập đến
Ví dụ:
public class xemay
{ public String nhasx; public String model; private float chiphisx; protected int thoigiansx; // so luong so cua xe may: 3, so protected int so;
(4)public static int sobanhxe = 2; }
Thuộc tính “nhasx”, “model”có thể truy cập đến từ tất đối tượng khác
Thuộc tính “chiphisx” truy cập từ đối tượng có kiểu “xemay”
Thuộc tính “thoigiansx”, so truy cập từ đối tượng có kiểu “xemay” đối tượng lớp dẫn xuất từ lớp “xemay”
Lưu ý: Thơng thường để an tồn cho vùng liệu đối
tượng người ta tránh dùng tiền tố public, mà thường chọn tiền tố private để ngăn cản quyền truy cập đến vùng liệu lớp từ phương thức bên lớp
3
3 22 55 HHààmm PPhhươươnnggtthhứcứcllớpớp((MMeetthhoodd))
Hàm hay phương thức (method) Java khối lệnh thực chức năng, hành vi xử lý lớp lên vùng liệu
Khai báo phương thức:
<Tiền tố> <kiểu trả về> <Tên phương thức> (<danh sách đối số>)
{
<khối lệnh>; }
Để xác định quyền truy xuất đối tượng khác phương thức lớp người ta thường dùng tiền tố sau:
• public: phương thức truy cập từ bên
lớp khai báo
• protected: truy cập từ lớp khai báo
những lớp dẫn xuất từ
• private: truy cập bên thân lớp khai
(5)• static: phương thức lớp dùng chung cho tất thể
hiện lớp, có nghĩa phương thức thực kể khơng có đối tượng lớp chứa phương thức
• final: phương thức có tiền tố khơng khai báo
chồng lớp dẫn xuất
• abstract: phương thức khơng cần cài đặt (khơng có
phần source code), thực lớp dẫn xuất từ lớp
• synchoronized: dùng để ngăn tác động đối
tượng khác lên đối tượng xét đồng hóa Dùng lập trình miltithreads
<kiểu trả về>: kiểu void, kiểu sở hay lớp <Tên phương thức>: đặt theo qui ước giống tên biến <danh sách thơng số>: rỗng
Lưu ý:
Thông thường lớp phương thức nên khai báo dùng từ khóa public, khác với vùng liệu thường dùng tiền tố private mục đích an tồn
Những biến nằm phương thức lớp biến cục (local) nên khởia tạo sau khai báo
Ví dụ:
public class xemay {
(6)// biến tĩnh có giá trị tất // thể tạo từ lớp xemay public static int sobanhxe = 2; public float tinhgiaban()
{
return 1.5 * chiphisx; }
} 3
3 22 66 KKhhởiởittạoạommộộttđốđốiittượượnngg((CCoonnssttrruuccttoorr))
Contructor thật loại phương thức đặc biệt lớp Constructor dùng gọi tự động khởi tạo thể lớp, dùng để khởi gán giá trị măc định Các constructor khơng có giá trị trả về, có tham số khơng có tham số
Constructor phải có cùng tên với lớp gọi đến dùng
từ khóa new
Nếu lớp khơng có constructor java cung cấp cho lớp constructor mặc định (default constructor) Những thuộc tính, biến lớp khởi tạo giá trị mặc định (số: thường giá trị 0, kiểu luận lý giá trị false, kiểu đối tượng giá trị null, …)
Lưu ý: thơng thường để an tồn, dễ kiểm sốt làm chủ mã
nguồn chương trình nên khai báo constructor cho lớp
Ví dụ:
public class xemay {
// …
(7){}
public xemay(String s_nhasx, String s_model, f_chiphisx, int i_thoigiansx, int i_so);
{
nhasx = s_nhasx; model = s_model; chiphisx = f_chiphisx; thoigiansx = i_thoigiansx; so = i_so;
//
// this.nhasx = s_nhasx; // this.model = s_model; // this.chiphisx = f_chiphisx; // this.thoigiansx = i_thoigiansx; // this.so = i_so;
} }
3
3 22 77 BBiiếnếntthhiiss
Biến this biến ẩn tồn tất lớp
ngông ngữ java Một class Java tồn mmộộtt biến this, biến this sử dụng chạy tham khảo đến thân lớp chứa
Ví dụ:
<tiền tố> class A {
<tiền tố> int <field_1>; <tiền tố> String <field_2>; // Contructor lớp A
(8)this.field_1 = par_1; this.field_2 = par_2; }
<tiền tố> <kiểu trả về> <method_1>() {
// … }
<tiền tố> <kiểu trả về> <method_2>() {
this.method_1() // …
} } 3
3 22 88 KKhhaaiibbááoocchhồnồnggpphhưươơnnggtthhứứcc((oovveerrllooaaddiinnggmmeetthhoodd)) Việc khai báo lớp nhiều phương thức có tên khác tham số (khác kiểu liệu, khác số lượng tham số) gọi khai báo chồng phương thức (overloading method)
Ví dụ:
public class xemay
{ // khai báo fields … public float tinhgiaban() { return * chiphisx; }
public float tinhgiaban(float huehong) { return (2 * chiphisx + huehong); }
} 3
3 33 ĐặĐặccđđiiểmểmhhướướnnggđốđốiittượượnnggttrroonnggjjaavvaa
(9)điểm chung: tính đóng gói (encapsulation), tính đa hình (polymorphism), tính kế thừa (inheritance)
3
3 33 11 ĐóĐónnggggóóii((eennccaappssuullaattiioonn))
Cơ chế đóng gói lập trình hướng đối tượng giúp cho đối tượng dấu phần chi tiết cài đặt, phần liệu cục nó, cơng bố ngồi cần cơng bố để trao đổi với đối tượng khác Hay nói đối tượng thành tố hỗ trợ tính đóng gói
Đơn vị đóng gói ngôn ngữ java class Một class định nghĩa hình thức đối tượng Một class định rõ thành phần liệu đoạn mã cài đặt thao tác xử lý đối tượng liệu Java dùng class để xây dựng đối tượng Những đối tượng thể (instances) class
Một lớp bao gồm thành phần liệu thành phần xử lý Thành phần liệu lớp thường bao gồm biến thành viên biến thể lớp Thành phần xử lý thao tác thành phần liệu, thường java người gọi phương thức Phương thức thuật ngữ hướng đối tượng java, C/C++ người ta thường dùng thuật ngữ hàm
3
3 33 22 TTíínnhhđđaahhììnnhh((ppoollyymmoorrpphhiissmm))::
Tính đa hình cho phép cài đặt lớp dẫn xuất khác từ lớp nguồn Một đối tượng có nhiều kiểu khác gọi tính đa hình
Ví dụ:
class A_Object {
// …
void method_1() {
(10)} }
class B_Object extends A_Object {
// …
void method_1() {
// … }
} class C
{ public static void main(String[] args) {
// Tạo mảng phần tử kiểu A
A_Object arr_Object = new A_Object[2]; B_Object var_1 = new B_Object();
// Phần tử đầu tiên mảng arr_Object[0] tham // chiếu đến đối tượng kiểu B_Object dẫn xuất // từ A_Object
arr_Object[0] = var_1; A_Object var_2;
for (int i=0; i<2; i++) {
var_2 = arr_Object[i]; var_2.method_1(); }
} }
(11)- Với i = biến var_2 có kiểu B_Object, lệnh var_2.method_1() gọi thực phương thức method_1 lớp B_Object
- Với i = biến var_2 có kiểu A_Object, lệnh var_2.method_1() gọi thực phương thức method_1 lớp A_Object
Trong ví dụ đối tượng var_2 nhận kiểu A_Object hay B_Object Hay nói khác, biến đối tượng kiểu A_Object var_2 ví dụ tham chiếu đến đối tượng lớp lớp A_Object (ví dụ var_2 tham chiếu đến đối tượng var_1, var_1 đối tượng lớp B_Object dẫn xuất từ lớp A_Object) Ngược lại biến lớp tham chiếu đến đối tượng lớp cha
3
3 33 33 TTíínnhhkkế ếtthhừaừa((iinnhheerriittaannccee))
Một lớp (subclass) kế thừa tất vùng liệu phương thức lớp khác (siêu lớp - superclass) Như việc tạo lớp từ lớp biết cho thành phần (fields methods) lớp cũ thành thành phần (fields methods) lớp Khi ta gọi lớp lớp dẫn xuất (derived class) từ lớp cũ (superclass) Có thể lớp cũ lớp dẫn xuất từ lớp đấy, lớp vừa tạo lớp cũ lớp siêu lớp trực tiếp (immediate supperclass)
Dùng từ khóa extends để lớp dẫn xuất
class A extends B {
// … }
(12)Tính kế thừa giúp cho lớp nhận thuộc tính/phương thức public protected lớp cha Đồng thời thay phương thức lớp cha cách khai báo chồng Chẳng hạn phương thức tinhgiaban() áp dụng lớp xega sẽ cho kết gấp 2.5 lần chi phí sản xuất thay gấp chi phí sản xuất giống lớp xemay
Ví dụ:
public class xega extends xemay {
public xega() {
}
public xega(String s_nhasx, String s_model, f_chiphisx, int i_thoigiansx);
{
this.nhasx = s_nhasx; this.model = s_model; this.chiphisx = f_chiphisx; this.thoigiansx = i_thoigiansx; this.so = 0;
}
public float tinhgiaban() {
return 2.5 * chiphisx; }
}
Java cung cấp tiền tố/từ khóa để hỗ trợ tính kế thừa lớp:
• public: lớp truy cập từ gói, chương trình
khác
• final: Lớp hằng, lớp khơng thể tạo dẫn xuất (khơng thể
(13)•
• aabbssttrraacctt:: Lớp trừu tượng (khơng có khai báo thành phần phương thức lớp trừu tượng) Lớp dẫn xuất khai báo, cài đặt cụ thể thuộc tính, phương thức lớp trừu tượng
3.3.3.2 Lớp nội
Lớp nội lớp khai báo bên lớp khác Lớp nội thể tính đóng gói cao truy xuất trực tiếp biến lớp cha
Ví dụ:
public class A {
// …
int <field_1> static class B {
// …
int <field_2> public B(int par_1) {
field_2 = par_1 + field_1; }
} }
Trong ví dụ chương trình dịch tạo hai lớp với hai files khác nhau: A.class B.class
3.3.3.3 Lớp vô sinh
(14)Để khai báo lớp lớp “vô sinh”, dùng từ khóa final class
Tất phương thức lớp vô sinh vô sinh, thuộc tính lớp vơ sinh khơng vơ sinh
Ví dụ:
public final class A {
public final int x; private int y;
public final void method_1() {
// … }
public final void method_2() {
// … }
}
3.3.3.4 Lớp trừu tượng
Lớp trừu tượng lớp khơng có khai báo thuộc tính thành phần phương thức Các lớp dẫn xuất khai báo thuộc tính, cài đặt cụ thể phương thức lớp trừu tượng
Ví dụ:
abstract class A {
(15)}
public class B extends A {
public void method_1() {
// cài đặt chi tiết cho phương thức method_1 // lớp B
// … } }
public class C extends A {
public void method_1() {
// cài đặt chi tiết cho phương thức method_1 // lớp C
// … } }
Lưu ý: Các phương thức khai báo dùng tiền tố
private static khơng khai báo trừu tượng
abstract Tiền tố private khơng thể truy xuất từ lớp dẫn
xuất, cịn tiền tố static dùng riêng cho lớp khai báo mà
thôi
3.3.3.5 Phương thức finalize()
Trong java kiểu liệu trỏ C, người lập trình khơng cần phải q bận tâm việc cấp phát giải phóng vùng nhớ, có trình dọn dẹp hệ thống đảm trách việc Trình dọn dẹp hệ thống dọn dẹp vùng nhớ cấp phát cho đối tượng trước hủy đối tượng
(16)thao tác giải phóng, dọn dẹp vùng nhớ cấp phát cho đối tượng liệu phương thức finalize() sẽ giúp cho người lập trình chủ động kiểm sốt tốt q trình hủy đối tượng thay vị giao cho trình dọn dẹp hệ thống tự động Đồng thời việc cài đặt phương thức finalize() giúp cho nhớ được giải phóng tốt hơn, góp phần cải tiến tốc độ chương trình
Ví dụ:
class A {
// Khai báo thuộc tính public void method_1() {
// … }
protected void finalize() {
// Có thể dùng đểđóng tất kết nối // vào sở liệu trước hủy đối tượng // …
} } 3
3 44 GGóóii((ppaacckkaaggeess))
Việc đóng gói lớp lại tạo thành thư viện dùng chung gọi package
(17)Để khai báo lớp thuộc gói ta phải dùng từ khóa package
Dịng khai báo gói phải dòng tập tin khai báo lớp
Các tập tin khai báo lớp gói phải lưu thư mục
Lưu ý: Việc khai báo import tất lớp gói làm tốn
bộ nhớ Thơng thường nên import lớp cần dùng chương trình
Ví dụ:
package phuongtiengiaothong; class xemay
{
// … }
class xega extends xemay {
// … }
Khi muốn sử dụng lớp xemay vào chương trình ta khai báo sau:
import phuongtiengiaothong.xemay; 3
3 55 GGiiaaooddiiệnện((iinntteerrffaaccee)) 3
3 55 11 KKhhááiinniiệmệmiinntteerrffaaccee::
(18)thừa hưởng thêm vùng liệu phương thức giao tiếp
3
3 55 22 KKhhaaiibbááooiinntteerrffaaccee::
Interface khai báo lớp Nhưng thuộc tính interface (khai báo dùng từ khóa final) phương thức giao tiếp trừu tượng (mặc dù từ khóa abstract)
Trong lớp có cài đặt interface ta phải tiến hành cài đặt cụ thể phương thức
Ví dụ:
public interface sanpham
{ static final String nhasx = “Honda VN”; static final String dienthoai = “08-8123456”; public int gia(String s_model);
}
// khai báo lớp có cài đặt interface public class xemay implements sanpham
{ // cài đặt lại phương thức giao diện lớp public int gia(String s_model)
{
if (s_model.equals(“2005”)) return (2000);
else
return (1500); }
public String chobietnhasx() {
return (nhasx); }
(19)Có vấn đề khác với lớp giao diện (interface) giao diện cha trực tiếp mà dẫn xuất lúc nhiều giao diện khác (hay có nhiều giao diện cha) Khi kế thừa tất giá trị phương thức giao diện cha Các giao diện cha liệt kê thành chuỗi cách dấu phẩy “,” Khai báo sau:
public interface InterfaceName extends interface1, interface2, interface3
{
// … }
3
3 55 33 VVííddụụ mmiinnhhhhọaọa
Ví dụ 1: Minh họa tính đa hình (polymorphism) phân cấp
kế thừa thơng qua việc mô tả xử lý số thao tác đối tượng hình học
// Định nghĩa lớp trừu tượng sở tên Shapetrong // tập tin Shape.java
public abstract class Shape extends Object {
// trả diện tích đối tượng hình học shape public double area()
{
return 0.0; }
// trả thể tích đối tượng hình học shape public double volume()
{
(20)// Phương thức trừu tượng cần phải thực // lớp để trả tên đối tượng // hình học shape thích hợp
public abstract String getName(); } // end class Shape
// Định nghĩa lớp Point tập tin Point.java public class Point extends Shape
{
protected int x, y; // Tọa độ x, y điểm // constructor không tham số
public Point() {
setPoint( 0, ); }
// constructor có tham số
public Point(int xCoordinate, int yCoordinate) {
setPoint( xCoordinate, yCoordinate ); }
// gán tọa độ x, y cho điểm
public void setPoint( int xCoordinate, int yCoordinate ) {
x = xCoordinate; y = yCoordinate; }
// lấy tọa độ x điểm public int getX()
{