[Tự học lập trình Java] Bài 5: Lớp (class) và đối tượng (object) trong Java

1. Đối tượng và lớp
1.1. Lớp (class)
a. Khái niệm
    Chúng ta có thể xem lớp như một khuôn mẫu (template) của đối tượng (Object). Trong đó bao gồm dữ liệu của đối tượng (fields hay properties) và các phương thức(methods) tác động lên thành phần dữ liệu đó gọi là các phương thức của lớp. Các đối tượng được xây dựng bởi các lớp nên được gọi là các thể hiện của lớp (class instance).

b. Khai báo/định nghĩa lớp
 [access rights(tiền tố)] class <ClassName>
 {
      <kiểu dữ liệu> <field_1>;
      <kiểu dữ liệu> <field_2>;
     constructor
     method_1
     method_2
     ...
}

Trong đó:
  - class: là từ khóa của java
  - ClassName: là tên chúng ta đặt cho lớp
  - field_1, field_2: các thuộc tính, các biến, hay các thành phần dữ liệu của lớp.
  - constructor: là sự xây dựng, khởi tạo đối tượng lớp.
  - method_1, method_2: là các phương thức/hàm thể hiện các thao tác xử lý, tác động lên các thành phần dữ liệu của lớp.
  - access rights: Quyền truy xuất (public, private, protected)

Ví dụ: Khái báo lớp SinhVien

public class SinhVien{
  // khai báo các phương thức và thuộc tính
  …
}

1.2. Đối tượng (object)
  Đối tượng là sự cụ thể hóa của lớp. Đối tượng được khai báo tường mình bằng từ khóa new theo cú pháp:

   ClassName objectName = new ClassName();

Ví dụ: Khái báo đối tượng sinh vien A (A là một sinh viên cụ thể thuộc lớp SinhVien)
          SinhVien A=new SinhVien( );

2. Biến lớp và phương thức lớp
2.1. Thuộc tính - biến lớp (attribute)
   Vùng dữ liệu (fields) hay thuộc tính (properties) của lớp được khai báo bên trong lớp như sau:

class <ClassName>
 {
   // khai báo những thuộc tính của lớp
  <tiền tố> <kiểu dữ liệu> < thuộc tính>;
  //…
 }

Để xác định quyền truy xuất của các đối tượng khác đối với vùng dữ liệu của lớp người ta thường dùng 3 tiền tố sau:
- public: có thể truy xuất từ tất cả các đối tượng khác
- private: một lớp không thể truy xuất vùng private của 1 lớp khác.
- protected: vùng protected của 1 lớp chỉ cho phép bản thân lớp đó và những lớp dẫn xuất từ lớp đó truy cập đến.

Ví dụ: khai báo lớp xemay

public class xemay
{
  public String nhasx;
  public String model;
  private float chiphisx;
  protected int thoigiansx;
  // so luong so cua xe may: 3, 4 so
  protected int so;
  // sobanhxe là biến tĩnh có giá trị là 2 trong tất cả
  // các thể hiện tạo ra từ lớp xemay
  public static int sobanhxe = 2;
}

Chú giải:
  - Thuộc tính “nhasx”, “model”có thể được truy cập đến từ tất cả các đối tượng khác.
  - Thuộc tính “chiphisx” chỉ có thể truy cập được từ các đối tượng có kiểu “xemay”
  - Thuộc tính “thoigiansx”, so có thể truy cập được từ các đối tượng có kiểu “xemay” và các đối tượng của các lớp con dẫn xuất từ lớp “xemay”

Lưu ý: Thông thường để an toàn cho vùng dữ liệu của các đối tượng người ta tránh dùng tiền tố public, mà thường chọn tiền tố private để ngăn cản quyền truy cập đến vùng dữ liệu của một lớp từ các phương thức bên ngoài lớp đó.

2.2. Phương thức (method)
    Hàm hay phương thức (method) trong Java là khối lệnh thực hiện các chức năng, các hành vi xử lý của lớp lên vùng dữ liệu.

a. Khai báo phương thức:

<Tiền tố> <kiểu trả về> <Tên phương thức> (<danh sách đối số>)
{
  <khối lệnh>;
  [return];
}

Để xác định quyền truy xuất của các đối tượng khác đối với các phương thức của lớp người ta thường dùng các tiền tố sau:

