Bài giảng Hiểu thêm về Java
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
đị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); Thêm về Java 5Nguyễn Việt Hà boolean 1.79769313486231570e+3084.94065645841246544e-32464double 3.40282346638528860e+381.40129846432481707e-4532float + 263 - 1- 26364long + 231 - 1, 0x7fffffff- 231, 0x8000000032int 32767 (215-1)-32768 (-215)16short +127 (27-1)-128 (-27)8byte 0xffff0x016char Giá trị cực đạiGiá trị cực tiểuĐộ rộng (bits) Kiểu dữ liệu Thêm về Java 6Nguyễn Việt Hà Dữ liệu được lư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? Thêm về Java 7Nguyễn Việt Hà 3 vùng bộ nhớ cho ứng dụng static memory stack memory heap memory code static data constants temporary data dynamic data Thêm về Java 8Nguyễn Việt Hà 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++ Thêm về Java 9Nguyễn Việt Hà 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(); Thêm về Java 10Nguyễn Việt Hà 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); Thêm về Java 11Nguyễn Việt Hà “New” và “=” MyDate d; MyDate birthday; d = new MyDate(26,9,2005); birthday = d; new operation assign operation d birthday Static/Stack memory 26-9-2005 Heap memory Thêm về Java 12Nguyễn Việt Hà 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 Thêm về Java 13Nguyễn Việt Hà So sánh nội dung đối tượ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)); Thêm về Java 14Nguyễn Việt Hà 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 Thêm về Java 15Nguyễn Việt Hà 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 Thêm về Java 16Nguyễn Việt Hà Garbage Collection MyDate openDate = new MyDate(1,10,2005); MyDate startDate = new MyDate(10,10,2005); openDate = startDate; openDate 1-10-2005 startDate 10-10-2005 X released automatically Thêm về Java 17Nguyễn Việt Hà Truyền tham số và nhận giá 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 đối với đối tượng nội dung của tham chiếu (LValue) được copy lên stack Thêm về Java 18Nguyễn Việt Hà 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(); Thêm về Java 19Nguyễn Việt Hà 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); } ... } Thêm về Java 20Nguyễn Việt Hà 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(); Thêm về Java 21Nguyễn Việt Hà Tham chiếu this Java cung cấp tham chiếu this để trỏ tới chính đối tượng đang hoạt động this được sử dụng vào các mục đích như tham chiếu tường minh đến thuộc tính và phương thức của đối tượng truyền tham số và trả lại giá trị dùng để gọi constructor Thêm về Java 22Nguyễn Việt Hà 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()); Thêm về Java 23Nguyễn Việt Hà this làm tham số class Document { Viewer vi; ... Document(Viewer v) { vi = v; ... } void display() { v.display(this); } ... } Thêm về Java 24Nguyễn Việt Hà 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. Thêm về Java 25Nguyễn Việt Hà Phương thức và thuộc tính static Có thể khai báo phương thức và thuộc tính là tĩnh (static) độc lập với đối tượng có thể sử dụng mà không cần có đối tượng Phương thức tĩnh không sử dụng được thuộc tính thông thường (non-static) không gọi được các phương thức thông thường Thêm về Java 26Nguyễn Việt Hà Gói các lớp đối tượng (package) Các lớp đối tượng được chia thành các gói nếu không khai báo thì các lớp thuộc gói default các lớp trong cùng một tệp mã nguồn luôn thuộc cùng một gói Tồn tại mức truy 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 đối tượng của các lớp thuộc cùng gói có thể truy cập đến non-private members của nhau chỉ có thể tạo (new) đối tượng của lớp được khai báo là public của gói khác Thêm về Java 27Nguyễn Việt Hà 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(); } } Thêm về Java 28Nguyễn Việt Hà Khai báo và sử dụng package Khai báo gói bằng lệnh package các gói được lưu trữ theo cấu trúc cây thư mục sử dụng tham số -d để tạo thư mục khi biên dịch Dùng lệnh import để khai báo việc sử dụng một gói đã có Thêm về Java 29Nguyễn Việt Hà Đối tượng hợp thành (Composition) Đối tượng có thể chứa các đối tượ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ếu phải được tạo ra bằng new hoặc được gán cho một đối tượng đã tồn tại class Person { private String name; private MyDate birthday; ... } Thêm về Java 30Nguyễn Việt Hà Get và Set thuộc tính không thuộc kiểu nguyên thủy class Person { … public MyDate getBirthday() { return birthday; } } Person p = new Person(...); MyDate d = p.getBirthday(); d.setYear(1900); Thêm về Java 31Nguyễn Việt Hà 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); } ... } Thêm về Java 32Nguyễn Việt Hà Vào ra từ luồng dữ liệu chuẩ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ẵn sàng cho sử dụng Thêm về Java 33Nguyễn Việt Hà Nhập dữ liệu từ luồng vào chuẩn InputStream: lớp đối tượng ứng với luồng vào chuẩn System.in: đối tượng tương ứng chưa có phương thức nhập dữ liệu InputStreamReader: nhập dữ 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 Thêm về Java 34Nguyễn Việt Hà 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); } } Thêm về Java 35Nguyễn Việt Hà 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); } } Thêm về Java 36Nguyễn Việt Hà 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); } } Thêm về Java 37Nguyễn Việt Hà 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
File đính kèm:
- Bài giảng Hiểu thêm về Java.pdf