Bài giảng Lập trình hướng đối tượng: Hiểu thêm về Java - Nguyễn Việt Hà

pdf 37 trang phuongnguyen 6540
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng: Hiểu thêm về Java - Nguyễn Việt Hà", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_lap_trinh_huong_doi_tuong_hieu_them_ve_java_nguyen.pdf

Nội dung text: Bài giảng Lập trình hướng đối tượng: Hiểu thêm về Java - Nguyễn Việt Hà

  1. Hiểu thêm về Java
  2. Nội dung „ Dữ liệu kiểu nguyên thủy và đối tượng „ Tham chiếu „ Giải phóng bộ nhớ „ Gói và kiểm soát truy cập „ Kiểu hợp thành (composition) „ Vào ra với luồng dữ liệu chuẩn NguyễnViệtHà Thêm về Java 2
  3. Tài liệu tham khảo „ Thinking in Java, chapter 2, 4, 5 „ Java how to program, chapter 4,5,6,7,8 NguyễnViệtHà Thêm về Java 3
  4. Kiểudữ liệu nguyên thủy „ Java cung cấpcáckiểu nguyên thủy số: byte, short, int, long, float, double „ không có khái niệm unsigned „ kích thước cố định trên mọi platform logic: boolean ký tự: char „ Dữ liệu kiểu nguyên thủy không phải là đối tượng int a = 5; if (a==b) „ Tồn tại lớp đối tượng tương ứng: Interger, Float, Interger count = new Interger(0); NguyễnViệtHà Thêm về Java 4
  5. Kiểu Độ rộng Giá trị cực tiểu Giá trị cực đại dữ liệu (bits) char 16 0x0 0xffff byte 8 -128 (-27) +127 (27-1) short 16 -32768 (-215) 32767 (215-1) int 32 -231, 0x80000000 + 231 - 1, 0x7fffffff long 64 -263 + 263 -1 float 32 1.40129846432481707e-45 3.40282346638528860e+38 double 64 4.94065645841246544e-324 1.79769313486231570e+308 boolean NguyễnViệtHà Thêm về Java 5
  6. Dữ liệu đượclưu trữởđâu „ Dữ liệu kiểu nguyên thủy thao tác thông qua tên biến „ Dữ liệu là thuộc tính của đối tượng Đối tượng được thao tác thông qua tham chiếu „ Vậy biến kiểu nguyên thủy, tham chiếu và đối tượng được lưu trữở đâu? NguyễnViệtHà Thêm về Java 6
  7. 3 vùng bộ nhớ cho ứng dụng code static memory static data constants temporary stack memory data dynamic data heap memory NguyễnViệtHà Thêm về Java 7
  8. Tham chiếu „ Đối tượng được thao tác thông qua tham chiếu là con trỏ tới đối tượng thao tác trực tiếp tới thuộc tính và phương thức không có các toán tử con trỏ phép gán (=) không phải là phép toán copy nội dung đối tượng „ tham chiếu được lưu trữ trong vùng nhớ static/stack như các con trỏ trong C/C++ NguyễnViệtHà Thêm về Java 8
  9. Toán tử New „ Phải tạo mọi đối tượng một cách tường minh bằng toán tử new cấp phát vùng nhớ động được tạo trong bộ nhớ Heap „ Ví dụ: MyDate d; MyDate birthday; d = new MyDate(); NguyễnViệtHà Thêm về Java 9
  10. Phép gán “=” „ Phép gán không phải là copy thông thường copy nội dung của tham chiếu hai tham chiếu sẽ tham chiếu đến cùng đối tượng Integer m = new Integer(10); Integer n = new Integer(20); m = n; n.setValue(50); System.out.print(m); NguyễnViệtHà Thêm về Java 10
  11. “New” và “=” MyDate d; new operation MyDate birthday; d = new MyDate(26,9,2005); birthday = d; assign operation Static/Stack memory Heap memory d 26-9-2005 birthday NguyễnViệtHà Thêm về Java 11
  12. Toán tử quan hệ “==” „ So sánh nội dung của các dữ liệu kiểu nguyên thủy (int, long, float, ) „ So sánh nội dung của tham chiếu chứ không so sánh nội dung của đối tượng do tham chiếu trỏ đến Integer n1 = new Integer(47); Integer n2 = new Integer(47); System.out.println(n1 == n2); System.out.println(n1 != n2); false true NguyễnViệtHà Thêm về Java 12
  13. So sánh nội dung đốitượng class MyDate { boolean equalTo(MyDate d) { } } MyDate d1 = new MyDate(10,10,1954); MyDate d2 = new MyDate(d1); System.out.println(d1.equalTo(d2)); NguyễnViệtHà Thêm về Java 13
  14. Giải phóng bộ nhớ động (Garbage collection) „ Lập trình viên không cần phải giải phóng đối tượng „ JVM cài đặt cơ chế “Garbage collection” để giải phóng tự động các đối tượng không còn cần thiết tuy nhiên, GC không nhất thiết hoạt động với mọi đối tượng „ GC tăng tốc độ phát triển và tăng tính ổn định của ứng dụng Không phải viết mã giải phóng đối tượng Do đó, không bao giờ quên giải phóng đối tượng NguyễnViệtHà Thêm về Java 14
  15. GC hoạt động như thế nào „ Sử dụng cơ chế đếm? mỗi đối tượng có một số đếm các tham chiếu trỏ tới giải phóng đối tượng khi số đếm = 0 „ Giải phóng các đối tượng chết kiểm tra tất cả các tham chiếu đánh dấu các đối tượng còn được tham chiếu giải phóng các đối tượng không được tham chiếu NguyễnViệtHà Thêm về Java 15
  16. Garbage Collection MyDate openDate = new MyDate(1,10,2005); MyDate startDate = new MyDate(10,10,2005); openDate = startDate; released automatically openDate X 1-10-2005 startDate 10-10-2005 NguyễnViệtHà Thêm về Java 16
  17. Truyền tham số và nhậngiátrị trả lại „ Truyền giá trị đối với dữ liệu kiểu nguyên thủy giá trị của tham số (RValue) được copy lên stack có thể truyền hằng số (vd: 10, 0.5, ) „ Truyền tham chiếu đốivới đốitượng nội dung của tham chiếu (LValue) được copy lên stack NguyễnViệtHà Thêm về Java 17
  18. Truyền tham số trị class MyDate { public boolean setYear(int y) { } public int getYear() { return year; } } MyDate d = new MyDate(); d.setYear(1975); int y = d.getYear(); NguyễnViệtHà Thêm về Java 18
  19. Truyền tham chiếu class MyDate { int year, month, day; public MyDate(int y, int m, int d) { year = y; month = m; day = d; } public void copy(MyDate d) { d.year = year; d.month = month; d.day = day; } public MyDate copy() { return new MyDate(day, month, year); } } NguyễnViệtHà Thêm về Java 19
  20. Truyền tham chiếu MyDate d1 = MyDate(2005, 9, 26); MyDate d2 = MyDate(2000, 1, 1); d1.copy(d2); MyDate d3; d3 = d1.copy(); NguyễnViệtHà Thêm về Java 20
  21. Tham chiếu this „ Java cung cấp tham chiếu this để trỏ tới chính đốitượng đang hoạt động „ this đượcsử dụng vào các mục đích như tham chiếutường minh đếnthuộc tính và phương thứccủa đối tượng truyền tham số và trả lại giá trị dùng để gọi constructor NguyễnViệtHà Thêm về Java 21
  22. this làm giá trị trả lại class Counter { private int c = 0; public Counter increase() { c++; return this; } public int getValue() { return c; } } Counter c = new Counter(); System.out.println(c.increase().increase().getValue()); NguyễnViệtHà Thêm về Java 22
  23. this làm tham số class Document { Viewer vi; Document(Viewer v) { vi = v; } void display() { v.display(this); } } NguyễnViệtHà Thêm về Java 23
  24. Gọi constructor bằng this class MyDate { private int year, month, day; public MyDate(int y, int m, int d) { } // copy constructor MyDate(MyDate d) { this(d.year, d.month, d.day); System.out.println(”copy constructor called”); } } „ Constructor chỉ được gọi bên trong một constuctor khác và chỉ được gọi một lần ở thời điểm (vị trí) đầu tiên. NguyễnViệtHà Thêm về Java 24
  25. Phương thứcvàthuộc tính static „ Có thể khai báo phương thứcvàthuộc tínhlàtĩnh (static) độclậpvới đốitượng có thể sử dụng mà không cầncóđốitượng „ Phương thứctĩnh không sử dụng đượcthuộc tính thông thường (non-static) không gọi đượccácphương thức thông thường NguyễnViệtHà Thêm về Java 25
  26. Gói các lớp đối tượng (package) „ Các lớp đốitượng được chia thành các gói nếu không khai báo thì các lớpthuộc gói default các lớp trong cùng mộttệpmãnguồn luôn thuộc cùng một gói „ Tồntạimứctruy cập package mức package là mặc định (nếu không khai báo tường minh là public hay private) các đốitượng củacáclớpthuộccùnggóicóthể truy cập đến non-private members của nhau chỉ có thể tạo (new) đốitượng củalớp được khai báo là public của gói khác NguyễnViệtHà Thêm về Java 26
  27. Hello.java: class HelloMsg { void sayHello() { System.out.println(”Hello, world!”); } } public class Hello { public static void main(String[] args) { HelloMsg msg = new HelloMsg(); msg.sayHello(); } } NguyễnViệtHà Thêm về Java 27
  28. Khai báo và sử dụng package „ Khai báo gói bằng lệnh package các gói đượclưu trữ theo cấutrúccây thư mục sử dụng tham số -d để tạothư mục khi biên dịch „ Dùng lệnh import để khai báo việcsử dụng một gói đãcó NguyễnViệtHà Thêm về Java 28
  29. Đối tượng hợp thành (Composition) „ Đốitượng có thể chứacác đốitượng khác (các thuộc tính không thuộc kiểu nguyên thủy) „ Thuộc tính là tham chiếuphải đượctạora bằng new hoặc được gán cho một đốitượng đãtồntại class Person { private String name; private MyDate birthday; } NguyễnViệtHà Thêm về Java 29
  30. Get và Set thuộc tính không thuộckiểu nguyên thủy class Person { public MyDate getBirthday() { return birthday; } } Person p = new Person( ); MyDate d = p.getBirthday(); d.setYear(1900); NguyễnViệtHà Thêm về Java 30
  31. Sử dụng copy constructor class Person { private String name; private MyDate birthday; public Person(String s, MyDate d) { name = s; birthday = new MyDate(d); } public MyDate getBirthday() { return new MyDate(birthday); } public void setBirthday(MyDate d) { birthday = new MyDate(d); } } NguyễnViệtHà Thêm về Java 31
  32. Vào ra từ luồng dữ liệuchuẩn „ Luồng ra chuẩn: System.out xuất ra luồng ra chuẩn (standard output) có thể tái định hướng „ Luồng thông báo lỗi: System.err xuất ra Console (thiết bị output chuẩn) không thể tái định hướng „ Luồng dữ liệu vào chuẩn: System.in chưa sẵnsàngcho sử dụng NguyễnViệtHà Thêm về Java 32
  33. Nhập dữ liệutừ luồng vào chuẩn „ InputStream: lớp đốitượng ứng vớiluồng vào chuẩn System.in: đốitượng tương ứng chưa có phương thứcnhậpdữ liệu „ InputStreamReader: nhậpdữ liệu không thông qua buffer đọc từng ký tự (kể cả ký tự đặc biệt) „ BufferedReader: sử dụng buffer đọc từng dòng NguyễnViệtHà Thêm về Java 33
  34. Ví dụ import java.io.*; public class Echo { public static void main(String[] args) throws IOException { InputStreamReader reader; BufferedReader bufReader; reader = new InputStreamReader(System.in); bufReader = new BufferedReader(reader); String s; while( null != (s = bufReader.readLine()) System.out.println(s); } } NguyễnViệtHà Thêm về Java 34
  35. Nhập một số import java.io.*; class SimpleIO { public static void main(String args[]) throws IOException { int n; String str; str = bufReader.readLine(); Integer num = Integer.valueOf(str); n = num.intValue(); System.out.println(n); } } NguyễnViệtHà Thêm về Java 35
  36. Nhập một số import java.io.*; class SimpleIO { public static void main(String args[]) throws IOException { int n; String str; str = bufReader.readLine(); n = Integer.valueOf(str).intValue(); System.out.println(n); } } NguyễnViệtHà Thêm về Java 36
  37. Tham số dòng lệnh CmdLineParas.java: public class CmdLineParas { public static void main(String[] args) { for (int i=0; i<args.length; i++) System.out.println(args[i]); } } Ví dụ: #java CmdLineParas hello world hello world NguyễnViệtHà Thêm về Java 37