Java1 - Phần 6

Phần 6 - Lớp và đối tượng * Mục tiêu của bài học: - Giải thích quá trình tạo lớp trong Java - Giải thích sự thể hiện của đối tượng trong Java - Giải thích về mục đích của biến thể hiện và phương thức thể hiện - Giải thích về hàm tạo trong Java - Tìm hiểu về quản lý bộ nhớ trong Java - Giải thích về bộ khởi tạo đối tượng * Giới thiệu: - Lớp trong Java: + Là đơn vị thực thi cơ bản của lập trình hướng đối tượng trong Java. + Là một cấu trúc logic để định nghĩa hình dạng và tính chất của đối tượng + Được định nghĩa như một kiểu dữ liệu mới và được dùng để tạo đối tượng có kiểu của chính nó. + Dùng để định nghĩa các thuộc tính hay còn gọi là trường để thể hiện trạng thái của đối tượng. + Việc định nghĩa một lớp sẽ không chiếm bất kỳ vùng nhớ nào. + Những lưu ý về việc đặt tên cho lớp: . Trước tên lớp là từ khoá class . Tên lớp nên là một danh từ . Nên bắt đầu bằng chữ in hoa đầu mỗi từ trong tên lớp. . Tên lớp nên đơn giản, có tính mô tả, có ý nghĩa. . Tên lớp không được trùng từ khoá Java . Tên lớp không được bắt đầu bằng số. * Khai báo lớp: - Cú pháp: class Tên_lớp{ //Thân lớp } - Ví dụ: class Product{ //Thân lớp } * Khai báo và tạo đối tượng: - Đối tượng là những thể hiện thực tế của lớp. - Muốn tạo một đối tượng ta sử dụng từ khoá new - Khi gặp toán tử new thì: + JVM sẽ cấp phát vùng nhớ cho đối tượng. + Trả về một tham chiếu hay một địa chỉ nhớ của đối tượng được cấp phát vùng nhớ + Tham chiếu hay địa chỉ nhớ sẽ được lưu trữ trong một biến gọi là biến tham chiếu. - Cú pháp tạo một đối tượng: + Cú pháp 1: Tên_lớp Tên_đối_tượng = new Tên_lớp(); , trong đó, Tên_đối_tượng chính là biến chứa tham chiếu của đối tượng. - Ví dụ: Product p = new Product(); , trong đó, vế bên phải của biểu thức là new Product() sẽ cấp phát vùng nhớ khi thực thi chương trình, và sau khi vùng nhớ được cấp phát thì nó sẽ trả về tham chiếu hay địa chỉ của đối tượng được cấp phát cho biến p. + Cú pháp 2: Tên_lớp Tên_đối_tượng; Tên_đối_tượng = new Tên_lớp(); * Các thành phần của một lớp: - Một lớp thường có hai thành phần là Trường (hay biến thể hiện) và Phương thức (hay phương thức thể hiện). - Trường: + Dùng để lưu trữ các đặc điểm của đối tượng thể hiện của lớp. + Được khai báo nằm trong lớp và phải nằm ngoài các hàm. + Cú pháp khai báo Trường: Bổ_từ_truy_cập Kiểu_dữ_liệu Tên_Trường; + Ví dụ: class Product{ public int productId; //Đây là Trường public String productName; //Đây là Trường } + Cách truy cập Trường: Tên_đối_tượng.Tên_Trường; + Ví dụ: Product p=new Product(); p.maNhanVien; - Phương thức: + Là những hàm được khai báo trong lớp. + Có nhiệm vụ thực hiện hành vi của đối tượng thể hiện của lớp. + Cú pháp khai báo phương thức: Bổ_từ_truy_cập Kiểu_trả_về Tên_phương_thức(Khai_báo_các_đối_số_nhận_dữ_liệu){ //Thân phương thức //return Giá_trị; } , trong đó, nếu Kiểu_trả_về là void thì bỏ đi câu lệnh return Giá_trị; hoặc câu lệnh này viết lại là return; + Ví dụ: class Product{ public void listProduct(){ //Thân phương thức //return; } public void productDetail(){ //Thân phương thức //return; } } + Cách gọi một phương thức: Tên_đối_tượng.Tên_phương_thức(Danh_sách_đối_số); + Ví dụ: Product p=new Product(); p.listProduct(); * Hàm tạo: - Là phương thức có tên giống tên của lớp (class). - Dùng để khởi tạo các trường của lớp hoặc thực hiện những hành động mang tính khởi động. - Được thực thi tự động một lần duy nhất khi bạn tạo một đối tượng thể hiện của lớp. - Có hai loại hàm tạo là hàm tạo không đối số và hàm tạo có đối số. - Cú pháp: Tên_lớp(){ //Thân hàm tạo } - Ví dụ: public class Rectangle{ float width; float height; //Hàm tạo không đối sô Rectangle(){ width=0; height=0; } //Hàm tạo có đối số Rectangle(float width, float height){ this.width=width; this.height=height; } } - Thực thi hàm tạo: Như đã nói ở trên, hàm tạo được thực thi tự động mỗi khi tạo một đối tượng của lớp tương ứng. Hình dưới đây sẽ minh họa cho điều này: + Ví dụ: Rectangle Rec=new Rectangle(); //Lời gọi đến hàm tạo không đối số Rectangle Recs=new Rectangle(3,5); //Lời gọi đến hàm tạo 2 đối số. + Lưu ý: Trong trường hợp bạn không định nghĩa hàm tạo cho lớp thì JVM sẽ gọi hàm tạo ngầm định cho lớp, hàm tạo ngầm định này không có đối số và được gọi là hàm tạo mặc định, nó sẽ khởi tạo giá trị cho các trường của lớp theo giá trị mặc định tương ứng với kiểu dữ liệu được thể hiện trong bảng dưới đây: * Quản lý vùng nhớ trong Java: - Java quản lý hai loại vùng nhớ là Stack và Heap. - Stack: + Là vùng nhớ để lưu trữ các tham chiếu đối tượng và thông tin về phương thức. + Nó cũng là vùng nhớ để lưu trữ các tham đối của phương thức và biến cục bộ. - Heap: + Là vùng nhớ dành cho việc cấp phát vùng nhớ động. + Trong Java, các đối tượng được cấp phát các vùng nhớ động trên Heap khi chạy mỗi khi JVM thực thi toán tử new. + Vùng nhớ Heap sẽ tăng lên mỗi khi có một đối tượng được tạo. Vậy nên, JVM cung cấp một chương trình gọi là 'bộ dọn rác' để giải phóng vùng nhớ bằng cách huỷ những đối tượng không còn cần thiết trong chương trình Java. - Gán các tham chiếu đối tượng: + Trong Java bạn có quyền gán hai đối tượng có cùng kiểu (cùng lớp) cho nhau. Ví dụ: Rectangle rec1=new Rectangle(10,20); Rectangle rec2=new Rectangle(); rec2=rec1; , sau câu lệnh gán thì rec2 sẽ có cùng địa chỉ với rec1, điều này dẫn đến kết quả là những thay đổi của rec1 sẽ ảnh hưởng trực tiếp tới rec2 và ngược lại, ví dụ bạn gán rec1.width=100 thì kết quả là rec2.width cũng sẽ có giá trị là 100 và ngược lại. - Khái niệm về đóng gói (encapsulation) trong Java: + Trong Java cũng như những ngôn ngữ lập trình OOP khái niệm ẩn các chi tiết thực hiện của một đối tương được thực hiện bằng cách áp dụng khái niệm đóng gói. + Đóng gói là một cơ chế liên kết mã lệnh và dữ liệu với nhau trong một lớp. + Mục đích chính của việc này là để thực hiện việc che dấu dữ liệu trong lớp với những ý nghĩa là, những chi tiết thực hiện của một lớp không cần phải xuất hiện trong các lớp khác cũng như đối tượng sử dụng nó. Thay vào đó, chỉ những thông tin cần thiết mới cho xuất hiện ở những thành phần khác của ứng dụng. + Việc ẩn đi những chi tiết thực hiện về những gì là cần thiết để thực hiện các hoạt động cụ thể trong lớp sẽ làm cho việc sử dụng các hoạt động đó chở nên đơn giản đi. + Trong Java, việc đóng gói được thực hiện qua các bổ từ truy cập, các bổ từ truy cập gồm: . public: Các thành phần của một lớp nếu được khai báo là public thì có thể được truy cập ở trong lớp đó cũng như trong các lớp khác. . private: Các thành phần của một lớp được khai báo là private thì chỉ có thề được truy cập ở trong lớp đó. . protected: Các thành phần của một lớp nếu được khai báo là protected thì có thể được truy cập ở trong lớp đó, ở trong những lớp dẫn xuất từ lớp đó và ở trong những lớp thuộc cùng một package. . package (default): Áp dụng trong trường hợp các thành phần của một lớp không sử dụng bất kỳ bổ từ truy cập nào, khi đó các thành phần này có thể được truy cập ở trong lớp đó và những lớp thuộc cùng một package. * Bộ khởi tạo đối tượng: - Bản chất là đưa ra cách khởi tạo đơn giản cho các trường của lớp mà không cần xây dựng hàm tạo. - Có hai bộ khởi tạo đối tượng là bộ khởi tạo trường và khối khởi tạo trường. . Bộ khởi tạo trường: khi khao báo trường thì đồng thời bạn gán giá trị khởi tạo luôn cho trường đó. Ví dụ: class Rectangle{ float width=10; float height=20; } . Khối khởi tạo trường: sau khi khai báo xong các trường của lớp, bạn tạo một khối riêng trong đó sẽ gán giá trị khởi tạo cho các trường này. Ví dụ: class Rectangle{ float width; float height; //Khối khởi tạo trường { width=10; height=20; } }