Trong bài hướng dẫn tự học Java này, chúng ta sẽ tìm hiểu về các đối tượng (Object) và các lớp (Class) trong Java.
Trong kỹ thuật lập trình hướng đối tượng, chúng ta thiết kế một chương trình sử dụng các đối tượng và các lớp.
Object là gì?
Một thực thể có trạng thái và hành vi được gọi là một đối tượng (Object), ví dụ: ghế, xe đạp, bút đánh dấu, bút, bàn, xe hơi, v.v.
Nó có thể là vật lý hoặc logic (hữu hình và vô hình). Ví dụ về một đối tượng vô hình là hệ thống ngân hàng.
Một đối tượng có ba đặc điểm:
- State: Trạng thái thể hiện dữ liệu (giá trị) của một đối tượng.
- Behavior: Thể hiện hành vi (chức năng) của một đối tượng như gửi tiền, rút tiền, v.v.
- Indentity: Một danh tính đối tượng thường được triển khai thông qua một ID duy nhất. Giá trị của ID không hiển thị cho người dùng bên ngoài. Tuy nhiên, nó được JVM sử dụng nội bộ để xác định duy nhất từng đối tượng.
Ví dụ, Bút là một đối tượng. Tên của nó là “Bút Bi”, màu xanh, được gọi là trạng thái của nó. Nó được sử dụng để viết, vì vậy viết là hành vi của nó.
Một đối tượng là một thể hiện của một lớp. Một lớp là một mẫu hoặc bản thiết kế mà từ đó tạo ra các đối tượng cụ thể.
Vì vậy, một đối tượng là thể hiện (kết quả) của một lớp.
Định nghĩa đối tượng:
- Một đối tượng là một thực thể trong thế giới thực.
- Một đối tượng là một thực thể runtime.
- Đối tượng là một thực thể có trạng thái và hành vi.
- Đối tượng là một thể hiện của một lớp.
Class là gì?
Một lớp (Class) là một nhóm các đối tượng có các thuộc tính chung. Nó là một mẫu hoặc bản thiết kế mà từ đó tạo ra các đối tượng. Nó là một thực thể logic. Nó không thể là vật lý.
Một lớp trong Java có thể chứa:
- Trường (Fields)
- Phương thức (Method)
- Constructors (Hàm tạo)
- Khối (Block)
- Lớp lồng nhau (Nested class) và Interface
Cú pháp khai báo một class:
class <class_name>{
field;
method;
}
Instance Variable trong Java
Một biến được tạo bên trong lớp nhưng bên ngoài phương thức được gọi là biến thể hiện (Instance Variable).
Biến thể hiện không nhận được bộ nhớ (chiếm bộ nhớ) tại thời gian biên dịch. Nó nhận được bộ nhớ trong runtime khi một đối tượng hoặc một thể hiện được tạo.
Đó là lý do tại sao nó được gọi là một biến thể hiện.
Phương thức trong Java
Trong Java, một phương thức (method) giống như một hàm (function) được sử dụng để làm hành vi của một đối tượng.
Ưu điểm của phương thức:
- Tái sử dụng code
- Tối ưu hóa code
Từ khóa new trong Java
Từ khóa new được sử dụng để phân bổ bộ nhớ trong runtime. Tất cả các đối tượng có được bộ nhớ trong vùng nhớ Heap.
Ví dụ về Object và Class: main bên trong class
Trong ví dụ này, chúng ta đã tạo một lớp Student có hai data member là id và name. Tiếp đến, trong main chúng ta tạo đối tượng của lớp Student bằng từ khóa new và in giá trị của đối tượng.
Lưu ý: Tên class phải viết Hoa chữ cái đầu theo Quy ước đặt tên trong Lập trình Java
Ở đây, chúng ta đang tạo một phương thức main() bên trong lớp.
Tạo ra một file Student.java
// Chương trình Java hướng dẫn định nghĩa class và trường
// Tạo một class
class Student{
// Định nghĩa trường
int id;// trường (field) hoặc data member hoặc instance variables
String name;
//Tạo phương thức main bên trong class Student
public static void main(String args[]){
//Tạo một đối tượng hoặc một thể hiện
Student s1 = new Student(); // Tạo một sinh viên s1 từ class Student
//In giá trị của đối tượng
System.out.println(s1.id); // Truy cập thông qua tham chiếu
System.out.println(s1.name);
}
}
Kết quả:
0
null
Đấy là vì chúng ta mới chỉ khai báo biến chứ chưa gán giá trị. Tuy nhiên, như bạn thấy đấy, dù chưa gán giá trị nhưng mặc định của int là 0 và String là null.
Ví dụ về Object và Class: main bên ngoài class
Trong khi lập trình thực tế, chúng ta không tạo main bên trong lớp như ví dụ trên vì tuân theo chữ “S” trong Nguyên tắc SOLID: “Nguyên tắc trách nhiệm duy nhất”
Do đó, chúng ta tạo các lớp và sử dụng nó từ một lớp khác.
Chúng ta hãy xem một ví dụ đơn giản, nơi chúng ta tạo phương thức main() trong một lớp khác.
Chúng ta có thể có nhiều lớp trong các tệp Java khác nhau hoặc tạo thêm một tệp Java (nếu muốn).
Lưu ý: Một cách làm tốt nếu bạn định nghĩa nhiều lớp trong một file java, thì nên lưu tên tệp với tên lớp có phương thức main().
Ví dụ, bên dưới đây mình có một file và có lớp Student để định nghĩa các thông tin sinh viên và lớp TestStudent1 để tạo đối tượng (từ lớp Student) và in thông tin sinh viên.
Như vậy, mình sẽ đặt tên tệp là TestStudent1.java
// Chương trình Java có lớp main ở
// một class khác
// Tạo class Student
class Student{
int id;
String name;
}
// Tạo class khác là TestStudent1 chứa phương thức main
class TestStudent1{
public static void main(String args[]){
Student s1 = new Student();
System.out.println(s1.id);
System.out.println(s1.name);
}
}
Kết quả:
0
null
3 Cách để khởi tạo đối tượng trong Java
Có 3 cách để khởi tạo một đối tượng trong Java:
- Khởi tạo đối tượng bằng biến tham chiếu
- Khởi tạo đối tượng bằng phương thức
- Khởi tạo đối tượng bằng Constructor
Cách #1: Khởi tạo đối tượng thông qua tham chiếu
Khởi tạo một đối tượng có nghĩa là lưu trữ dữ liệu vào đối tượng. Chúng ta hãy xem một ví dụ đơn giản nơi chúng ta sẽ khởi tạo đối tượng thông qua một biến tham chiếu.
File: TestStudent2.java
class Student{
int id;
String name;
}
class TestStudent2{
public static void main(String args[]){
Student s1 = new Student();
s1.id = 17;
s1.name = "Hải";
System.out.println(s1.id+" "+s1.name);// In thông tin với 1 khoảng trắng
}
}
Kết quả:
17 Hải
Chúng ta cũng có thể tạo nhiều đối tượng và lưu trữ thông tin trong đó thông qua biến tham chiếu.
File: TestStudent3.java
class Student{
int id;
String name;
}
class TestStudent3{
public static void main(String args[]){
// Tạo đối tượng
Student s1 = new Student();
Student s2 = new Student();
// Khởi tạo đối tượng
s1.id = 17;
s1.name = "Hải";
s2.id = 18;
s2.name = "Doanh";
// In thông tin
System.out.println(s1.id+" "+s1.name);
System.out.println(s2.id+" "+s2.name);
}
}
Kết quả:
17 Hải
18 Doanh
Cách #2: Khởi tạo đối tượng thông qua phương thức
Trong ví dụ này, chúng ta đang tạo hai đối tượng của lớp Student và khởi tạo giá trị cho các đối tượng này bằng cách gọi phương thức insertRecord().
Ở đây, chúng tôi đang hiển thị trạng thái (dữ liệu) của các đối tượng bằng cách gọi phương thức displayInformation().
File: TestStudent4.java
class Student{
int age;
String name;
void insertRecord(int a, String n){
age = a;
name = n;
}
void displayInformation(){
System.out.println(name+" "+age);
}
}
class TestStudent4{
public static void main(String args[]){
Student s1 = new Student();
Student s2 = new Student();
s1.insertRecord("Hải", 20);
s2.insertRecord("Doanh", 21);
s1.displayInformation();
s2.displayInformation();
}
}
Kết quả:
Hải 20
Doanh 21
Như bạn có thể thấy trong hình trên, đối tượng được bộ nhớ trong lĩnh vực bộ nhớ heap. Biến tham chiếu liên quan đến các đối tượng được phân bổ ở khu vực bộ nhớ heap.
Ở đây, các biến s1 và s2 cả hai đều là tham chiếu đề cập tới các đối tượng được phân bổ trong bộ nhớ.
Cách #3: Khởi tạo đối tượng thông qua Constructor
Chúng ta sẽ tìm hiểu về các hàm tạo (constructor )trong Java sau.
Các cách khác nhau để tạo một đối tượng trong Java là gì?
Có nhiều cách để tạo một đối tượng trong java:
- Tạo đối tượng sử dụng từ khóa new
- Tạo đối tượng sử dụng phương thức newInstance()
- Tạo đối tượng sử dụng Deserialization
- Tạo đối tượng sử dụng factory method
Chúng ta sẽ học những cách này để tạo đối tượng sau này.
Anonymous object trong Java
Ẩn danh (Anonymous) đơn giản có nghĩa là không tên. Một đối tượng không có tham chiếu được gọi là một đối tượng ẩn danh (Anonymous object). Nó chỉ có thể được sử dụng tại thời điểm tạo đối tượng.
Nếu bạn phải sử dụng một đối tượng chỉ một lần, một đối tượng ẩn danh là một cách tiếp cận tốt. Ví dụ:
new Calculation(); // anonymous object
Gọi phương thức thông qua tham chiếu:
Calculation c = new Calculation();
c.fact(5);
Gọi phương thức thông qua Anonymous object:
new Calculation().fact(5);
Chúng ta hãy xem ví dụ đầy đủ về một đối tượng ẩn danh (anonymous object) trong Java.
class Calculation{
void fact(int n){
int fact = 1;
for(int i = 1; i <= n; i++){
fact = fact*i;
}
System.out.println(n+" giai thừa là: "+fact);
}
public static void main(String args[]){
new Calculation().fact(5); // Gọi phương thức với anonymous object
}
}
Kết quả:
5 giai thừa là: 120
Tạo nhiều đối tượng chỉ bằng một loại
Chúng ta có thể tạo nhiều đối tượng theo một loại chỉ khi chúng ta làm trong trường hợp nguyên thủy.
Khởi tạo các biến nguyên thủy:
int a = 10, b = 20;
Khởi tạo các biến tham chiếu:
Rectangle r1 = new Rectangle(), r2 = new Rectangle(); //Tạo 2 đối tượng
Hãy xem ví dụ:
// Chương trình Java tính diện tích hình chữ nhật (Rectangle)
// có length là chiều dài, width là chiều rộng
class Rectangle{
int length;
int width;
void insert(int l,int w){
length = l;
width = w;
}
void calculateArea(){
System.out.println(length*width);
}
}
class TestRectangle2{
public static void main(String args[]){
Rectangle r1 = new Rectangle(),r2 = new Rectangle();
r1.insert(11,5);
r2.insert(3,15);
r1.calculateArea();
r2.calculateArea();
}
}
Kết quả:
55
45
Tổng kết
Như vậy là trong bài này các bạn đã được tìm hiểu về đối tượng (object) và lớp (class) trong Java cũng như là cách tạo đối tượng và cách khởi tạo đối tượng.
Qua các bài tiếp theo khi chúng ta tiếp tục làm việc với đối tượng và lớp các bạn sẽ dần hiểu thêm và thuần thục sử dụng đối tượng và lớp.
>> Hoặc tham gia lớp học Java offline ngay để được hướng dẫn kỹ càng nhất.
Chúc bạn học Java tốt!