ĐỐI TƯỢNG VÀ LỚP, MẢNG

16 471 0
Tài liệu đã được kiểm tra trùng lặp
ĐỐI TƯỢNG VÀ LỚP, MẢNG

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Đối tượng lớp, mảng ĐỐI TƯỢNG VÀ LỚP, MẢNG I XÂY DỰNG LỚP Khi định nghĩa lớp, bạn thuộc tính mà chứa thể biến (Member Variable) hành vi thể hàm (Method) Các biến định nghĩa bên lớp gọi biến thành viên (Member Variables) Mã lệnh chứa phương thức (Method) Các phương thức biến định nghĩa lớp gọi chung thành phần lớp Trong hầu hết lớp, biến thể truy cập phương thức định nghĩa lớp Vì vậy, phương thức định liệu lớp dùng Lớp định nghĩa kiểu liệu mới, dùng để tạo đối tượng thuộc kiểu Dạng đầy đủ định nghĩa lớp sau : [public] Lớp truy xuất chung cho Package khác, mặc định có đoạn mã gói có quyền truy xuất [abstract] Lớp trừu tượng, khơng thể khởi tạo [final] Lớp khơng có lớp con, không kế thừa class ClassName Tên lớp [extends SuperClass] Kế thừa lớp cha SuperClass [implements Interfaces] Giao diện cài đặt Class { //Member Variables Declarations Khai báo biến // Methods Declarations Khai báo phương thức } Ví dụ : Tạo lớp Box đơn giản với ba biến : width, height, depth /* Định nghĩa lớp */ class Box { double width; double height; double depth;} II TẠO ĐỐI TƯỢNG1 Khai báo đối tượng Để có đối tượng lớp phải qua hai giai đoạn :  ClassName ObjectName;Ví dụ : Box myBox Khai báo biến myBox có kiểu lớp Box Khai báo thực không cấp phát ký ức đủ chứa đối tượng thuộc lớp Box, mà tạo quy chiếu trỏ đến đối tượng Box Sau câu lệnh này, quy chiếu myBox xuất ký ức chứa giá trị null chưa trỏ đến đối tượng thực tế Khác với câu lệnh khai báo biến kiểu sơ cấp dành chỗ ký ức đủ chứa trị thuộc kiểu :Ví dụ : int i; Sau câu lệnh này, biến ngun i hình thành  Sau đó, để thực tạo đối tượng gán địa đối tượng cho biến này, dùng toán tử new ObjectName = new ClassName();Ví dụ : myBox = new Box();  Có thể kết hợp hai bước vào câu lệnh : ClassName ObjectName = new ClassName();Ví dụ : Box myBox = new Box(); Box myBox2 = myBox; myBox2 tham chiếu đến đối tượng mà myBox tham chiếu myBox width height depth Box Object Đối tượng lớp, mảng myBox2 Cách truy xuất thành phần lớp  Biến khai báo định nghĩa lớp gồm có hai loại : - Biến đối tượng (Instance Variable hay Object Variable) : thuộc tính đối tượng, truy xuất phải khởi tạo đối tượng + Cách khai báo biến đối tượng : Type InstanceVar; + Cách truy cập biến đối tượng : ObjectName.InstanceVar - Biến lớp (Class Variable) : chất biến toàn cục, biến tĩnh tạo lập lần với lớp, dùng chung cho đối tượng thuộc lớp, truy xuất không cần khởi tạo đối tượng, để trao đổi thông tin đối tượng lớp + Cách khai báo biến lớp : static Type ClassVar; + Cách truy cập biến lớp : ClassName.ClassVar  Hàm khai báo định nghĩa lớp gồm có hai loại : - Hàm đối tượng (Object Method) : cách truy xuất hàm đối tượng biến đối tượng ObjectName.ObjectMethod(Parameter-List)- Hàm lớp (Class Method) : thông thường thành phần lớp truy xuất liên kết với đối tượng thuộc lớp Tuy nhiên, tạo thành phần mà dùng độc lập mình, khơng cần tham chiếu đến đối tượng cụ thể, truy xuất trước đối tượng lớp tạo ra, cách đặt trước khai báo từ khố static Cách truy xuất hàm lớp : ClassName.ClassMethod(Parameter-List) Các hàm toán học lớp Math Package Java.Lang hàm lớp nên gọi không cần phải khởi tạo đối tượng Ví dụ : double a = Math.sqrt(453.28); Ví dụ 1: class BaiTho { static int i; // Biến lớp String s; // Biến đối tượng BaiTho(String ss) { // Hàm khởi tạo s = ss; i++; } void content( ) { System.out.println(s); } } class UngDung { public static void main(String args[]){ BaiTho p1 = new BaiTho(“Chi co thuyen moi hieu”); BaiTho p2 = new BaiTho(“Bien menh mong nhuong nao”); p1.content(); p2.content(); System.out.println(“So cau tho la : “+BaiTho.i); } Đối tượng lớp, mảng } Khi tạo đối tượng p1, p2 toán tử new, hàm dựng BaiTho() gọi, i tăng lên Ví dụ 2: class BaiTho2 { static int i; String s; BaiTho2(String ss) { // Hàm khởi tạo s = ss; i++; } static int number() { // Hàm lớp return i; } String content() { // Hàm đối tượng return s; } } class UngDung2 { public static void main (String args[]) { System.out.println(“Bai tho co “+BaiTho2.number()+“ cau”); BaiTho2.p1 = new BaiTho2(“Chi co thuyen moi hieu”); BaiTho2.p2 = new BaiTho2(“Bien menh mong nhuong nao”); System.out.println(“Bai tho co “+BaiTho2.number()+“ cau”); System.out.println(“Cau tho\n“+p1.content().toUpperCase()+”\nco” + p1.content().length() +” ky tu”); System.out.println(“Tu \”tinh yeu\“ bat dau sau ky tu thu“+ p2.content().indexOf(“tinh yeu”)+” cau\n”+ p2.content().toUpperCase()); } } Gọi hàm lớp BaiTho2.number() lúc chưa gọi hàm dựng BaiTho2 để khởi tạo đối tượng cho trị p1.content() trả đối tượng String III GIỚI THIỆU VỀ PHƯƠNG THỨC1 Khai báo phương thức (hàm) Dạng tổng quát phương thức sau : [acess] [static] [abstract] [final] [Type] MethodName(Parameter-List) throws exceptions { // Body of method} điều khiển truy xuất hàm lớp hàm trừu tượng hàm - Type : Kiểu liệu hàm trả về, kiểu bất kỳ, kể kiểu lớp bạn tạo Nếu hàm không trả giá trị nào, kiểu trả phải void - Các hàm có kiểu trả khơng phải void trả giá trị cho chương trình gọi dùng dạng câu lệnh return sau : return biểu thức; Giá trị biểu thức tính trả cho hàm - Tất thông tin bạn muốn truyền gởi thông qua tham số nằm hai dấu ( ) sau tên hàm Nếu khơng có tham số phải có ( ) Đối tượng lớp, mảng Parameter-List : Danh sách tham đối phân cách dấu phẩy, tham đối phải khai báo kiểu, kiểu bất kỳ, có dạng : Type Parameter1, Type Parameter2 Phạm vi truy xuất thành phần lớp Các điều khiển truy xuất Java public, private protected protected áp dụng có liên quan đến kế thừa xét đến sau Khi bổ sung tiền tố cho thành phần lớp (biến hàm) :- Từ khoá public : thành phần truy xuất dịng lệnh dù hay ngồi lớp mà khai báo - private : truy xuất lớp nó, đoạn mã nằm ngồi lớp, kể lớp khơng có quyền truy xuất- Khi khơng có điều khiển truy xuất dùng, public gói nó, khơng thể truy xuất từ bên ngồi gói Phương thức main() Khi chạy ứng dụng độc lập, bạn tên Class muốn chạy, Java tìm gọi hàm main() trước tiên Class đó, phương thức main điều khiển chạy phương thức khác Dạng tổng quát phương thức main() public static void main(String args[]) { // Body of Method } - Một chương trình cần lớp có phương thức main() gọi lớp ứng dụng độc lập Primary Class - Từ khoá static cho phép hàm main() gọi khơng cần khởi tạo đối tượng Vì main() trình thơng dịch Java gọi trước lớp khởi tạo - Từ khoá void cho biết hàm main() không trả giá trị - Từ khoá public hàm gọi dịng lệnh bên ngồi lớp chương trình khởi động - Tham đối String args[ ] khai báo tham số tên args thuộc lớp String, chứa chuỗi ký tự Tham đối giữ tham đối dòng lệnh dùng thi hành chương trình Ví dụ : class ViDu { public static void main (String args[]) { for (int i=0; i < args.length; i++) { System.out.println(“Tham doi thu “+i+”: “+args[i]); } } } Khi chạy chương trình : C:\>java ViDu Thu tham doi dong lenh ↵ Tham doi thu : Thu Tham doi thu : tham C:>java ViDu Thu “tham doi” “dong lenh” ↵ Tham doi thu : Thu Tham doi thu : tham doi Tham doi thu : dong lenh Ví dụ : class ViDu2; public static void main(String args[]) { int sum = 0; float avg = 0; for (int i=0; ijava ViDu2 ↵ Tong = Trung binh = Hàm khởi tạo (Constructor) Có thao tác cần thực đối tượng lần tạo khởi tạo giá trị cho biến Các công việc làm tự động cách dùng hàm khởi tạo Hàm khởi tạo có tên với lớp mà thuộc về, tự động gọi toán tử new đối tượng thuộc lớp tạo Hàm khởi tạo khơng có giá trị trả về, định nghĩa hàm ghi void hay khơng ghi Ví dụ : - kích thước hộp khởi tạo tự động đối tượng tạo class Box { double width; double height; double depth; double volume() { return width * height * depth;}Box(double w, double h, double d) { width = w; height = h; depth = d; }}class BoxDemo {public static void main (String args[ ]) { Box myBox1 = new Box(10,20,15); Box myBox2 = new Box(3,6,9);double vol;vol = myBox1.volume();System.out.println(“Thể tích : “+vol);vol = myBox2.volume();System.out.println(“Thể tích : “+vol);} }- Khi bạn khơng định nghĩa tường minh hàm khởi tạo cho lớp, Java tạo hàm khởi tạo cho lớp Vì chương trình trước làm việc bình thường Hàm khởi tạo khơng có danh sách tham đối, tự động khởi tạo tất biến đối tượng trị rỗng theo quy ước mặc định Java, trị cho kiểu số, ký tự ‘\0’ cho kiểu ký tự char, trị false cho kiểu boolean, trị null cho đối tượng - Hàm khởi tạo nạp chồng hàm bình thường ̣(sẽ nói rõ phần sau) nghĩa ta phép định nghĩa nhiều hàm khởi tạo khác danh sách tham đối hay kiểu tham đối Hàm hủy Các đối tượng cấp phát động tốn tử new, khơng tồn tham chiếu đến đối tượng, đối tượng xem khơng cịn cần đến nhớ cho tự động giải phóng thu gom rác (garbage collector) Trình thu gom rác hoạt động tuyến đoạn (Thread) độc lập với chương trình bạn Bạn khơng phải bận tâm cơng việc Sau bạn hiểu rõ tuyến đoạn Tuy nhiên, Java cho phép ta viết hàm hủy, cần thiết cho trường hợp Hàm hủy Java gọi trình thu gom rác, bạn khó đốn trước vào lúc hàm hủy gọi Dạng hàm hủy sau : protected void finalize() { // Body of Method } Đối tượng lớp, mảng Từ khoá this Nếu biến định nghĩa thân hàm, biến cục tồn hàm gọi Nếu biến cục đặt tên trùng với biến đối tượng biến lớp, che khuất biến đối tượng hay biến lớp thân hàm : Ví dụ : class ViDu { int test = 10; // Biến đối tượng void printTest() { int test = 20; // Biến cục System.out.println(“test = “+test); // In biến cục } public static void main(String args[]) { ViDu a = new ViDu(); a.printTest(); } } Từ khố this dùng bên phương thức để tham chiếu đến đối tượng hành, biến đối tượng trùng tên với biến cục Ví dụ : Thay dịng lệnh : System.out.println(“test = “+this.test); // In biến cục bộ, this đối tượng a Nạp chồng hàm (Overloaded Methods) Trong lớp, Java cho phép bạn định nghĩa nhiều hàm trùng tên với điều kiện hàm phải có danh sách tham đối khác nhau, nghĩa khác số tham đối kiểu tham đối Khả gọi nạp chồng hàm Java phân biệt hàm với hàm khác dựa vào số tham đối kiểu tham đối, bất chấp tên hàm kiểu kết trả Ví dụ : // MyRect.java import java.awt.Point; class MyRect { int x1 = 0; int y1 = 0; int x2 = 0; int y2 = 0; MyRect buildRect(int x1, int y1, int x2, int y2) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; return this; } MyRect buildRect(Point topLeft, Point bottomRight) { x1 = topLeft.x; y1 = topLeft.y; x2 = bottomRight.x; y2 = bottomRight.y; return this; } MyRect buildRect(Point topLeft, int w, int h) { Đối tượng lớp, mảng x1 = topLeft.x; y1 = topLeft.y; x2 = x1+w; y2 = y1 + h; return this; } void display() { System.out.print(“Doi tuong MyRect : ”); } } Thật ra, gói awt có sẵn lớp Rectangle chuyên dùng để biểu diễn hình chữ nhật Lớp MyRect ta dùng để minh hoạ cho khái niệm nạp chồng hàm Trong lớp MyRect có hàm giúp bạn tạo đối tượng MyRect với yếu tố cho trước khác : - Cho trước toạ độ góc trái x1, y1 toạ độ góc phải x2, y2 - Cho trước góc trái góc phải hình chữ nhật dạng đối tượng Point - Cho trước toạ độ góc trái hình chữ nhật dạng đối tượng Point chiều rộng, chiều cao Nhờ khả nạp chồng hàm, bạn cần nhớ tên hàm cho hàm khác chức Chương trình sử dụng lớp MyRect xây dựng : import java.awt.Point; class UngDung { public static void main(String args[]) { MyRect rect = new MyRect(); rect.buildRect(25,25,50,50); rect.display(); rect.buildRect(new Point(10,10), new Point(20,20)); rect.display(); rect.buildRect(new Point(10,10), 50, 50); rect.display(); } } Truyền tham đối Java dùng hai cách truyền tham đối : truyền giá trị truyền tham chiếu, tùy vào truyền- Khi ta truyền kiểu sơ cấp cho phương thức, truyền giá trị Vì xảy với tham đối phương thức, khỏi phương thức hết tác dụngKhi ta truyền đối tượng (kiểu phức hợp) cho phương thức, truyền tham chiếu Vì vậy, thay đổi đối tượng bên phương thức ảnh hưởng đến đối tượng dùng làm tham đối Ví dụ : class ViDu { void tinhToan(int i, int j) { i *= 2; j /= 2; } } class UngDung { public static void main(String args) { ViDu o = new ViDu(); int a = 15, b = 20; Đối tượng lớp, mảng System.out.println(“a b trước gọi : “+a+ “ ”+b); o.tinhToan(a, b); System.out.println(“a b sau gọi : “+a+” “+b); } } Kết chương trình : a b trước gọi : 15 20 a b sau gọi : 15 20 Ví dụ : class ViDu { int a, b; ViDu (int i, int j) { a = i; b = j; } void tinhToan(ViDu o) { o.a *= 2; 0.b /= 2; } } class UngDung { public static void main(String args[]) { ViDu o = new ViDu(15, 20); System.out.println(“o.a o.b trước gọi : “+o.a+” “+o.b); o.tinhToan(o); System.out.println(“o.a o.b sau gọi : “+o.a+” “+o.b); } } Kết chương trình : o.a o.b trước gọi : 15 20 o.a o.b sau gọi : 30 10 IV LỚP KẾ THỪA Khai báo kế thừa Ta sử dụng tính kế thừa tạo lớp tổng qt có đặc tính chung đại diện cho tập hợp đối tượng có mối quan hệ Sau đó, lớp kế thừa hay nhiều lớp khác đặc tính trở thành thành đặc tính lớp kế thừa - Lớp kế thừa gọi lớp cha (SuperClass : lớp cha trực tiếp)- Lớp kế thừa gọi lớp (SubClass) Lớp kế thừa tất biến hàm định nghĩa lớp cha class ClassName extends SuperClass { //Member Variables Declarations, Methods } - Mặc dù vậy, lớp truy xuất thành phần khai báo private lớp chaMột biến tham chiếu lớp cha gán để tham chiếu đến lớp dẫn xuất từ lớp cha Khi tham chiếu đến lớp gán cho biến tham chiếu kiểu lớp cha, ta có quyền truy xuất phần định nghĩa lớp cha Viết chồng hàm hay che khuất hàm (Overriding Methods) Trong phân cấp lớp, hàm lớp có tên, giống số lượng kiểu tham đối kiểu trả với hàm lớp cha, hàm lớp gọi viết Đối tượng lớp, mảng chồng hàm lớp cha Khi hàm lớp che khuất hàm thừa kế từ lớp cha Tuy nhiên lớp không viết chồng hàm (có khai báo final) hàm lớp lớp cha Ví dụ : Tất lớp hậu duệ lớp Object Lớp Object chứa phương thức toString, mà trả đối tượng String chứa tên lớp đối tượng Hầu hết lớp viết chồng phương thức in vài điều có nghĩa cho lớp Từ khố super Đơi bạn khơng muốn thực viết chồng phương thức mà muốn thêm chức vào phương thức Để làm điều này, bạn gọi phương thức viết chồng dùng từ khoá super Từ khoá super dùng lớp cần tham chiếu lớp cha trực tiếp Super có hai dạng cú pháp :- Dạng : Hàm khởi tạo lớp cha phải gọi trước hàm khởi tạo lớp Nếu định nghĩa hàm khởi tạo lớp khơng có câu lệnh gọi hàm khởi tạo lớp cha, trình biên dịch Java tự động đưa vào câu lệnh gọi hàm khởi tạo mặc định lớp cha có dạng : classname() Bạn tự thêm lệnh gọi hàm khởi tạo lớp cha có dạng sau : super(Parameter-List)Parameter-List danh sách tham đối cần thiết cho hàm khởi tạo lớp cha super() phải luôn phát biểu thực hàm khởi tạo lớp conVí dụ : class MyPoint { int x, y; MyPoint(int x, int y) { this.x = x; this.y = y; } void display() { System.out.print(“x = “+x+”, y = “+y+”\n”); } } class MyPoint2 extends MyPoint { int z; String name; MyPoint2(int x, int y, int z, String name) { super(x,y); // Khởi tạo biến x, y cách gọi this.z = z; // hàm dựng lớp cha this.name = name; } void display() { // Viết chồng hàm kế thừa từ lớp cha System.out.print(“x = “+x+”, y = “+y+”, z = “+z+” “+”name :”+name+”\n”); } } - Dạng : dùng để hàm lớp truy xuất hàm kế thừa từ lớp cha : super.Member Member phương thức hay biến đối tượngVí dụ : Viết lại hàm display() class MyPoint2, có gọi hàm kế thừa từ lớp cha : void display() { super.display(); System.out.print(”, z = “+z+” “+”name :”+name+”\n”); } Đối tượng lớp, mảng V LỚP, PHƯƠNG THỨC TRỪU TƯỢNG Trong trường hợp muốn định nghĩa lớp cha theo cấu trúc trừu tượng cho trước mà không cần thực đầy đủ phương thức Tức ta muốn tạo lớp cha có dạng chung cho tất lớp để lớp thực chi tiết Khi đó, bạn muốn chắn lớp có chồng lắp phương thức Những phương thức phải chồng lắp lớp gọi phương thức trừu tượng, khai báo abstract khơng có phần thân phương thức abstract [Type] MethodName(Parameter-List) ; Bất kỳ lớp chứa hay nhiều phương thức trừu tượng phải khai báo trừu tượng, sử dụng từ khoá abstract trước từ khố class Khơng thể khởi tạo đối tượng kiểu lớp trừu tượng, lớp trừu tượng khơng định nghĩa đầy đủ Do đó, bạn khơng thể khai báo hàm khởi tạo Bất kỳ lớp phải viết chồng tất phương thức trừu tượng lại khai báo abstract Ví dụ : Trong ứng dụng, bạn vẽ đường trịn, hình chữ nhật, đoạn thẳng, đường cong… Mỗi đối tượng đồ hoạ chứa thuộc tính (vị trí, nét viền) hành vi (di chuyển, thay kích thước, vẽ) Bạn khai báo chúng kế thừa lớp Graphic Tuy nhiên vẽ đường trịn hồn tồn khác với vẽ hình chữ nhật, nên lớp Graphic khai báo lớp trừu tường, chứa phương thức thực moveTo, phương thức trừu tượng draw abstract class GraphicObject { int x, y; void moveTo(int newX, int newY) { } abstract void draw(); } Mỗi lớp không trừu tượng lớp Graphic Circle, Rectangle phải cài đặt đầy đủ cho phương thức draw class Circle extends GraphicObject { void draw() { } } class Rectangle extends GraphicObject { void draw() { } } VI LỚP HẰNG (KHÔNG KẾ THỪA), HÀM HẰNG (KHỒNG VIẾT CHỒNG) Sử dụng từ khoá final cấm chồng lắp Mặc dù chồng lắp phương thức đặc điểm mạnh Java, nhiên vài trường hợp bạn muốn cấm điều Để cấm phương thức lớp viết chồng phương thức lớp cha, bạn đưa từ khoá final vào đầu khai báo Ví dụ : class Box { double width;double height;double depth;… final double volume() { return width * height * depth;} } 10 Đối tượng lớp, mảng Sử dụng từ khoá final cấm kế thừa Muốn khai báo lớp mà khơng có lớp kế thừa, bạn sử dụng từ khố final Với lớp final, tất phương thức final Ta khơng thể khai báo lớp vừa abstract final lớp trừu tượng lớp chưa hoàn chỉnh phải có lớp để thực đầy đủ Ví dụ : final class Box { } VII LỚP LỒNG NHAU Có thể định nghĩa lớp bên lớp khác Lớp gọi lớp lồng (Nested Class) cài đặt sau : class EnclosingClass{ // Lớp bao bên static class StaticNestedClass { // Lớp lồng tĩnh } class InnerClass { // Lớp lồng phi tĩnh hay lớp nội } } Lớp lồng biết bên tầm vực lớp bao bên Bộ dịch Java báo lỗi đoạn mã bên lớp bao cố dùng trực tiếp lớp lồng Một lớp lồng có quyền truy cập đến thành viên lớp bao bên ngồi, chí chúng khai báo private Tuy nhiên, lớp bao truy xuất thành phần lớp lồng Có hai kiểu lớp lồng : tĩnh phi tĩnh Lớp lồng tĩnh (static nested class) bổ sung từ khoá static Nó khơng thể tham chiếu trực tiếp đến biến hay phương thức đối tượng định nghĩa lớp bao, mà dùng chúng thơng qua đối tượng Vì giới hạn nên lớp lồng tĩnh dùng Hầu hết lớp lồng lớp nội Lớp lồng phi tĩnh (nonstatic nested class) khơng bổ sung từ khố static, gọi lớp nội (inner class) Nó truy cập trực tiếp đến biến phương thức đối tượng class Outer { int outer_x = 100; void test() { Inner inner = new Inner(); inner.display_x(); } class Inner { // truy xuất trực tiếp biến đối tượng lớp Outer int inner_y = 10; void display_x() { System.out.println(“display : outer_x = “ + outer_x); } } void display_y() { // truy xuất biến đối tượng lớp Inner System.out.println(“display : inner_y = “ + inner_y); // Error } } class InnerClassDemo { public static void main(String args[]) { Outer outer = new Outer(); 11 Đối tượng lớp, mảng outer.test(); } } VIII CHUYỂN ĐỔI KIỂU Chuyển đổi kiểu phức hợp Java cho phép chuyển đổi đối tượng thuộc lớp cháu thành đối tượng lớp cha ông (Ancestors), không cho chuyển ngược lại Giả sử bạn có đối tượng thuộc lớp Child cần chuyển đổi thành đối tượng thuộc lớp cha ông Parent Java cho phép dùng đối tượng Child cách tự nhiên chỗ dành cho đối tượng Parent, ta không cần làm động tác chuyển đổi Đối tượng Child có đầy đủ thuộc tính hành vi đối tượng Parent nên “vào vai” đối tượng Parent Nếu muốn, bạn chuyển đổi đối tượng thuộc lớp cháu thành đối tượng thuộc lớp cha ông cách tường minh, không cần thiết : Child c = new Child(); Parent p = (Parent) c; Chuyển đổi kiểu sơ cấp thành kiểu phức hợp Trong gói java.lang có sẵn lớp tương ứng với kiểu sơ cấp, dùng thay cho kiểu sơ cấp : lớp Integer thay cho kiểu int, lớp Boolean cho kiểu boolean, lớp Float cho kiểu float, lớp Double cho kiểu double… Lớp Number lớp cha lớp bọc kiểu Chẳng hạn, muốn cho kiểu int xuất đối tượng thuộc lớp Integer : Integer intObj = new Integer(25); Lớp Integer trang bị phương thức giúp bạn nhiều việc mà kiểu int đảm đương - Lấy giá trị nguyên mà đối tượng intObj nắm giữ : int i = intObj.intValue(); IX MẢNG (ARRAY) Mảng cấu trúc lưu giữ thành phần có kiểu Chiều dài mảng thiết lập cố định mảng tạo lúc chạy chương trình Mỗi thành phần mảng truy xuất số mảng Nếu bạn muốn lưu giữ thành phần khác kiểu hay kích thước mảng thay đổi động, dùng Vector thay cho mảng Tạo sử dụng mảng  Khai báo biến tham chiếu đến mảng ArrayType[] ArrayName Khai báo biến có kiểu ArrayType dùng để tham chiếu đến mảng, khơng có mảng thật tồn ArrayType : kiểu liệu thành phần chứa mảng dấu [] định mảng Kiểu liệu thành phần kiểu sở, tham chiếu int[] anArrayOfInts; // Khai báo mảng số nguyên float[] anArrayOfFloats; boolean[] anArrayOfBooleans; Object[] anArrayOfObjects; String[] anArrayOfStrings;  Tạo mảng 12 Đối tượng lớp, mảng Bạn dùng toán tử new để tạo mảng, nghĩa cấp phát nhớ cho thành phần gán mảng đến biến khai báo ArrayName = new ArrayType[ArraySize] ArraySize : số thành phần mảng Ví dụ : int[] M; // khai báo biến mảng kiểu số nguyên M = new int[10]; // tạo mảng số nguyên Bạn kết hợp khai báo biến mảng tạo mảng sau : ArrayType[] ArrayName = new ArrayType[ArraySize] Có thể viết sau : ArrayType ArrayName[] = new ArrayType[ArraySize] Ví dụ : int[] M = new int[10]; int M[] = new int[10];  Truy xuất thành phần mảng ArrayVar[index] index : vị trí thành phần mảng cần truy xuất, giá trị, biến hay biểu thức, có giá trị từ đến ArraySize-1 Ví dụ : M[1] = 20;  Lấy kích thước mảng ArrayName.length  Khởi tạo giá trị đầu mảng Mảng khởi tạo khai báo Mảng khởi tạo danh sách biểu thức cách dấu phẩy bao quanh dấu ngoặc móc Mảng khởi tạo tự động để lưu số phần tử mà bạn xác định lúc khởi tạo, không cần sử dụng new Chiều dài mảng số giá trị { } Ví dụ : boolean[] answers = { true, false, true, true, false }; int month_days[] = {31,28,31,30,31,30,31,31,30,31,30,31}; Ví dụ 1: Tạo sử dụng mảng có thành phần kiểu sở public class ArrayDemo { public static void main(String[] args) { int[] anArray; anArray = new int[10]; for (int i = 0; i < anArray.length; i++) { anArray[i] = i; System.out.print(anArray[i] + " "); } System.out.println(); } } Ví dụ : Tạo sử dụng mảng có thành phần kiểu tham lớp String public class ArrayOfStringsDemo { public static void main(String[] args) { String[] anArray = { "String One", "String Two", "String Three" }; for (int i = 0; i < anArray.length; i++) { System.out.println(anArray[i].toLowerCase()); } } } Mảng đa chiều (Arrays of Arrays) Mảng chứa thành phần mảng Để khai báo biến mảng đa chiều cần xác định chiều mảng cách sử dụng cặp dấu ngoặc vuông 13 Đối tượng lớp, mảng Ví dụ : int M[][] = new int[4][5]; int[][] M = new int[4][5]; M mảng 4x5 thành phần số nguyên Khi cấp phát nhớ cho mảng đa chiều, bạn định chiều dài mảng chính, khơng định chiều dài mảng tạo chúng Ví dụ : int M[][] = new int[3][]; M[0] = new int[3]; M[1] = new int[4]; M[2] = new int[2]; Ví dụ : public class ArrayOfArraysDemo { public static void main(String[] args) { String[][] cartoons = { { "Flintstones", "Fred", "Wilma", "Pebbles", "Dino" }, { "Rubbles", "Barney", "Betty", "Bam Bam" }, { "Jetsons", "George", "Jane", "Elroy", "Judy", "Rosie", "Astro" }, { "Scooby Doo Gang", "Scooby Doo", "Shaggy", "Velma", "Fred", "Daphne" } }; for (int i = 0; i < cartoons.length; i++) { System.out.print(cartoons[i][0] + ": "); for (int j = 1; j < cartoons[i].length; j++) { System.out.print(cartoons[i][j] + " "); } System.out.println(); } } } Chú ý tất mảng có chiều dài khác Tên mảng cartoons[0], cartoons[1] Ví dụ : public class ArrayOfArraysDemo2 { public static void main(String[] args) { int[][] aMatrix = new int[4][]; for (int i = 0; i < aMatrix.length; i++) { aMatrix[i] = new int[5]; for (int j = 0; j < aMatrix[i].length; j++) { aMatrix[i][j] = i + j; } } for (int i = 0; i < aMatrix.length; i++) { for (int j = 0; j < aMatrix[i].length; j++) { System.out.print(aMatrix[i][j] + " "); } System.out.println(); } } } Sao chép mảng (Copying Arrays) 14 Đối tượng lớp, mảng Sử dụng phương thức arraycopy System chép liệu từ mảng đến mảng khác Phương thức arraycopy yêu cầu tham đối : public static void arraycopy(ArrayType[] source, int srcIndex, ArrayType[] dest, int destIndex, int length) Hai tham đối Object định mảng nguồn mảng đích Ba tham đối int vị trí bắt đầu mảng nguồn đích, số thành phần để chép Biểu đồ minh hoạ việc chép : Ví dụ : public class ArrayCopyDemo { public static void main(String[] args) { char[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e', 'i', 'n', 'a', 't', 'e', 'd' }; char[] copyTo = new char[7]; System.arraycopy(copyFrom, 2, copyTo, 0, 7); System.out.println(new String(copyTo)); } } Biểu đồ sau mơ tả cho ví dụ : Chú ý mảng đích phải cấp phát phải đủ lớn để chứa liệu chép 15 Đối tượng lớp, mảng 16 ... động tác chuyển đổi Đối tượng Child có đầy đủ thuộc tính hành vi đối tượng Parent nên “vào vai” đối tượng Parent Nếu muốn, bạn chuyển đổi đối tượng thuộc lớp cháu thành đối tượng thuộc lớp cha... System.out.println(anArray[i].toLowerCase()); } } } Mảng đa chiều (Arrays of Arrays) Mảng chứa thành phần mảng Để khai báo biến mảng đa chiều cần xác định chiều mảng cách sử dụng cặp dấu ngoặc vuông 13 Đối tượng lớp, mảng Ví dụ :... ngược lại Giả sử bạn có đối tượng thuộc lớp Child cần chuyển đổi thành đối tượng thuộc lớp cha ông Parent Java cho phép dùng đối tượng Child cách tự nhiên chỗ dành cho đối tượng Parent, ta không

Ngày đăng: 25/10/2013, 02:20

Hình ảnh liên quan

Sau câu lệnh này, biến nguyê ni hình thành.  Sau đó, để thực sự tạo ra một đối tượng và gán địa chỉ của đối tượng cho biến này, dùng toán tử new - ĐỐI TƯỢNG VÀ LỚP, MẢNG

au.

câu lệnh này, biến nguyê ni hình thành.  Sau đó, để thực sự tạo ra một đối tượng và gán địa chỉ của đối tượng cho biến này, dùng toán tử new Xem tại trang 1 của tài liệu.

Tài liệu cùng người dùng

Tài liệu liên quan