Lớp và Đối tượng

ĐỐI TƯỢNG LÀ GÌ ?

-Đối tượng là một chủ thể bất kỳ nào đó.

-Các đối tượng trong thế giới thực bao gồm trạng thái và hành vi.

-Các đối tượng trong phần mềm bao gồm các biến (thuộc tính) và các phương thức (hành vi).

 

LỚP LÀ GÌ ?

– Lớp là một khuôn mẫu định nghĩa thuộc tính và phương thức chung cho tất cả các đối tượng thuộc cùng một loại.

-Đối tượng là thể hiện của một lớp và chỉ thuộc về một lớp.

-Định nghĩa một lớp mới tức là các bạn đang định nghĩa một kiểu dữ liệu mới.

-Định nghĩa lớp chúng ta cần phải chỉ ra các thuộc tính và các hành vi của lớp. Các thuộc tính được biểu diễn thông qua các biến và các hành vi được biểu diễn thông qua các phương thức.

Cú pháp tạo lớp:

[<Phạm vi truy xuất>] class <Tên lớp> [extends <Tên lớp cha>] [implements <Danh sách các giao diện phân cách bởi dấu phẩy>]{

Khai báo các biến

            Khai báo hàm khởi tạo không đối số

            Khai báo hàm khởi tạo có đối số

            Khai báo các hàm Getter/Setter

            Khai báo các hàm khác

}

<Phạm vi truy xuất> có thể là một trong ba từ khóa public, abstract hoặc final. Thông thường đại đa số các lớp được định nghĩa để có thể sử dụng lại hoặc cung cấp các phương thức cho các đối tượng khác sử dụng do đó thường được khai báo là public.

Ví dụ: Xây dựng lớp đặc tả hình chữ nhật

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.awt.Point;
public class Rect       // Khai báo lớp có tên là Rect
{
    private int x,y, width, height;    //  Các thuộc tính của lớp
    public Rect(){      //  Hàm khởi tạo
    }
    public void setLocation(int x, int y){      // Hành vi của lớp (method)
        this.x = x;
        this.y = y;
    }
    public int getCurrentX(){        // Hành vi của lớp (method)
        return this.x;
    }
    public int getCurrentY(){        // Hành vi của lớp (method)
        return this.y; 
    }
}

TẠO ĐỐI TƯỢNG

Để tạo đối tượng chúng ta có thể thực hiện một trong hai cách như sau:

  • Khai báo đối tượng theo cú pháp:

<Tên lớp><Tên đối tượng>;                     // Khai báo biến đối tượng   (1)

<Tên đối tượng> = new <Tên lớp>();      // Cấp phát bộ nhớ cho đối tượng (2)

Ở câu lệnh (1): khai báo này thực chất không cấp phát bộ nhớ cho đối tượng mà thực chất chỉ tạo ánh xạ đến đối tượng <Tên lớp>. Sau câu lệnh này đối tượng <Tên đối tượng> có giá trị null cho biết nó chưa trỏ đến một đối tượng thực tế nào.

Ở câu lệnh (2): Đối tượng <Tên đối tượng> thực sự được tạo ra. Sau câu lệnh này nó đã được cấp phát bộ nhớ.

Ví dụ: Circle circle;

            circle = new Circle();

  • Khai báo đối tượng đồng thời cấp phát bộ nhớ cho đối tượng theo cú pháp:

<Tên lớp><Tên đối tượng>  = new <Tên lớp>();

Đối với dạng thức tạo đối tượng như trên là sự kết hợp của câu lệnh (1) và câu lệnh (2) thành một câu lệnh đơn duy nhất. Và lúc này đối tượng đã thực sự được tạo ra, nghĩa là đã được cấp phát bộ  nhớ.

Ví dụ: Circle cirlce = new Circle();

TRUY XUẤT CÁC THÀNH PHẦN CỦA LỚP

  1. Khai báo và truy xuất biến

Trong một lớp biến được khai báo dưới hai dạng:

  1. Biến đối tượng: chỉ thuộc tính của đối tượng. Khi truy xuất biến dạng này chúng ta cần phải tạo đối tượng sử dụng từ khóa new.

Khai báo biến đối tượng: <Kiểu dữ liệu><Tên biến đối tượng>;

Cách truy cập biến đối tượng: <Tên đối tượng>.<Tên biến đối tượng>;

  1. Biến lớp: là biến toàn cục, là biến tĩnh được tạo lập đồng thời cùng với lớp, dùng chung cho mọi đối tượng thuộc lớp. Khi truy xuất không cần tạo đối tượng, để trao đổi thông tin của các đối tượng cùng lớp.

Cách khai báo biến lớp: static <Kiểu dữ liệu><Tên biến lớp>;

Cách truy cập biến lớp: <Tên lớp>.<Tên biến lớp>;

  1. Khai báo và truy xuất hàm
    Hàm khai báo trong định nghĩa lớp gồm có hai loại:
  2. Hàm đối tượng: hàm đối tượng được truy xuất theo cú pháp sau:

<Tên đối tượng>.<Tên hàm đối tượng>(<Danh sách tham đối>);

Ví dụ: Circle circle = new Circle();

float fCurrentX;

fCurrentX = circle.getCurrentX();

  1. Hàm lớp: thông thường một thành phần của lớp chỉ truy xuất trong sự liên kết với một đối tượng thuộc lớp của nó. Tuy nhiên, có thể tạo ra một thành phần có thể dùng độc lập không cần tham chiếu đến bất kỳ một đối tượng cụ thể nào, có thể được truy xuất trước khi một đối tượng của lớp được tạo ra bằng cách sử dụng từ khóa static. Để truy xuất hàm lớp ta thực hiện theo cú pháp sau:

