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

Một phần của tài liệu Bai giang lap trinh HDT voi java ICTU (Trang 43)

Cơ chế đóng gói trong LTH ĐT giúp cho các đối tượng che dấu đi một phần chi tiết cài đặt cũng như phần dữ liệu cục bộ của nó và chỉ công bố ra ngoài những gì cần công bố để trao đổi thông tin với các đối tượng khác để thực thi các yêu cầu của hệ thống

3.10.1. Phạm vi các thành phần của lớp

Phạm vi lớp xác định giới hạn truy nhập và khả năng kế thừa các thành phần của một lớp khác trong cùng gói hoặc khác gói chứa lớp đó. Nó được xác định bởi các bổ ngữ public, private, protected, mặc định(không có public, private, protected)

44

*Các thành phần public

-Các thành phần khai báo công khai public cho phép truy nhập và kế thừa mọi nơi trong hệ thống đối với những lớp khác trong cùng gói và khác gói chứa lớp đó.

*Các thành phần protected

Những thành phần protected cho phép truy nhập đối với tất cả các lớp trong gói chứa lớp đó và kế thừa tất cả các lớp con(có thể ở lớp khác). Hay những lớp khác không phải là lớp con ở những gói khác thì không được phép truy nhập tới các thành phần protected

Client 3 public classA classC classB classA1 ClassB1 Được phép truy nhập goi1 goi2 “import”

Hình H4-2 Khả năng truy nhập đối với lớp công khai public Quan hệ kế thừa

45

*Các thành phần private

Những thành phần sở hữu riêng private được bảo vệ chặt chữ nhất không cho phép kế thừa và chỉ cho phép truy nhập đối với những đối tượng trong cùng một lớp hay nói cách khác những lớp khác dùng ở trong cùng gói hay những lớp con cháu cũng không được phép truy nhập trực tiếp đến các thành phần riêng private.

public class MatKhau { private String matKhau;

public boolean dangNhap(String mk) {if(mk.equals(matKhau)) return true; Client 3 protected classA classC classB classA1 ClassB1 Được phép truy nhập

goi1 “import” goi2

Hình H4-2 Khả năng truy nhập đối với lớp công khai protected Quan hệ kế thừa

Không được phép truy nhập

46 else return false;

}

public boolean setMatKhau(String matKhauCu,String matKhauMoi) { if(dangNhap(matKhauCu))

{matKhau=matKhauMoi; return true;

}

else return false; }

}

*Các thành phần mặc định.

Những thành phần mặc định( không khai báo public, private, protected),của một lớp chỉ cho phép truy nhập và kế thừa với những lớp trong cùng gói chứa lớp đó, kể cả với lớp con của nó

Nói cách khác những lớp ở những gói khác thì không được phép truy nhập tới cá thành phần mặc định kể cả lớp kế thừa.

Như vậy thành phần mặc định sẽ có phạm vi nhìn thấy được rộng hơn các thành phần private nhưng hẹp hơn các thành phần protected.

3.10.2. Các bổ ngữ khác. *Các thành phần static (adsbygoogle = window.adsbygoogle || []).push({});

47 Khi khai báo các thành phần của lớp có tính chất tĩnh nghĩa là thành phần đó là chung cho cả lớp chứ không phải là thành phần của các thể nào cả thì ta sử dụng từ khóa static đứng trước phần khai báo như vậy các thành phần static sẽ là chung chotất cả các đối tượng trong 1 lớp còn những thành phần không static thì mỗi biến đều có bản sao các giá trị riêng cho từng đối tượng.

VD:SinhVien.siso, SV11A.quylop;

Các phương thức tĩnh là các phương thức thực hiện các tiện ích chung cung cấp cho đối tượng các thực thi các yêu cầu của hệ thống

VD: Math.sqrt(),Math.abs(), vv….. Chú ý:

Để truy nhập tới các thuộc tính dữ liệu tĩnh hoặc các hàm tĩnh có thể thực hiện theo hai cách.

+Thông qua tên lớp. SinhVien.siso; +Thông qua tên đối tượng sv1.siso;

Các hàm thành phần tĩnh chỉ được phép truy nhập đến các thành phần tĩnh khác không được phép truy nhập tới các thành phần không khai báo static.

*Các thành phần final.

