Trong lập trình hướng đối tượng, **lớp** (**class**) là một chương trình-mã-khuôn mẫu có thể mở rộng được để tạo các đối tượng, cung cấp giá trị khởi tạo cho trạng thái (biến thành viên) và hiện thực của hàn vi (hàm thành viên hay phương thức). Trong nhiều ngôn ngữ, tên lớp được dùng như là tên của lớp (chính bản thân khuôn mẫu), tên của hàm tạo mặc định của lớp (một chương trình con tạo ra các đối tượng), và như kiểu của đối tượng được sinh ra bằng cách khởi tạo lớp; những khái niệm riêng lẽ này dễ dàng được kết hợp với nhau.

Khi một đối tượng được tạo ra bởi hàm tạo của lớp, đối tượng kết quả được gọi là một thực thể của lớp, và biến thành viên cụ thể của đối tượng được gọi là biến thực thể (*instance variable*), để tương phản với biến lớp (*class variable*) vốn được chia sẻ giữa các lớp.

Trong một số ngôn ngữ, lớp chỉ là tính năng khi biên dịch (lớp mới không thể được khai báo trong thời gian chạy), trong khi ở các ngôn ngữ khác lớp là công dân hạng nhất, và nói chung là các đối tượng (điển hình là kiểu `Class` hay tương tự). Ở các ngôn ngữ đó, một lớp mà tạo ra các lớp được gọi là siêu lớp (*metaclass*).

Lớp và kiểu
-----------

Trong trường hợp ngẫu nhiên, người ta thường tham khảo đến "lớp" của một đối tượng, nhưng trong nghĩa hẹp, đối tượng có *kiểu*: giao diện, kiểu của các biến thành viên, chữ kí của hàm thành viên (phương thức), và đặc tính. Đồng thời, một lớp các một hiện thực (cụ thể là hiện thực các phương thức), và có thể tạo ra đối tượng của một kiểu nhất định, với một hiện thực nhất định. Về mặt lý thuyết kiểu, lớp là một hiện thực—‌một cấu trúc dữ liệu *cụ thể* và tập hợp của các chương trình con—‌ trong khi kiểu là một giao diện. Các lớp khác nhau (cụ thể) có thể sinh ra các đối tượng có cùng kiểu (trừu tượng) (tùy thuộc vào hệ thống loại); ví dụ như, kiểu `Stack` có thể được hiện thực bởi hai lớp –  `SmallStack` (nhanh cho ngăn xếp nhỏ, nhưng khả năng mở rộng kém) và `ScalableStack` (khả năng mở rộng tốt nhưng phí tổn cao cho ngăn xếp nhỏ). Tương tự, một lớp nhất định có thể có nhiều hàm tạo khác nhau.

Kiểu thường được thể hiện bằng danh từ, ví dụ như người, địa điểm hay vật, hoặc cái gì được chỉ định, và một lớp thể hiện một hiện thực của những thứ đó. Ví dụ, một kiểu `Chuối` thể hiện đặc tính và tính năng của chuối nói chung, trong khi lớp `Chuối ACB` và `Chuối XYZ` thể hiện cách sản xuất chuối (như, nhà cung cấp chuối hay cấu trúc dữ liệu và hàm để thể hiện và vẽ trái chuối trong video game). Lớp `Chuối ACB` có thể sản xuất chuối đặc biệt: thực thể của lớp `Chuối ACB` sẽ là đối tượng có kiểu `Chuối`. Thông thường chỉ duy nhất một hiện thực của kiểu, trong trường hợp này tên lớp thường được đồng nhất với tên kiểu.

Thiết kế và hiện thực
---------------------

Lớp được tạo thành từ các phần tử cấu trúc và hành vi.  Ngôn ngữ lập trình mà bao gồm lớp như hàm tạo lập trình thường cung cấp hỗ trợ cho nhiều tính năng liên quan đến lớp, và cú pháp cần thiết.

### Cấu trúc

Kí hiệu UML cho lớp
Một lớp chứa các mô tả trường dữ liệu (*data*), hay *đặc tính* (*property*), *trường* (*field*), *thành viên dữ liệu* (*member variable*), hay *thuộc tính* (*attribute). Thường thì các trường kiểu và tên sẽ được gắn với trạng thái biến trong thời gian chạy chương trình; các biến trạng thái này thuộc về lớp hay thực thể của lớp.*

### Hành vi

Bài chi tiết: Phương thức (lập trình máy tính)

Hành vi của lớp hay thực thể của nó được định nghĩa bằng cách sử dụng phương thức. Phương thức là chương trình con với khả năng hoạt động trên đối tượng hoặc lớp.

### Khái niệm giao diện lớp