<Tên lớp>.<Tên hàm>(<Danh sách tham đối>);

Ví dụ: double dValue = Math.sprt(25);

Khai báo phương thức

Cú pháp tổng quát để khai báo một phương thức như sau:

[<Phạm vi truy xuất>] [static] [abstract] [final]

<Kiểu dữ liệu><Tên phương thức> (<Danh sách tham đối>)

 [throws <Danh sách các ngoại lệ>]{

                        // Thân phương thức

}

Trong đó:

  • <Kiểu dữ liệu>: là kiểu dữ liệu do phương thức trả về. Nếu phương thức không trả về bất kỳ giá trị nào thì sử dụng từ khóa void. Các phương thức có giá trị trả về sử dụng câu lệnh với từ khóa return như sau:         return <biểu thức>;
  • static: từ khóa cho biết đây là phương thức lớp
  • abstract: từ khóa cho biết đây là phương thức trừu tượng.
  • final: Từ khóa cho biết đây là phương thức hằng.
  • <Tên phương thức >: là tên của phương thức đang cài đặt

<Danh sách tham đối>: Chứa các thông tin muốn truyền vào cho phương thức , các tham đối được phân cách bằng dấu phẩy “,”. Mỗi tham đối phải được khai báo kiểu dữ liệu của nó. Nếu không có bất kỳ tham đối nào thì cặp dấu () cũng phải được sử dụng.

Ví dụ: Sử dụng các kiến thức về lớp và đối tượng ở trên viết chương trình quản lý danh sách sinh viên thực hiện hai chức năng nhập và xuất danh sách sinh viên. Chương trình bao gồm hai lớp SinhVien và QuanLySinhVien.

Hướng dẫn:

Trước hết các bạn tạo lớp SinhVien như sau:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package pab.demo;
import java.util.Date;
/**
 *
 * @author kynangcntt.info
 */
public class SinhVien {
    private String maSV,hoTen,diaChi,sDT;
    private Date ngaySinh;
    public SinhVien() {
    }
    public SinhVien(String maSV, String hoTen, String diaChi, String sDT, Date ngaySinh) {
        this.maSV = maSV;
        this.hoTen = hoTen;
        this.diaChi = diaChi;
        this.sDT = sDT;
        this.ngaySinh = ngaySinh;
    }
    public String getMaSV() {
        return maSV;
    }
    public void setMaSV(String maSV) {
        this.maSV = maSV;
    }
    public String getHoTen() {
        return hoTen;
    }
    public void setHoTen(String hoTen) {
        this.hoTen = hoTen;
    }
    public String getDiaChi() {
        return diaChi;
    }
    public void setDiaChi(String diaChi) {
        this.diaChi = diaChi;
    }
    public String getsDT() {
        return sDT;
    }
    public void setsDT(String sDT) {
        this.sDT = sDT;
    }
    public Date getNgaySinh() {
        return ngaySinh;
    }
    public void setNgaySinh(Date ngaySinh) {
        this.ngaySinh = ngaySinh;
    }   
}

Tiếp đến các bạn tạo lớp QuanLySinhVien chứa phương thức main() như sau:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package pab.demo;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
/**
 *
 * @author khamphanctt.com.vn
 */
public class QuanLySinhVien {
    private SinhVien[] sinhViens;
    private Scanner reader;
    public QuanLySinhVien() {
        sinhViens = new SinhVien[2];
        reader = new Scanner(System.in);
    }
    
    private Date convertStringtoDatef(String ddMMyyyy){
        Date date = null;
        try {
            return new SimpleDateFormat("ddMMyyyy").parse(ddMMyyyy);
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        return date;
    }
    
    private String convertDateToString(Date d){
        return new SimpleDateFormat("dd/MM/yyyy").format(d);
    }
    
    private SinhVien taoSinhVien(){
        SinhVien sv = new SinhVien();
        System.out.println("Mã sinh viên: ");
        sv.setMaSV(reader.nextLine());
        System.out.println("Tên sinh viên: ");
        sv.setHoTen(reader.nextLine());
        System.out.println("Địa chỉ sinh viên: ");
        sv.setDiaChi(reader.nextLine());
        System.out.println("Số điện thoại sinh viên: ");
        sv.setsDT(reader.nextLine());
        System.out.println("Ngày sinh(ddMMyyyy): ");
        sv.setNgaySinh(convertStringtoDatef(reader.nextLine()));              
        return sv;
    }
    
    public void nhapSinhVien(){
        for (int i = 0; i < sinhViens.length; i++) {
            sinhViens[i]=taoSinhVien();
        }
    }
    
    private void xuatThongTinSV(SinhVien sv){
        System.out.println("Mã sinh viên: " + sv.getMaSV());
        System.out.println("Tên sinh viên: " + sv.getHoTen());
        System.out.println("Địa chỉ sinh viên: " + sv.getDiaChi());
        System.out.println("Số điện thoại sinh viên: " + sv.getsDT());
        System.out.println("Ngày sinh: " + convertDateToString(sv.getNgaySinh()));
    }
    
    public void xuatSinhVien(){
        for (int i = 0; i < sinhViens.length; i++) {
            xuatThongTinSV(sinhViens[i]);
        }
    }
    
    public static void main(String[] args) {
        QuanLySinhVien quanLySinhVien = new QuanLySinhVien();
        quanLySinhVien.nhapSinhVien();
        quanLySinhVien.xuatSinhVien();
    }    
}

 

Bài tiếp theo : Kế thừa trong Java