- public: phương thức có thể truy cập được từ bên ngoài lớp khai báo.
- protected: có thể truy cập được từ lớp khai báo và những lớp dẫn xuất từ nó.
- private: chỉ được truy cập bên trong bản thân lớp khai báo.
- static: phương thức lớp dùng chung cho tất cả các thể hiện của lớp, có nghĩa là phương thức đó có thể được thực hiện kể cả khi không có đối tượng của lớp chứa phương thức đó.
- final: phương thức có tiền tố này không được khai báo chồng ớ các lớp dẫn xuất.
- abstract: phương thức không cần cài đặt (không có phần source code), sẽ được hiện thực trong các lớp dẫn xuất từ lớp này.
- synchoronized: dùng để ngăn các tác động của các đối tượng khác lên đối tượng đang xét trong khi đang đồng bộ hóa. Dùng trong lập trình miltithreads.

<kiểu trả về>: có thể là kiểu void, kiểu cơ sở hay một lớp.
<Tên phương thức>: đặt theo qui ước giống tên biến.
<danh sách thông số>: có thể rỗng

Lưu ý:
Thông thường trong một lớp các phương thức nên được khai báo dùng từ khóa public, khác với vùng dữ liệu thường là dùng tiền tố private vì mục đích an toàn. Những biến nằm trong một phương thức của lớp là các biến cục bộ (local) và nên được khởia tạo sau khi khai báo.

Ví dụ:
public class xemay
{
  public String nhasx;
  public String model;
  private float chiphisx;
  protected int thoigiansx;
  // so luong so cua xe may: 3, 4 so
  protected int so;
  // là biến tĩnh có giá trị là 2 trong tất cả
  // các thể hiện tạo ra từ lớp xemay
  public static int sobanhxe = 2;
  public float tinhgiaban()
  {
    return 1.5 * chiphisx;
  }
}

b. Khởi tạo một đối tượng (Constructor)
     Contructor thật ra là một loại phương thức đặc biệt của lớp. Constructor dùng gọi tự động khi khởi tạo một thể hiện của lớp, có thể dùng để khởi gán những giá trị măc định. Các constructor không có giá trị trả về, và có thể có tham số hoặc không có tham số. Constructor phải có cùng tên với lớp và được gọi đến dùng từ khóa new.

    Nếu một lớp không có constructor thì java sẽ cung cấp cho lớp một constructor mặc định (default constructor). Những thuộc tính, biến của lớp sẽ được khởi tạo bởi các giá trị mặc định (số: thường là giá trị 0, kiểu luận lý là giá trị false, kiểu đối tượng giá trị null, …)

    Lưu ý: thông thường để an toàn, dễ kiểm soát và làm chủ mã nguồn chương trình chúng ta nên khai báo một constructor cho lớp.

Ví dụ:
public class xemay
{
   //…
   public xemay()
 }

public xemay(String s_nhasx, String s_model, f_chiphisx, int i_thoigiansx, int i_so);
 {
   nhasx = s_nhasx;
   model = s_model;
   chiphisx = f_chiphisx;
   thoigiansx = i_thoigiansx;
   so = i_so;
   // hoặc
   // this.nhasx = s_nhasx;
   // this.model = s_model;
   // this.chiphisx = f_chiphisx;
   // this.thoigiansx = i_thoigiansx;
   // this.so = i_so;
}

}

c. Biến this
    Biến this là một biến ẩn tồn tại trong tất cả các lớp trong ngông ngữ java. Một class trong Java luôn tồn tại một biến this, biến this được sử dụng trong khi chạy và tham khảo đến bản thân lớp chứa nó.

Ví dụ:
<tiền tố> class A
{
   <tiền tố> int <field_1>;
   <tiền tố> String <field_2>;
   // Contructor của lớp A
  public A(int par_1, String par_2)
  {
   this.field_1 = par_1;
   this.field_2 = par_2;
  }

<tiền tố> <kiểu trả về> <method_1>()
{
  // …
}

<tiền tố> <kiểu trả về> <method_2>()
 {
   this.method_1()
   // …
  }
}

d. Khai báo chồng phương thức (overloading method)
    Việc khai báo trong một lớp nhiều phương thức có cùng tên nhưng khác tham số (khác kiểu dữ liệu, khác số lượng tham số) gọi là khai báo chồng phương thức (overloading method).

Ví dụ:
 public class xemay
 {
   // khai báo fields…
   public float tinhgiaban()
   return 2 * chiphisx;
 }

public float tinhgiaban(float huehong)
{
   return (2 * chiphisx + huehong);
 }
}

e. Đặc điểm hướng đối tượng trong java
    Hỗ trợ những nguyên tắc cơ bản của lập trình hướng đối tượng, tất cả các ngôn ngữ lập trình kể cả java đều có ba đặc điểm chung: tính đóng gói (encapsulation), tính đa hình (polymorphism), và tính kế thừa (inheritance).

