Lớp, đối tượng và gói Class, Object, Package

Một phần của tài liệu Tài liệu lập trình hướng đối tượng Java căn bảnOOP (Trang 69 - 103)

Giảng viên: Vũ Duy Linh Email: vdlinh@ctu.edu.vn

70

© Vũ Duy Linh Khái niệm

Lớp (Class): đại diện cho một mẫu các đối tượng có chung những đặc điểm giống nhau, bao gồm các thuộc tính (attributes) và các hành vi (operations) của nó.

 Trên sơ đồ, lớp có 03 phần: ClassName, Field(s), Method(s) như sau:

Ví dụ: Lớp Sinh viên, lớp Giảng viên, lớp Động vật có vú,…

Lớp Giảng viên, ta quan tâm đến 03 đặc điểm là: Mã số, họ tên, chuyên ngành, và 02 hoạt động là: dạy học và nghiên cứu khoa học.

 Dữ liệu thành viên (trường và phương thức) được phân ra 2 nhóm:

Thành viên thể hiện (Instance members): Là các biến thể hiện và các phương thức thể hiện. Đây là phần dữ liệu dành riêng cho mỗi đối tượng được tạo ra  Với cách này, địa chỉ của mỗi đối tượng được lưu trong vùng nhớ là khác nhau.

Thành viên lớp (Class/static members): Là các biến lớp (static variables) và phương thức lớp (static methods). Đây là phần dữ liệu dành riêng cho lớp và được truy xuất trực tiếp bởi tên lớp  Với cách này, các đối tượng được tạo ra từ lớp này sẽ có chung địa chỉ của biến lớp  biến chung cho các đối tượng.

Tên lớp Các trường Các phương thức

4 biến thể hiện (instance variables)

1 biến lớp (static variable)

2 phương thức thể hiện (instance methods)

71

© Vũ Duy Linh Khái niệm (2)

Đối tượng (Object): Là một thể hiện, instance, của một lớp  là một biến thuộc kiểu dữ liệu lớp.

 Đối tượng thì có trạng thái (states), còn lớp thì không. Trạng thái chính là giá trị riêng của mỗi đối tượng và được lưu vào trong các biến thể hiện.

 Hệ thống hướng đối tượng là một tập các đối tượng tương tác với nhau.

 Các phương thức là tập các lệnh tuần tự dùng để thao tác trên các trường.

Lớp GiangVien Hai đối tượng: gv1, gv2 thuộc lớp GiangVien

72

© Vũ Duy Linh Các loại lớp

Lớp chuẩn Java (Standard class): Là các lớp đã được xây dựng sẵn (thư viện Java - Java API). Lớp tổ tiên trong Java là:

java.lang.Object;

Lớp tự định nghĩa (Programmer-define class): Là các lớp được lập trình viên tự định nghĩa ra thông qua việc trừu hóa các lớp đối tượng trong môi trường bài toán.

 Các lớp này được gọi chung là kiểu dữ liệu tham chiếu/ đối

tượng (Reference/

Object data types)

73

© Vũ Duy Linh Lớp chuẩn

 Các thư viện chuẩn: java.lang.*, java.awt.*, java.util.*

 Ví dụ: Lấy căn hai của 25 ta sử dụng lệnh

 Nạp thư viện vào: import java.lang.*

 Gọi phương thức: double ketQua = Math.sqrt(25);

74

© Vũ Duy Linh Lớp tự định nghĩa

Cú pháp tổng quát:

Khai báo biến trường trong lớp (member variables):

[Modifier] data-type fieldName;

Khai báo phương thức trong lớp (member methods):

// hoặc Members

75

© Vũ Duy Linh Lớp tự định nghĩa (2)

[Modifier] class TênLớp { //Modifier ở mức lớp [Modifier] data_type tênTrường_1; //Modifier ở thành viên ...

[Modifier] data_type tênTrường_n;

[Modifier] return_type tênPhươngThức_1([Các_Tham_số]) { //…

return (giá trị trả về);

} ...

[Modifier] return_type tênPhươngThức_m([Các_Tham_số]) { //…

return (giá trị trả về);

} }

* Chú ý: Các thành phần tùy chọn (trong cặp [ ]) sẽ được đề cập sau.

Cú pháp chi tiết:

76

