Lập trình Java toàn tập_P4: Lớp, đối tượng, mảng
Khi định nghĩa lớp ta cần định nghĩa: - Các thuộc tính (biến) - Các hành vi (hàm)
Bạn đang xem trước 20 trang tài liệu Lập trình Java toàn tập_P4: Lớp, đối tượng, mảng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Lớp, đối tượng, mảng Xây dựng lớp Khi định nghĩa lớp ta cần định nghĩa: Các thuộc tính (biến) Các hành vi (hàm) Định nghĩa đầy đủ của 1 lớp Xây dựng lớp Hàm dựng (constructor) Có cùng tên với lớp mà nó thuộc về Định nghĩa cú pháp để tạo ra 1 đối tượng thuộc lớp đó Khởi gán các giá trị ban đầu (nếu có) Khởi tạo đối tượng: Khai báo Cú pháp Khai báo 1 biến tên name dùng để tham chiếu tới dữ liệu có kiểu là type Type có thể có hai dạng: Primitive types Reference types Với kiểu khai báo này giá trị của name hoặc là giá trị mặc định do Java khởi gán, hoặc là null. Type name; Ví dụ MyClass myObj = new MyClass(); or MyClass myObj; MyParent myObj = new MyClass(); or MyParent myObj; MyInterface myObj = new MyClass(); orMyInterface myObj; Note: MyParent và MyInterface phải là super class của MyClass Khởi tạo đối tượng Khởi tạo đối tượng Sử dụng đối tượng Bạn có thể sử dụng một đối tượng theo 2 cách: Tham chiếu tới các thuộc tính Ví dụ: System.out.println("Chieu cao cua rectOne: "+ rectOne.height); Triệu gọi các phương thức Ví dụ: System.out.println(“Dien tich cua rectOne: " + rectOne.area()); objectReference.variableName; objectReference.methodName(argumentList); Truyền tham đối Java cung cấp 2 cách để truyền tham đối: Truyền giá trị: (primitive data) chỉ có ý nghĩa và thay đổi trong phương thức. Khi phương thức kết thúc giá trị trở lại giá trị ban đầu Truyền tham chiếu: (object) thay đổi bên trong phương thức sẽ ảnh hưởng tới đối tượng dùng làm tham đối. Truyền tham đối Kết quả??? Kết quả Before modify() d.height = 10 dim = 11 After modify() d.height = 11 Truyền tham đối Kết quả??? Kết quả Before modify():Nguyen Van A After modify():Tran Thi B Truyền tham đối Kết quả??? Kết quả Before swap a: 1 , b: 2 After swap a: 1 , b: 2 Truyền tham đối Kết quả??? Dọn rác Java cung cấp cơ chế gom rác tự động Garbage collection mà người lập trình không cần phải quan tâm xử lý rác. Đối tượng khi không còn tham chiếu nào tới nó nữa gom rác. Dọn rác: nulling a reference Cách đầu tiên để dọn rác là set tham chiếu của đối tượng thành null Garbage collection sẽ làm việc sau câu lệnh này Ví dụ Kết quả Total JVM memory: 5177344 Before Memory = 4974672 After Memory = 4728504 After GC Memory = 5045864 Xử lý trước khi gom rác finally() methods: Giải phóng tài nguyên cấp phát trước khi gom rác đối tượng. Không nên overridden lại phương thức này vì bạn không biết chắc chắn lúc nào hàm hủy sẽ được gọi. Chuỗi trong Java Nguyễn Thị Tú Mi Email: nttmi@hcmuaf.edu.vn Khai báo và sử dụng chuỗi Java hỗ trợ Unicode mỗi kí tự dài 16 bit Ví dụ hằng chuỗi System.out.println(“Hello world”); Ghép chuỗi: Dùng các toán tử + và += để ghép chuỗi. Ví dụ: double distance = 45.5; System.out.println("Distance = "+ distance +" miles."); Distance = 45.5 miles. Chuỗi Chuỗi với vai trò là đối tượng Trong Java chuỗi có ba thể hiện String: bất biến StringBuffer: khả biến, multi-thread StringBuilder: khả biến, single-thread Đều là các đối tượng chứ không phải là các mảng kí tự. Khai báo và sử dụng kí tự char có độ dài 2 bytes và chứa các số nguyên không dấu. Hằng kí tự được biểu diễn trong dấu nháy đơn (’) Bạn cũng có thể nhập các kí tự đơn bằng dãy escape sequence \uxxx chỉ định thứ tự theo thập lục phân. char c = '\u0a76'; System.out.println("Char = "+ c); Lớp String Áp dụng cho các chuỗi có độ dài cố định, không đổi trong quá trình chạy. Đối tượng String không đổi được. Lệnh dựng chuỗi String public String() ; public String(String original); public String(char value[]); public String(char value[], int offset, int count); public String(int[] codePoints, int offset, int count); public String(byte bytes[], int offset, int length, String charsetName); public String(byte bytes[], int offset, int length, Charset charset); (1.6) public String(byte bytes[], String charsetName); public String(byte bytes[], Charset charset); (1.6) public String(byte bytes[], int offset, int length); public String(byte bytes[]) public String(StringBuffer buffer); public String(StringBuilder builder); public String(byte ascii[], int hibyte, int offset, int count); public String(byte ascii[], int hibyte); String Ví dụ: String s = new String(); Chú ý: Kí tự trong Java là kí tự 16bit, không phải ASCII 8 bit Các encoding (charset): các chế độ mã hóa kí tự nền được sử dụng trong hệ thống để chuyển đổi kí tự ASCII thành Unicode. VD: UTF-8, UTF-16, US-ASCII, ISO-8859-1, … Chiều dài =0 Các phương thức chuỗi String Demo: Phương thức kiểm tra lớp String length(), charAt(), getChars(..), getBytes(…), hashCode() Phương thức so sánh lớp String equals(…), equalsIgnoreCase(…), compareTo(…), compareToIgnoreCase (…), regionMatches(…), startsWith(…), endWith(…) Phương thức lập chỉ mục lớp String indexOf(…), lastIndexOf(…) Phương thức chuyển đổi lớp String substring(…), concat(…), replace(…), toLowerCase(…), toUpperCase(…), trim(), toCharArray(…), intern() Lớp StringBuffer Áp dụng cho chuỗi có độ dài khả biến, có thể thay đổi trong quá trình chạy. Đối tượng StringBuffer có thể thay đổi được Áp dụng cho đa tiến trình Lệnh dựng chuỗi StringBuffer public StringBuffer(); public StringBuffer(int capacity); public StringBuffer(String str); public StringBuffer(CharSequence seq); Các phương thức chuỗi Demo Tính dung lượng và chiều dài lớp StringBuffer: length(), capacity(), ensureCapacity(…), setLength(…) Phương thức char của StringBuffer charAt(…), getChars(…), setCharAt(…) Nối thêm lớp StringBuffer append(…) Xóa, thay thế delete(…), replace(…) Chuỗi con substring(…) Chèn lớp insert(…) Khác reverse(), toString(), readObject(…) StringBuilder Áp dụng cho các chuỗi khả biến có thể thay đổi trong quá trình chạy. Đối tượng StringBuilder có thể thay đổi được Xử lý nhanh, thay thế cho StringBuffer trong trường hợp chỉ có 1 tiến trình. Các phương thức tương tự như của StringBuffer Lớp Character Là lớp bao của char, nó cung cấp các phương thức tĩnh (static) hữu ích. Ví dụ Các kí số Character Character rất hữu ích khi: chuyển đổi kí tự thành số nguyên trong 1 cơ số. int digit = 12; char c = Character.forDigit(digit, 16); System.out.println(digit + " = " + c); char c = 'F'; int digit = Character.digit(c, 16); System.out.println(c + " = "+ digit); Các lớp số Java Nguyễn Thị Tú Mi Email: nttmi@hcmuaf.edu.vn Lớp Math Lớp Math cung cấp các phương thức hữu ích để thực hiện nhiều thao tác toán học khác nhau. Lớp Math tự động nhập vào trình ứng dụng mà không cần import. Constructor của lớp Math private Math(){} : Không thể tạo ra 1 đối tượng thuộc lớp này Các hằng và phương thức đều là static được dùng trong tham chiếu bản thân lớp mà không cần khởi tạo đối tượng. Math field Math có 2 trường tĩnh: E: cơ số của logarit tự nhiên (2.71828) PI: giá trị đại diện cho π (3.14159) Các phương thức tiện ích của Math Demo abs(); min(), max() rint(), round(), ceil(), floor() power(), IEEremainder() sqrt() sin(), cos(), tan()… random() Lớp Random Constructor Random r = new Random(); Random r = new Random(12); Các phương thức lớp Random setSeed() nextXXX() nextXXX(max) Các lớp bao bọc số Lớp bao bọc Boolean Lớp bao bọc Integer Lớp bao bọc Long Lớp bao bọc Byte Lớp bao bọc Short Lớp bao bọc Float Lớp bao bọc Double Mảng Nguyễn Thị Tú Mi Email: nttmi@hcmuaf.edu.vn Định nghĩa Mảng là một cấu trúc giữ không hoặc nhiều giá trị cùng kiểu dữ liệu. Chiều dài của mảng phải được xác định khi khởi tạo mảng và không thay đổi mảng là 1 cấu trúc fix-length Đặc điểm mảng Các phần tử trong mảng có thể là: primitive datatype reference datatype Lưu trữ và truy xuất các phần tử theo chỉ mục. Là lớp con của Object và hiện thực 2 interfaces Serializable và Cloneable. Một số đặc tính của mảng: random access linear lookup Tạo mảng Khai báo mảng Khởi tạo mảng Khởi tạo giá trị mảng type[] array_name; int[] anArray = new int[10]; int[] anArray; float[] anArrayOfFloats; boolean[] anArrayOfBooleans; Object[] anArrayOfObjects; String[] anArrayOfStrings; … new elementType[arraySize] boolean[] answers = { true, false, true}; Ví dụ String names[] = new String[3]; names[0] = "Leonardo"; names[1] = "da"; names[2] = "Vinci"; String names[] = {"Leonardo", "da", "Vinci"}; Giống nhau String names[] = new String []{"Leonardo", "da", "Vinci"}; Giống nhau Mảng các dữ liệu nguyên thủy Mảng đối tượng Thao tác trên mảng Truy xuất đến các phần tử Xác định chiều dài for (int i = 0; i < anArray.length; i++) { anArray[i] = i; System.out.print(anArray[i] + " "); } arrayname.length Ghi chú Mảng rỗng thì chiều dài của nó bằng 0, lúc này không truy xuất được các phần tử mảng. Sau khi khởi tạo, biến mảng sẽ tham chiếu tới phần tử đầu tiên trong mảng. Mảng nhiều chiều Khi mỗi phần tử trong mảng tham chiếu tới một mảng khác bạn cần tới mảng đa chiều. Chỉ cần thêm 1 cặp [] khi muốn có thêm 1 chiều int coordinates[][]; coordinates[0][0] = 2; Mảng nhiều chiều Ví dụ Ví dụ Sao chép dữ liệu trên mảng Java hỗ trợ 3 cách sao chép dữ liệu mảng Toán tử gán clone() System.arraycopy() Sao chép dữ liệu trên mảng Toán tử gán: Nhận xét: cả hai mảng cùng tham chiếu tới 1 đối tượng mảng khi thay đổi thì cả 2 cùng thay đổi Copy tham chiếu Sao chép dữ liệu trên mảng Hàm System.arraycopy(): Nhận xét: hai biến mảng tham chiếu tới 2 đối tượng mảng khác nhau Khi thay đổi trên 1 mảng sẽ không ảnh hưởng tới mảng kia Copy nội dung Sao chép dữ liệu trên mảng Hàm clone() Nhận xét: hai biến mảng tham chiếu tới 2 đối tượng mảng khác nhau Khi thay đổi trên 1 mảng sẽ không ảnh hưởng tới mảng kia Copy nội dung Sao chép dữ liệu trong mảng Hàm System.arraycopy(…) dùng để copy để copy dữ liệu từ mảng này sang mảng khác. public static void arraycopy(Object source,int srcIndex, Object dest,int destIndex, int length) Ví dụ Bài tập Lỗi gì? Mảng rải rác tam giác (Triangular Sparse Array) Mảng rải rác tam giác (Triangular Sparse Array) Các biệt lệ trên mảng Khi thao tác trên mảng có thể gặp 1 số biệt lệ sau: NegativeArraySizeException IndexOutOfBoundsException ArrayIndexOutOfBoundsException ArrayStoreException Lớp tiện ích Arrays Demo một số phương thức tiện ích trong Arrays Summary