3. Phương thức finalize()
    Trong java không có kiểu dữ liệu con trỏ như trong C, người lập trình không cần phải quá bận tâm về việc cấp phát và giải phóng vùng nhớ, sẽ có một trình dọn dẹp hệ thống đảm trách việc này. Trình dọn dẹp hệ thống sẽ dọn dẹp vùng nhớ cấp phát cho các đối tượng trước khi hủy một đối tượng.

    Phương thức finalize() là một phương thức đặc biệt được cài đặt sẵn cho các lớp. Trình dọn dẹp hệ thống sẽ gọi phương thức này trước khi hủy một đối tượng. Vì vậy việc cài đặt một số thao tác giải phóng, dọn dẹp vùng nhớ đã cấp phát cho các đối tượng dữ liệu trong phương thức finalize() sẽ giúp cho người lập trình chủ động kiểm soát tốt quá trình hủy đối tượng thay vị giao cho trình dọn dẹp hệ thống tự động. Đồng thời việc cài đặt trong phương thức finalize() sẽ giúp cho bộ nhớ được giải phóng tốt hơn, góp phần cải tiến tốc độ chương trình.

Ví dụ:
class A
 {
   // Khai báo các thuộc tính
   public void method_1()
  {
     //…
   }
   protected void finalize()
  {
    // Có thể dùng để đóng tất cả các kết nối
    // vào cơ sở dữ liệu trước khi hủy đối tượng.
    //…
   }
}

4.Gói (packages)
   Việc đóng gói các lớp lại tạo thành một thư viện dùng chung gọi là package. Một package có thể chứa một hay nhiều lớp bên trong, đồng thời cũng có thể chứa một package khác bên trong.

   Để khai báo một lớp thuộc một gói nào đấy ta phải dùng từ khóa package. Dòng khai báo gói phải là dòng đầu tiên trong tập tin khai báo lớp. Các tập tin khai báo lớp trong cùng một gói phải được lưu trong cùng một thư mục.

Lưu ý: Việc khai báo import tất cả các lớp trong gói sẽ làm tốn bộ nhớ. Thông thường chúng ta chỉ nên import những lớp cần dùng trong chương trình.

Ví dụ:
package phuongtiengiaothong;
class xemay
{
  // …
 }

class xega extends xemay
{
   //…
}

Khi đó muốn sử dụng lớp xemay vào chương trình ta sẽ khai báo như sau:

import phuongtiengiaothong.xemay;

5. Đóng gói (encapsulation)
     Cơ chế đóng gói trong lập trình hướng đối tượng giúp cho các đối tượng dấu đi một phần các chi tiết cài đặt, cũng như phần dữ liệu cục bộ của nó, và chỉ công bố ra ngoài những gì cần công bố để trao đổi với các đối tượng khác. Hay chúng ta có thể nói đối tượng là một thành tố hỗ trợ tính đóng gói.

    Đơn vị đóng gói cơ bản của ngôn ngữ java là class. Một class định nghĩa hình thức của một đối tượng. Một class định rõ những thành phần dữ liệu và các đoạn mã cài đặt các thao tác xử lý trên các đối tượng dữ liệu đó. Java dùng class để xây dựng những đối tượng. Những đối tượng là những thể hiện (instances) của một class.

    Một lớp bao gồm thành phần dữ liệu và thành phần xử lý. Thành phần dữ liệu của một lớp thường bao gồm các biến thành viên và các biến thể hiện của lớp. Thành phần xử lý là các thao tác trên các thành phần dữ liệu, thường trong java người gọi là phương thức. Phương thức là một thuật ngữ hướng đối tượng trong java, trong C/C++ người ta thường dùng thuật ngữ là hàm.

Xem thêm các ví dụ về Class và Object tại đây

--------------------------------------------------- 
Đoc thêm các bài khác

Bài 1: Chương trình JAVA đầu tiên
Bài 2: Các kiểu dữ liệu và toán tử trong
Bài 3: Các cấu trúc điều khiển trong Java
Bài 4 : Mảng và chuỗi trong Java
Bài 5: Lớp (class) và đối tượng (object) trong Java
Bài 6:Thừa kế (Inheritance) và đa hình (Polymorphism)
Ví dụ lập trình giao diện đồ họa với Java (GUI)
Ví dụ lập trình kết nối dữ liệu với Java (JDBC)
Ví dụ về lập trình Android 

0 nhận xét:

Cảm ơn bạn đã quan tâm tới bài viết này!