© Vũ Duy Linh Lớp tự định nghĩa (3)

 Có 02 mức khác nhau của bổ từ truy cập (modifier):

 Mức lớp (Class level):

 public: Lớp sẽ được truy cập ở mọi nơi trong dự án – anywhere.

 Không có modifier: Lớp chỉ được truy cập trong phạm vi cùng gói (package).

Các bổ từ astract, final sẽ được học ở các chương sau.

 Mức các thành viên của lớp (Member level: fields và Methods):

 private: Các thành viên chỉ có thể được truy xuất trong phạm vi bên trong lớp chứa nó, ngay cả các thành viên ở lớp con cũng không thể truy xuất tới (không được thừa kế).

 public: Các thành viên của lớp sẽ được truy cập ở mọi nơi

 Không có modifier (friendly/ package access): Trong cùng gói là public còn khác gói là private.

 protected: Các thành viên được truy xuất bởi các phương thức ở cùng lớp, các phương thức ở trong các lớp con (được thừa kế) và các

phương thức ở khác lớp nhưng phải cùng gói

Các bổ từ final, synchronized, transient, native,… sẽ được học sau.

77

© Vũ Duy Linh Lớp tự định nghĩa (4)

Ví dụ 1: Định nghĩa kiểu dữ liệu lớp HinhTron mà các thành viên chỉ gồm các biến và các phương thức thể hiện:

public class HinhTron { //Mức lớp: truy cập được mọi nơi private int x, y; // Mức thành viên: riêng của lớp private double banKinh; // 3 biến thể hiện

public double tinhChuVi() { // Mức thành viên: truy cập được mọi nơi return 2 * Math.PI * banKinh; // 2 phương thức thể hiện

}

public double tinhDienTich() {

return Math.PI * banKinh * banKinh;

} }

 Phạm vi truy nhập ở mức lớp HinhTron là public, mức của 3 biến thể hiện là private, và mức 2 phương thức thể hiện là public.

78

© Vũ Duy Linh Lớp tự định nghĩa (5)

Bảng phạm vi truy cập ở mức thành viên

Quyền truy xuất Phạm vi

public protected default private

Ở cùng lớp Yes Yes Yes Yes

Ở khác lớp và cùng gói Yes Yes Yes No

Ở lớp con và cùng gói Yes Yes Yes No

Ở lớp con và khác gói Yes Yes No No

Ở khác lớp vàkhác gói Yes No No No

79

© Vũ Duy Linh Lớp tự định nghĩa (6)

Lớp hằng/tận cùng (Final class): được khai báo với bổ từ modifier là final, nghĩa là không cho phép mở rộng hoặc thừa kế cho lớp con nữa.

Phương thức hằng (Final method): có modifier là final và không cho phép ghi chồng lên nó.

Biến hằng (Final variable): sử dụng từ khóa final.

80

© Vũ Duy Linh Đối tượng

 Đối tượng (Object): Là một thể hiện của lớp, do vậy nó được khai báo, khởi tạo thông qua một lớp đã được định nghĩa.

Cách 1: Khai báo và khởi tạo riêng biệt

Khai báo: TênLớp tênBiếnĐốiTượng;

Ví dụ: HinhTron ht1;

(Đọc là: biến ht1 (có kiểu HinhTron và được) tham chiếu tới null)

Khởi tạo: tênBiếnĐốiTượng = new TênLớp([Các_đối_số]);

Ví dụ: ht1 = new HinhTron();

(Đọc là: biến tham chiếu đối tượng hình tròn ht1 biến ht1 tham chiếu tới đối tượng hình tròn

giá trị của ht1 là một tham chiếu tới đối tượng hình tròn địa chỉ của đối tượng hình tròn được trỏ bởi biến ht1)

Cách 2: Khai báo và khởi tạo một lần

Cú pháp: Tên_Lớp tênBiếnĐốiTượng = new TênLớp([Các_đối_số]);

Ví dụ: HinhTron ht2 = new HinhTron();

ht1

null

HinhTron

ht1

ht2

HinhTron

81

© Vũ Duy Linh Đối tượng (2)

Sự cấp và quản lý biến trong Java: Java có kiểu nguyên thủy và kiểu đối tượng, chúng được cấp phát và tham chiếu như hình sau.

82

© Vũ Duy Linh Đối tượng (3)