Biến thành phần final được xem như là hằng, giá trị của nó sẽ không được thay đổi ngay sau khi đã được khởi tạo

Đối với cá biến final kiểu nguyên thủy khi chúng được khởi tạo giá trị thì sẽ không thay đổi được

Final int max=100; Max=101; // lỗi.

48 Đối với các biến final kiểu tham chiếu giá trị tham chiếu là đối tượng sẽ không thay đổi được nhưng các thành phần của đối tượng sẽ thay đổi được.

Final SinhVien sv1=new SinhVien(); SinhVien sv2=new SinhVien()

Sv1=sv2; ///lỗi

Sv1.tuoi=30; sv1.tuoi=40; ok

+Các hàm khai báo final không được viết đè ở các lớp con của nó hay không thay đổi được nội dung.

49 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Ệ 4.1. Các câu lệnh rẽ nhánh:

4.1.1. Lệnh if

Cú pháp:

Dạng1:

if(BT điều kiện)<Câu lệnh>;

Dạng2:

if(BT điều kiện)<lệnh 1> else <lệnh 2>;

Ý nghĩa:

Dạng 1: nếu biểu thức đúng thì làm <câu lệnh> nếu không đúng thì không thực hiện. Dạng 2: nếu biểu thức đúng thì làm <câu lệnh 1> nếu không đúng thì làm <câu lệnh 2>

Vận dụng: Viết câu lệnh: Nếu a>b thì gán a=a-b, nếu b>a thì gán b:=b-a.

Chú ý: if lồng

4.1.2 Lệnh rẽ nhánh switch case

Cú pháp: (adsbygoogle = window.adsbygoogle || []).push({});