Bài chi tiết: Giao diện (điện toán)
Mỗi lớp *hiện thực* (*implement*, hay *nhận ra*) một giao diện bằng cách cung cấp cấu trúc và hành vi. Cấu trúc bao gồm dữ liệu và trạng thái, và hành vi gồm đoạn mã để diễn tả cách phương thức được hiện thực.

#### Ví dụ

### Khả năng truy cập thành viên

"thành viên riêng tư (private member)" đổi hướng tới đây. Đối với cách dùng khác, xem Private members club. Đối với and, xem Private member's bill.
Xem thêm thông tin: Che giấu thông tin
Đây là một số tập chỉ định truy cập thông dụng:

* *Riêng tư* (*private*, hay *class-private*) hạn chế quyền truy cập cho chỉ trong nội bộ lớp. Chỉ có phương thức là thành phần của cùng lớp mới có thể truy cập thanh viên *private*.
* *Được bảo vệ* (*protected*, hay *class-protected*) cho phép chính lớp đó và các lớp con của nó truy cập tới thành viên.
* *Công cộng* (*public*) có nghĩa bất cứ đoạn mã nào cũng có thể truy cập thành viên đó thông qua tên của nó.

Các mối quan hệ giữa các lớp
----------------------------

Ngoài thiết kế các lớp độc lập, ngôn ngữ lập trình còn hỗ trợ nhiều thiết kế lớp nâng cao dựa trên quan hệ giữa các lớp. Khả năng thiết kế mối quan hệ giữa các lớp thường được cung cấp là *sự hợp thành* and *sự phân cấp*.

### Sự hợp thành

### Sự phân cấp

#### Định nghĩa lớp con

Phân loại lớp
-------------

Có nhiều phân loại lớp, một số có thể trùng lắp nhau.

### Trừu tượng và cụ thể

Bài chi tiết: Loại trừu tượng
### Cục bộ và nội bộ

Trong một số ngôn ngữ, lớp có thể được định nghĩa theo tầm vực thay vì tầm vực toàn cục. Có nhiều loại lớp như vậy: **lớp nội bộ** (*inner class*) và **lớp cục bộ** (*local class*)

### Siêu lớp

Bài chi tiết: Siêu lớp
**Siêu lớp** (*metaclass*) là lớp mà thực thể của nó là lớp.

### Non-subclassable

### Mixins

### Partial

### Không khởi tạo

**Lớp không khởi tạo** (*uninstantiable class*) cho phép lập trình viên nhóm các trường và phương thức vào cùng một lớp để có thể truy xuất trong thời gian chạy mà không phải khởi tạo thực thể cho lớp đó. Thật vậy, tính năng khởi bị bị cấm đối với loại lớp này.

Ví dụ, trong C#, một lớp được đánh dấu là "tĩnh" (*static*) không thể được khởi tạo, chỉ có các thành viên tĩnh (trường, phương thức...), không có *hàm tạo thực thể*, và bị *niêm phong* (*seal*).

### Không tên

**Lớp không tên** (*unnamed class*) hay **lớp vô danh** (*anonymous class*) là lớp mà không có ràng buộc với tên hay định danh nào. Điều này tương tự như hàm có tên với hàm vô danh (*anonymous function*).

Lợi ích
-------

Lợi ích của việc tổ chức phần mềm vào các lớp đối tượng được chia thành ba loại:

* Phát triển nhanh
* Dễ bảo trì
* Sử dụng lại mã và thiết kế

Thể hiện trong thời gian chạy
-----------------------------

Xem thêm
--------

* iconCổng thông tin Lập trình máy tính

* Lập trình dựa trên lớp
* Sơ đồ lớp (UML)
* Danh sách ngôn ngữ lập trình hướng đối tượng
* Mixin
* Lập trình hướng đối tượng
* Lập trình dựa trên nguyên mẫu

Ghi chú
-------

1. ↑  Gamma và đồng nghiệp 1995, tr. 14.
2. 1 2  Bruce 2002, 2.1 Objects, classes, and object types, //books.google.com/books?id=9NGWq3K1RwUC&pg=PA18.
3. ↑  Gamma và đồng nghiệp 1995, tr. 17.
4. ↑  Gamma et al. 1995, tr. 14.Lỗi sfn: không có mục tiêu: CITEREFGamma\_et\_al.1995 (trợ giúp)
5. ↑  Booch 1994, tr. 105.
6. ↑  "Controlling Access to Members of a Class". *The Java Tutorials*. Oracle. Truy cập ngày 19 tháng 4 năm 2012.
7. ↑  Booch 1994, tr. 133-134.
8. ↑  "Static Classes and Static Class Members (C# Programming Guide)". *C# Programming Guide*. Microsoft. Truy cập ngày 8 tháng 5 năm 2012.
9. ↑  "What is an Object?". *oracle.com*. Oracle Corporation. Truy cập ngày 13 tháng 12 năm 2013.

Tham khảo
---------