Ví dụ 2: Viết chương trình (theo OBP) để tạo một hình tròn có toạ độ tâm O(50,100), bán kính bằng 30 và hiển thị thông tin và diện tích của nó.

Source code: OBP_HinhTron.java class HinhTron{

int x=50; int y=100; double banKinh=30;

double tinhDienTich(){

return Math.PI*Math.pow(banKinh, 2);

} }

public class OBP_HinhTron {

public static void main(String[] args) { HinhTron ht= new HinhTron();

System.out.printf("Hinh tron vua tao co tam O(%d,%d)"

+ " va dien tich= %.4f\n",ht.x,ht.y,ht.tinhDienTich());

} }

83

© Vũ Duy Linh Đối tượng (4)

Phương thức dựng (Constructors) :

 Dùng để tạo một đối tượng, khởi tạo giá trị ban đầu cho thuộc tính của đối tượng được tạo ra (nếu có).

 Tên phương thức cùng tên với tên lớp

 Không có kiểu trả về (kiểu void: không có giá trị trả về)

 Có thể có nhiều phương thức dựng: Sử dụng phương thức nạp chồng (Overloading) của tính đa hình để viết

 Sử dụng từ khóa this để tham chiếu đến chính đối tượng được tạo. Nó được dùng để phân biệt giữa biến thể hiện (instance variables) và các tham số hình thức khi chúng giống tên nhau

 Sử dụng từ khóa supper để tham chiếu tới đối tượng thuộc lớp cha. Nó được dùng để gọi các phương thức, các biến thể hiện từ lớp cha

 Java có sẵn một phương thức dựng mặc định (không có tham số) để gán tất cả các biến thể hiện bằng zero. Chúng ta có thể ghi chồng (Overriding ) phương thức mặc định này.

Phương thức hủy (Destructors ):

 Khác với C and C++, sự thu hồi bộ nhớ được Java tự động thực hiện

 Java cung cấp một phương thức được gọi bởi Garbage collector, giúp cho ta thực hiện các yêu cầu trước khi đối tượng bị hủy, đó phương thức finalize()

 Ta có thể ghi chồng lại phương thức finalize() này để quản lý các đối tượng trong chương trình.

84

© Vũ Duy Linh Đối tượng (5)

Phương thức thiết lập (Setters):

 Dùng để gán giá trị (set) các biến thể hiện (private) của mỗi lớp.

 Được gọi là phương thức thay đổi (mutator methods)

 Có sự kiểm tra sự hợp lệ dữ liệu trước khi thiết lập giá trị trong setters để trở nên an toàn hơn.

Phương thức đọc (Getters):

 Dùng để lấy (get) giá trị các biến thành viên của mỗi lớp.

 Được gọi là phương thức truy xuất (accessor methods)

 Các phương thức setters/getters là một cách bao đóng dữ liệu – chúng thường là các phương thức public để tạo ra một “kênh” giao tiếp với người dùng bên ngoài, nhằm truy xuất các dữ liệu riêng

(private) của đối tượng thuộc lớp vừa định nghĩa được an toàn, bảo mật.

 Thông thường, mỗi một biến thành viên sẽ có một cặp phương thức getter, setter.

85

© Vũ Duy Linh Đối tượng (6)

Lớp Circle Circle

get x, y, radius

set

Ví dụ 3: Viết chương trình định nghĩa một lớp có tên Circle có chứa các phương thức: dựng, set, get và tính diện tích của nó.

class Circle{

private int x, y, radius; // 3 biến thể hiện //Các phương thức dựng

public Circle() { // ghi chồng pthức dựng mặc định x = y = 10;

radius = 1;

}

public Circle(int radius) { // có 1 tham số hình thức this.radius = radius;

}

public Circle(int x, int y, int radius) { // các tham số cùng tên this.x = x; // với biến thể hiện

this.y = y;

this.radius = radius;

}

//Các phương thức setters/getters public int getRadius() { return radius;

}

86

© Vũ Duy Linh Đối tượng (7)

public void setRadius(int radius) {

if (radius > 0){ // kiểm tra tính hợp lệ dữ liệu this.radius = radius;

} else{

System.err.println(“Ban kinh hinh tron phai lon hon khong. ");

} }

public int getX() { return x;

}

public void setX(int x) { this.x = x;

}

//Phương thức thể hiện

public double computeArea(){

return Math.PI*Math.pow(radius, 2);

}

} // Kết thúc định nghĩa lớp Circle