switch(<Biểu thức nguyên>){ case <giá trị 1>: <Câu lệnh 1>;

case <giá trị 2>: <Câu lệnh 2>;

……… case <giá trị n>: <Câu lệnh n>;

[default: <câu lệnh n+1>;]

50

Hoạt động:

- Giáo viên giải thích cú pháp lệnh, lấy ví dụ câu lệnh cụ thể và giải thích hoạt động. Kết quả chương trình ví dụ in ra là gì?

- Vận dụng: Biết tháng x, viết đoạn chương trình in ra số ngày trong tháng x.

Chú ý: kết hợp lệnh break. 4.2 Các câu lệnh lặp:

4.2.1 Lệnh lặp while

Cú pháp:

while (<BT điều kiện >) <Thân chu trình>

Hoạt động: <BT điều kiện> đúng thì <Thân chu trình> được thực hiện, lại quay lại chu trình lặp, ngược lạ: kết thúc vòng lặp. 4.2.2 Câu lệnh do-while Cú pháp: do <Thân chu trình> Câu lệnh 1 Câu lệnh n Biểu thức nguyên Câu lệnh ... [case nhan 1] [case nhann]

51 while (<Điều kiện kết thúc chu trình>)

Hoạt động: Thực hiện <Thân chu trình>, kiểm tra <BT điều kiện>, nếu biểu thức điều kiện đúng thì lặp, ngược lại thì kết thúc vòng lặp.

4.2.3 Câu lệnh for (chu trình for)

Cú pháp:

for ([<Biểu thức bắt đầu>]; [<Điều kiện lặp>];[<Biểu thức gia tăng giá trị biến điều khiển>])

Hoạt động:

4.3. Các câu lệnh chuyển vị4.3.1. Câu lệnh break 4.3.1. Câu lệnh break

Ý nghĩa:

được sử dụng trong các khối được gắn nhãn, trong các chu trình lặp (for, while, do- while) và câu lệnh switch để chuyển điều khiển thực hiện chương trình ra khỏi khối trong cùng chứa nó.

- Lấy ví dụ chương trình cụ thể minh họa từng trường hợp. Hỏi kết quả thực hiện của chương trình là gì?

4.3.2. Câu lệnh continue

ý nghĩa:

được sử dụng trong các chu trình lặp for, while, do-while để dừng sự thực hiện của lần lặp hiện thời và bắt đầu lặp lại lần tiếp theo nếu điều kiện lặp còn thoả mãn(còn true).

Thân chu trình [true] [false] Biểu thức gia tăng Biểu thức bắt đầu Điều kiện lặp

52 - Lấy ví dụ chương trình cụ thể minh họa từng trường hợp. Hỏi kết quả thực hiện của chương trình là gì?

4.3.3 Câu lệnh return

Ý nghĩa: (adsbygoogle = window.adsbygoogle || []).push({});

Câu lệnh return được sử dụng để:

- Kết thúc thực hiện của hàm hiện thời.

- Chuyển điều khiển chương trình về vị trí sau lời gọi hàm đó. Hai loại hàm được xác định như sau:

Dạng lệnh return Hàm khai báo void Hàm có kiểu trả lại khác void

return Tùy chọn Không cho phép

return <Biểu thức> Không cho phép Bắt buộc

- Lấy ví dụ chương trình cụ thể minh họa từng trường hợp. Hỏi kết quả thực hiện của chương trình là gì?

- Sự khác nhau giữa 2 loại lệnh return?

4.4. Ngoại lệ và xử lý ngoại lệ

4.4.1 Tổng quan về xử lý ngoại lệ trong java

- Ngoại lệ: các trường hợp hoạt động không bình thường. Ví dụ:

int devide(int num, int denom, int& error) { if (0 != denom) {

error = 0;

return num/denom;} else

53 }

Xử lý ngoại lệ trong Java dựa trên cơ chế ném và bắt ngoại lệ:

 Ném ngoại lệ: dừng chương trình và chuyển điều khiển lên mức trên (nơi bắt ngoại lệ)

 Bắt ngoại lệ: xử lý với ngoại lệ

Ngoại lệ: là đối tượng mang thông tin về lỗi đã xảy ra.

Các gói xử lý ngoại lệ

Trong lớp Throwable:

+ getMessage(): Trả về một chuỗi thông tin về ngoại lệ

+toString(): Chuyển đối tượng ngoại lệ thành chuỗi có thể in ra màn hình.

+ printStackTrace(): Trình bày một cách hệ thống việc gọi các phương thức cho phép dò tìm ngoại lệ.

4.4.2 Bắt ngoại lệ: try … catch

Cú pháp

try { <Các câu lệnh>}

catch (<Kiểu ngoại lệ 1> <đối tượng ngoại lệ 1>){<khối lệnh xử lý khi gặp kiểu ngoại

lệ 1>} IOException java.io Throwable Error Exception InterruptedException RuntimeException ArithmeticException NullPointerException . . . . . . java.lang

54 [catch (<Kiểu ngoại lệ 2> <đối tượng ngoại lệ 2>){<khối lệnh xử lý khi gặp kiểu ngoại (adsbygoogle = window.adsbygoogle || []).push({});

lệ 2>}

. . .

catch (<Kiểu ngoại lệ n> <đối tượng ngoại lệ n>){<khối lệnh xử lý khi gặp kiểu ngoại

lệ n>}

]

[finally {< Các câu lệnh phải thực hiện đến cùng>}]

Hoạt động

Ngoại lệ xuất hiện trong khối try và bị tóm lại để xử lý ở các khối catch tương ứng.

Khối finally phải thực hiện đến cùng.

4.4.2 Ném ngoại lệ tường minh(tự động): throw

Ném ngoại lệ ra khỏi phương thức

Không nhất thiết phải xử lý các ngoại lệ bên trong phương thức đó có thể bởi hai lý do, không đủ thông tin, Không đủ thẩm quyền.

Ví dụ:

if (0==denominator) { throw new Exception(); }

else

res = nominator / denominator;

- Giáo viên chạy chương trình minh họa, sửa chương trình. Hỏi kết quả chạy chương trình là gì?

4.4.3 Ném ngoại lệ từ phương thức: throws

Ví dụ:

int readInt() throws IOException, NumberFormatException { ...

55 str = buf.readLine();

return Integer.valueOf(str).intValue(); }

- Chú ý: Khi sử dụng phương thức có ném ngoại lệ thì phải bắt ngoại lệ.

- Giáo viên chạy chương trình minh họa, sửa chương trình. Hỏi kết quả chạy chương trình là gì?

4.4.4. Tự định nghĩa ngoại lệ

Tạo lớp ngoại lệ để phục vụ các mục đích riêng:

- Lớp ngoại lệ mới phải kế thừa từ lớp Exception hoặc lớp dẫn xuất của lớp này.

- Có thể cung cấp hai constructor: constructor mặc định (không tham số), constructor nhận một tham số String và truyền tham số này cho phương thức khởi tạo của lớp cơ sở - Giáo viên chạy chương trình minh họa, sửa chương trình. Hỏi kết quả chạy chương trình là gì?

56 CHƯƠNG 5: CÁC LỚP CƠ SỞ VÀ CẤU TRÚC DỮ LIỆU

5.1. Cấu trúc mảng (adsbygoogle = window.adsbygoogle || []).push({});

Mảng là tập các phần tử có cùng kiểu và có số phần tử là cố định

Mảng trong java là đối tượng ta phải khai báo tạo lập trước khi sử dụng. *Khai báo mảng:

<kiểu các phần tử>[] <tên mảng>; Hoặc

<kiểu các phần tử> <tên mảng>[];

Trong đó kiểu các phần tử có thể là kiểu nguyên thủy hoặc kiểu lớp. VD: int m[]; SinhVien[] dsSinhVien;

Hoặc int m[]; SinhVien dsSinhVien[]; Chú ý:

Với khai báo trên kích thước mảng chưa được xác định.

Vì mảng là kiểu đối tượng nên với khai báo trên ta chưa hoàn tạo tạo ra cấu trúc mà mới khai báo cấu trúc để tham chiếu.

*Tạo lập mảng

Để tạo lập đối tượng mảng thì ta phảixác định số phần tử của mảng và sử dụng với toán tử new theo cú pháp

<tên mảng>=new <kiểu phần tử>[<số phần tử>]; Trong đó:

57 <kiểu phần tử> là kiểu tương thích với kiểu mà mảng đã được khai báo.

VD: m=new int[10]; dsSinhVien=new SinhVien[100];

<số phần tử> là số phần tử của mảng giá trị nhỏ nhất là 0 có nghĩa là trong java có thể tạo ra mảng có 0 phần tử.

*Khai báo+tạo lập Cúp pháp

<Kiểu các phần tử 1> <Tên mảng>[] = new <Kiểu các phần tử 2>[<Số phần tử>];

VD: int m[]=new int[10]; SinhVien dsSinhVien=new SinhVien[100]; Chú ý:

<kiểu các phần tử 1> và <kiểu các phần tử 2> là hai kiểu phải tương thích nếu nhau nếu là kiểu nguyên thủy thì hai kiểu đó phải trùng nhau hoặc ngược lại nếu là kiểu lớp thì <kiểu các phần tử 1>

Khi một mảng được tạo lập thì tất cả các phần tử của nó phải được khởi tạo các giá trị mặc định.

VD:*Khai báo+Tạo lập+ và khởi gán giá trị cho các phần tử của mảng.

Java cung cấp cơ chế cho phép khai báo tạo lập và gán ngay giá trị ban đầu cho các phần tử của mảng.

Cú pháp.

<Kiểu các phần tử 1> <Tên mảng>[] = {<Các giá trị ban đầu>} VD: int m[]={6,7,5,3,2,4};

* Mảng nhiều chiều.

Các phần tử của mảng có thể tham chiếu tới các mảng khác mảng của các mảng được gọi là mảng nhiều chiều

58 Cú pháp:

<kiểu các phần tử> [][]….[] <tên mảng>; Hoặc

<kiểu các phần tử> <tên mảng>[][]….[]; Tương tự như mảng một chiều ta có các câu lệnh VD:

Khai báo: int[][] M; hoặc int M[]; Khai báo+Tạo lập

int M[][]=new int[5][5]; (adsbygoogle = window.adsbygoogle || []).push({});

Khai báo+ tạo lập+khởi gán giá trị. int M[][]={{2,1,2},{5,2,1},{1,1,1}};

5.2 Các lớp cơ sở.

Trong gói java.lang cung cấp các lớp cơ bản như sau: Lớp Object, các lớp

Wrapper (lớp bao gói hay lớp nguyên thủy), Math, String và lớp StringBuffer. Các lớp này luôn mặc định được nạp vào chương trình. Tất cả các lớp trong gói đều là lớp con của lớp Object và được xây dựng theo cấu trúc như sau:

5.2.1. Lớp Math :

Object

Booleannn Character Void Number Math String StringBuffer

Integer Short

Byte Long Float Double

59 Lớp final class Math cung cấp những hằng số như số e (cơ số của logarithm), số pi

thông qua Math.E và Math.PI...

Lớp final class Math định nghĩa một tập các hàm tĩnh để thực hiện các chức năng chung của toán học như các phép làm tròn số, sinh số ngẫu nhiên, tìm số cực đại, cực tiểu, v.v...

a) Các hàm làm tròn và xử lý các giá trị giới hạn