* Booch, Grady (1994). *Objects and Design with Applications, Second Edition*. Benjamin/Cummings.
* Gamma; Helm; Johnson; Vlissides (1995). *Design Patterns: Elements of Reusable Object-Oriented Software*. Addison Wesley.
* Bruce, Kim B. (2002). *Foundations of Object-Oriented Languages: Types and Semantics*. Cambridge, MA: MIT Press. ISBN 978-0-262-02523-2.

Đọc thêm
--------

* Abadi; Cardelli: A Theory of Objects
* ISO/IEC 14882:2003 Programming Language C++, International standard
* Class Warfare: Classes vs. Prototypes, by Brian Foote
* Meyer, B.: "Object-oriented software construction", 2nd edition, Prentice Hall, 1997, ISBN 0-13-629155-4
* Rumbaugh et al.: "Object-oriented modeling and design", Prentice Hall, 1991, ISBN 0-13-630054-5

Liên kết ngoài
--------------

* Dias, Tiago (tháng 10 năm 2006). "Programming demo -.NET using Partial Types for better code". *Hyper/Net*. Youtube.

| * x
* t
* s
Mẫu hình lập trình |
| --- |
| Paradigm | 
* Lập trình mảng
* Lập trình hướng khía cạnh
* Lập trình dựa trên lớp
* Concatenative programming language
* Concurrent computing
* Data-structured language
* Dataflow programming
* Lập trình khai báo
* Ngôn ngữ miền chuyên biệt
* Dynamic programming language
* Esoteric programming language
* Lập trình hướng sự kiện
* Extensible programming
* Lập trình hàm
* Lập trình mệnh lệnh
* Lập trình logic
* Macro (máy tính)
* Lập trình meta
* Mẫu hình lập trình
* Object-based language
* Lập trình hướng đối tượng
* Pipeline (software)
* Lập trình thủ tục
* Lập trình dựa trên nguyên mẫu
* Reflection
* Rule-based system
* Ngôn ngữ lập trình kịch bản
* Synchronous programming language
* Template processor

 |
| Cấp độ | 
* Hợp ngữ
* Ngôn ngữ biên dịch
* Ngôn ngữ thông dịch
* Ngôn ngữ máy

* Ngôn ngữ lập trình bậc thấp
* Ngôn ngữ lập trình bậc cao
* Ngôn ngữ lập trình bậc rất cao

 |
| Có liên quan | 
* Ngôn ngữ lập trình không dựa trên tiếng Anh
* Off-side rule
* Ngôn ngữ lập trình trực quan

 |

| * x
* t
* s
Các kiểu dữ liệu |
| --- |
| Không xác định | 
* Bit
* Byte
* Trit
* Tryte
* Word
* Mảng bit

 |
| Số | 
* Độ chính xác tùy ý hay bignum
* Phức
* Thập phân
* Dấu phẩy tĩnh
* Dấu phẩy động
	+ Độ chính xác thấp
		- Minifloat
		- Bán chính xác
		- bfloat16
	+ Độ chính xác đơn
	+ Độ chính xác kép
	+ Độ chính xác bậc bốn
	+ Độ chính xác bậc tám
	+ Độ chính xác mở rộng
		- Long double
* Nguyên
	+ có dấu và không dấu
* Khoảng
* Hữu tỉ

 |
| Con trỏ | 
* Địa chỉ
	+ vật lý
	+ ảo
* Tham chiếu

 |
| Văn bản | 
* Ký tự
* Chuỗi
	+ kết thúc rỗng

 |
| Phức hợp | 
* Kiểu dữ liệu đại số
	+ tổng quát
* Mảng
* Mảng kết hợp
* Lớp
* Phụ thuộc
* Equality
* Quy nạp
* Giao
* Danh sách
* Đối tượng
	+ siêu đối tượng
* Kiểu tùy chọn
* Tích
* Bản ghi hay Struct
* Refinement
* Tập hợp
* Hợp
	+ tagged

 |
| Khác | 
* Boole
* Kiểu đáy
* Collection
* Kiểu liệt kê
* Ngoại lệ
* Kiểu hàm
* Kiểu dữ liệu mờ
* Kiểu dữ liệu đệ quy
* Đèn báo
* Stream
* Kiểu đỉnh
* Lớp kiểu
* Kiểu đơn vị
* Void

 |
| Chủ đềliên quan | 
* Kiểu dữ liệu trừu tượng
* Cấu trúc dữ liệu
* Tổng quát
* Kind
	+ siêu lớp
* Kiểu đối tượng
* Đa hình tham số
* Kiểu dữ liệu cơ bản
* Giao thức
	+ giao diện
* Đa hình dẫn xuất
* Hàm tạo kiểu
* Chuyển đổi kiểu
* Hệ thống kiểu
* Lý thuyết hình thái
* Biến

 |