87

© Vũ Duy Linh Đối tượng (8)

public class Main { // lớp chính public static void main(String[] args) {

Circle c1 = new Circle(20,20,10); // ban đầu bán kính là 10

System.out.printf("Dien tich voi ban kinh= %d la: .2f\n",c1.getRadius(), c1. computeArea ());

c1.setX(40); // dời toạ độ x = 40, c1.setRadius(5); // đổi bán kính = 5

System.out.printf("Dien tich voi ban kinh= %d la: %.2f\n",c1.getRadius(), c1. computeArea ());

}

} (0,0) x

y

88

© Vũ Duy Linh Đối tượng (9)

Ví dụ 4: Tính n giai thừa theo OBP:

import java.util.Scanner;

public class GiaiThua { int n;

public GiaiThua() { //Nhập n thông qua phương thức dựng /*super(); */ Scanner in = new Scanner(System.in);

System.out.print("Nhap so nguyen n="); n= in.nextInt(); in.close();

}

public void tinhGiaiThua(){

long gt=1;

if(n<0) System.out.println("n= "+n+": Khong tinh giai thua.");

else{ for(int i=1; i<=n; i++) gt = gt*i;

System.out.println(n+"!= " + gt); } }

public static void main(String[] args) {

GiaiThua gt = new GiaiThua(); gt.tinhGiaiThua(); } }

89

© Vũ Duy Linh Đối tượng (10)

 Biến và phương thức lớp - Static members:

 Java cung cấp cách định nghĩa phương thức và biến “toàn cục” của lớp để mà các đối tượng thuộc lớp này sẽ có “điểm chung” kết dính cho nhau. Các phương thức và biến đảm nhận được nhiệm vụ như thế được gọi là biến và phương thức lớp.

 Biến lớp (Class variables)và Phương thức lớp (Static methods):

 Được khai báo với từ khóa static

 Được tham chiếu thông qua tên lớp (không cần tạo đối tượng của lớp)

 Biến lớp là phần dữ liệu dành riêng cho lớp và là biến chung cho tất cả các đối tượng được tạo ra từ lớp.

 Phương thức lớp chỉ tham chiếu đến các biến lớp và các phương thức lớp (khác) và không sử dụng từ khóa thissufer

 Là phương thức được sử dụng để thiết kế các lớp mà các phương thức trong lớp không phụ thuộc vào các biến thể hiện của chúng.

Chẳng hạn như thư viện chuẩn java.lang.Math

90

© Vũ Duy Linh Đối tượng (11)

Ví dụ 5: Viết chương trình để định nghĩa kiểu lớp Circle, sau đó đếm số đối tượng được tạo ra/ được huỷ khi chạy chương trình?

91

© Vũ Duy Linh Đối tượng (12)

92

© Vũ Duy Linh Đối tượng (13)

Run

93

© Vũ Duy Linh Truyền tham số

 Khi gọi phương thức có chứa tham số, ta cần phải truyền đối số cho nó. Trong Java, vì không có khái niệm con trỏ, nên tất cả các kiểu dữ liệu đều được truyền bằng tham trị (Pass by value).

Đối với biến kiểu nguyên thủy (Primitive type variable): Khi ta ra lời gọi phương thức thì Java sẽ tạo một bản sao của biến tham số thực (tst) và bản sao này sẽ truyền cho tham số hình thức (tsht)

 giá trị của biến bản sao tst này sẽ bằng với giá trị của biến tsht nhưng KHÔNG ảnh hưởng đến giá trị của tst ban đầu.

Đối với biến kiểu tham chiếu/ đối tượng (Reference/ Object type variable): Java cũng truyền đối số bằng trị, nghĩa là giá trị (của) biến tham chiếu của tst sẽ được truyền cho biến tham chiếu của tsht. Như vậy, biến tst và tsht đều tham chiếu đến cùng một đối tượng  giá trị của chúng sẽ ẢNH HƯỞNG đến nhau.

94

© Vũ Duy Linh Truyền tham số (2)

Ví dụ 6 - Dự án gồm 3 lớp: HinhTron, TruyenThamSo, LopChinh