+ Các hàm nạp chồng trả về giá trị tuyệt đối của đối số tương ứng

static int abs(int i) static long abs(long l) static float abs(float f) static double abs(double d)

+ static double ceil(double d): trả lại giá trị nhỏ nhất kiểu double mà không nhỏ hơn đối số và lại bằng số nguyên.

Ví dụ:

ceil(3.14) cho giá trị 4.0 là số trần trên của đối số.

+ static double floor(double d): trả lại giá trị lớn nhất kiểu double mà không lớn hơn đối số và lại bằng số nguyên.

Ví dụ floor(3.14) cho giá trị 3.0 là số sàn dưới của đối số.

+ Các hàm nạp chồng trả về số nguyên gần nhất của đối số

static int round(float f d) static long round(double d)

+ Hàm max được nạp chồng, trả về số lớn nhất trong 2 sô

60

static long max(long a, long b) static float max(float a, float b) static double max(double a, double b)

+ Hàm min được nạp chồng, trả về giá trị nhỏ nhất trong hai đối sô

static int min(int a, int b) static long min(long a, long b) static float min(float a, float b) static double min(double a, double b)

b) Các hàm lũy thừa

+ static double pow(double d1, double d2): trả lại giá trị là lũy thừa của d1 và d2 (d1d2).