/**

* @author Vu Duy Linh

* Object-Based Programming, Truyen tham so...

*/

class HinhTron{

private int bk;

private String trThai;

public void setBk(int bk) {this.bk = bk;}

public void setTrThai(String trThai) { this.trThai = trThai;

}

@Override

public String toString() {

return "\n\t>>> Trang thai: \""+ trThai+

"\" va ban kinh= "+ bk ; }

}

95

© Vũ Duy Linh Truyền tham số (3)

public class PassParametters {

static void testPassObj(HinhTron ht2){

ht2.setTrThai("Da cap nhat"); // thay doi tsht ht2.setBk(400);

}

static void testPassPri(int a){

a = 200; // thay doi tsht }

public static void main(String[] args) { int x = 100; //tst

System.out.println("Gia tri x TRUOC khi goi testPassPri= "+x);

testPassPri(x);

System.out.println("Gia tri x SAU khi goi testPassPri= "+x);

96

© Vũ Duy Linh Truyền tham số (4)

HinhTron ht1 = new HinhTron(); //tst ht1.setTrThai("Ban dau");

ht1.setBk(300);

System.out.println("Thong tin hinh tron TRUOC khi goi testPassObj:"+ht1.toString());

testPassObj(ht1);

System.out.println("Thong tin hinh tron SAU khi goi testPassObj"+ht1.toString());

} }

Kết quả:

Gia tri x TRUOC khi goi testPassPri= 100 Gia tri x SAU khi goi testPassPri= 100

Thong tin hinh tron TRUOC khi goi testPassObj:

>>> Trang thai: "Ban dau" va ban kinh= 300 Thong tin hinh tron SAU khi goi testPassObj

>>> Trang thai: "Da cap nhat" va ban kinh= 400

97

© Vũ Duy Linh Truyền tham số (5)

Ban đầu

ht1

* Biến kiểu nguyên thủy:

Tham số thực Phương thức được gọi đang hoạt động

x-copy 100

a 100 200

Phương thức được gọi kết thúc

x 100

a

N/A

giải phóng biến bởi GC

Phương thức được gọi đang hoạt động Tham số thực

Ban đầu

ht1

ht2

Đã cập nhật

ht1

ht2

Đã cập nhật

ht1

ht2

null giải phóng biến

Phương thức được gọi kết thúc

* Biển kiểu tham chiếu:

x 100

Thay đổi

Thay đổi

Sơ đồ minh hoạ:

x-copy

98

© Vũ Duy Linh Gói

Gói (Package): Là một cách để gom chung các kiểu dữ liệu (lớp, giao diện,…) có liên hệ với nhau thành một nhóm với phạm vi quyền truy xuất nhất định - việc quan trọng đối với những dự án phát triển theo phương pháp lập trình HĐT.

 Cú pháp:

package tên_gói[.tên_gói_con];

 Ví dụ: package mycalculator;

package mycalculator.display;

package mycalculator.processing;

Quyền truy xuất Phạm vi

public protected default private

Ở cùng lớp Yes Yes Yes Yes

Ở khác lớp và cùng gói Yes Yes Yes No

Bảng phạm vi truy cập ở mức thành viên

99

© Vũ Duy Linh Gói (2)

Ví dụ 7: Phương trình bậc hai có 2 lớp khác nhau và chung gói

100

© Vũ Duy Linh Gói (3)

101

© Vũ Duy Linh Gói (4)

Error

Successful

102

© Vũ Duy Linh Gói (5)

Ví dụ: Tạo một dự án (Project) có 02 gói

 Gói 1 - package1: gồm (các) lớp chứa các phương thức để tính cộng, và trừ hai số nguyên: x+y, x-y

 Gói 2 - package2: gồm (các) lớp có chứa phương thức sau:

• phép nhân a * b = a + a + … +a (b lần): thông qua lời gọi phương thức cộng ở package1

• Sử dụng hai phương thức cộng ở package1 và nhân ở cùng gói (package2) để tính biểu thức S= 1*2 + 2*3 +…+n*(n+1)

• V.v…

Hướng dẫn: trên lớp

Một phần của tài liệu Tài liệu lập trình hướng đối tượng Java căn bảnOOP (Trang 69 - 103)

Tải bản đầy đủ (PDF)

(238 trang)