+ static double exp(double d): trả lại giá trị là luỹ thừa cơ số e và số mũ d (ed). + static double log(double d): trả lại giá trị là lô-ga-rit tự nhiên (cơ số e) của d. static double sqrt(double d): trả lại giá trị là căn bậc hai của d , hoặc giá trị NaN (adsbygoogle = window.adsbygoogle || []).push({});

nếu đối số âm. c) Các hàm lượng giác

+ static double sin(double d): trả lại giá trị là sine của góc d được cho dưới dạng radian.

+ static double cos(double d): trả lại giá trị là cose của góc d được cho dưới dạng radian.

+ static double tan(double d): trả lại giá trị là tangent của góc d được cho dưới dạng radian.

61

static double random(): trả lại giá trị là số ngẫu nhiên trong khoảng từ 0.0 đến 1.0.

5.2.2. Các lớp nguyên thủy (Wrapper)

Những biến được khai báo có kiểu dữ liệu nguyên thủy trong java vốn không phải là những biến đối tượng => ta không thể tạo và truy cập bằng phương thức. Java.lang

cung cấp các lớp bao gói (Wrapper) cho từng kiểu dữ liệu nguyên thủy (gọi tắt là lớp nguyên thủy). Các lớp nguyên thủy có những đặc tính chung sau:

1. Các toán tử tạo lập chung. Các lớp nguyên thủy (trừ lớp Character chỉ có một toán tử tạo lập) đều có hai toán tử tạo lập:

 Toán tử 1: tạo ra đối tượng thuộc lớp nguyên thủy biểu diễn giá trị có kiểu dữ liệu nguyên thủy tương ứng.

Character charObj = new Character(‘a’); //tạo ra một đối tượng nguyên thủy

thuộc lớp Character, biểu diễn cho ký tự ‘a’.

Boolean boolObj = new Boolean(true); Integer intObj = new Integer(2002); Float floatObj = new Float(3.14F); Double doubleObj = new Double(3.14);

 Toán tử thứ hai: chuyển các đối tượng lớp String biểu diễn cho các giá trị nguyên thủy về các lớp tương ứng. Các toán tử này sẽ cho qua

NumberFormatException khi tham biến kiểu String không hợp lệ.

Boolean boolObj = new Boolean(“true”);//Tạo ra đối tượng nguyên thủy

boolObj thuộc lớp Boolean biểu diễn xâu “true” chuyển thành giá trị logic

Một phần của tài liệu Bai giang lap trinh HDT voi java ICTU (Trang 43)