Tiếp theo seri học lập trình Java, bài viết hôm nay chúng ta sẽ học về Đối tượng và Lớp trong Java. Java là một ngôn ngữ lập trình hướng đối tượng
Tiếp theo seri học lập trình Java, bài viết hôm nay chúng ta sẽ học về Đối tượng và Lớp trong Java.
Java là một ngôn ngữ lập trình hướng đối tượng. Vì là một ngôn ngữ có tính hướng đối tượng nên Java hỗ trợ các khái niệm cơ bản sau :
- Đa hình (Polymorphism)
- Kế thừa (Inheritance)
- Đóng gói (Encapsulation)
- Trừu tượng (Abstraction)
- Các lớp (Classes)
- Các đối tượng (Objects)
- Thực thể (Instance)
- Phương thức (Method)
Trong bài viết này, chúng ta sẽ xem xét các khái niệm – Lớp và Đối tượng.
- Đối tượng – Đối tượng có trạng thái và hành vi. Ví dụ: Một con chó có các trạng thái – màu sắc, tên, giống cũng như các hành vi – vẫy đuôi, sủa, ăn. Một đối tượng là một thể hiện của một lớp.
- Lớp – Một lớp có thể được định nghĩa là một mẫu / kế hoạch chi tiết mô tả hành vi / trạng thái mà đối tượng của loại hỗ trợ.
Mục lục [Hiện]
Đối tượng và Lớp trong Java là gì?
Đối tượng trong Java
Bây giờ chúng ta nhìn sâu vào những gì là đối tượng. Nếu chúng ta xem xét thế giới thực, chúng ta có thể tìm thấy nhiều vật thể xung quanh chúng ta, xe hơi, chó, người, v.v … Tất cả những vật thể này đều có trạng thái và hành vi.
Nếu chúng ta xem xét một con chó, thì trạng thái của nó là – tên, giống, màu sắc và hành vi là – sủa, vẫy đuôi, chạy.
Nếu bạn so sánh đối tượng phần mềm với một đối tượng trong thế giới thực, chúng có những đặc điểm rất giống nhau.
Các đối tượng phần mềm cũng có trạng thái và hành vi. Trạng thái của đối tượng phần mềm được lưu trữ trong các trường và hành vi được thể hiện thông qua các phương thức.
Vì vậy, trong phát triển phần mềm, các phương thức hoạt động trên trạng thái bên trong của một đối tượng và giao tiếp giữa các đối tượng được thực hiện thông qua các phương thức.
Các Lớp trong Java
Một Lớp là một kế hoạch chi tiết mà từ đó các đối tượng riêng lẻ được tạo ra.
Sau đây là một mẫu của một Lớp.
Thí dụ
public class Dog { String breed; int age; String color; void barking() { } void hungry() { } void sleeping() { } }
Một lớp có thể chứa bất kỳ loại biến nào sau đây.
- Biến cục bộ – Biến được định nghĩa bên trong phương thức, hàm tạo hoặc khối được gọi là biến cục bộ. Biến sẽ được khai báo và khởi tạo trong phương thức và biến sẽ bị hủy khi phương thức hoàn thành.
- Biến thực thể – Biến thực thể là các biến trong một lớp nhưng bên ngoài bất kỳ phương thức nào. Các biến này được khởi tạo khi lớp được khởi tạo. Các biến thực thể có thể được truy cập từ bên trong bất kỳ phương thức, hàm tạo hoặc các khối của lớp cụ thể đó.
- Biến lớp – Biến lớp là biến được khai báo trong một lớp, bên ngoài bất kỳ phương thức nào, với từ khóa tĩnh.
Một Lớp có thể có bất kỳ phương thức nào để truy cập giá trị của các loại phương thức khác nhau. Trong ví dụ trên, barking(), hungry() và sleeping() là các phương thức.
Sau đây là một số lưu ý quan trọng cần được thảo luận khi xem xét các lớp của ngôn ngữ Java.
Constructors (Hàm khởi tạo)
Khi thảo luận về các Lớp, một trong những chủ đề phụ quan trọng nhất sẽ là hàm khởi tạo (Constructors). Mỗi Lớp có một constructor. Nếu chúng ta không viết rõ ràng một hàm khởi tạo cho một lớp, trình biên dịch Java sẽ xây dựng một hàm tạo mặc định cho lớp đó.
Mỗi khi một đối tượng mới được tạo, ít nhất một hàm khởi tạo sẽ được gọi. Quy tắc chính của các hàm khởi tạo là chúng phải có cùng tên với lớp. Một lớp có thể có nhiều hơn một constructor.
Sau đây là một ví dụ về một hàm khởi tạo
Thí dụ
public class Puppy { public Puppy() { } public Puppy(String name) { // Đây là hàm khởi tạo có 1 tham số là name } }
Java cũng hỗ trợ các lớp Singleton nơi bạn chỉ có thể tạo một hàm khởi tạo của một lớp.
Lưu ý : Chúng ta có hai loại hàm khởi tạo khác nhau. Chúng ta sẽ thảo luận chi tiết về các hàm khởi tạo trong các bài tiếp theo
Tạo một đối tượng
Như đã đề cập trước đó, một Lớp cung cấp các bản thiết kế cho các đối tượng. Về cơ bản, một đối tượng được tạo ra từ một lớp. Trong Java, từ khóa new được sử dụng để tạo các đối tượng mới.
Có ba bước khi tạo một đối tượng từ một lớp :
- Khai báo – Một khai báo biến với một tên biến với một loại đối tượng.
- Khởi tạo – Từ khóa ‘new’ được sử dụng để tạo đối tượng.
- Khởi tạo – Từ khóa ‘new’ được theo sau bởi một lệnh gọi đến hàm tạo. Cuộc gọi này khởi tạo đối tượng mới.
Sau đây là một ví dụ về việc tạo một đối tượng
Thí dụ
public class Puppy { public Puppy(String name) { // Hàm khởi tạo này có tham số là name System.out.println("Tên truyền vào là:" + name ); } public static void main(String []args) { // Tạo một đối tượng tên là myPuppy Puppy myPuppy = new Puppy( "tommy" ); } }
Nếu chúng ta biên dịch và chạy chương trình trên, thì nó sẽ tạo ra kết quả như sau :
Output
Tên truyền vào là :tommy
Truy cập các biến và phương thức
Các biến và phương thức được truy cập thông qua các đối tượng được tạo. Để truy cập một biến đối tượng, các phương thức thì ta sẽ làm theo các bước như sau :
/* Tạo một đối tượng */ ObjectReference = new Constructor(); /* Gọi biến trong đối tượng đó */ ObjectReference.variableName; /* Gọi phương thức trong đối tượng đó */ ObjectReference.MethodName();
Thí dụ
Ví dụ này giải thích cách truy cập các biến thể hiện và các phương thức của một lớp.
public class Puppy { int puppyAge; public Puppy(String name) { // Hàm khởi tạo này có 1 tham số là name System.out.println("Tên được chọn là :" + name ); } public void setAge( int age ) { puppyAge = age; } public int getAge( ) { System.out.println("Tuổi của chú chó là :" + puppyAge ); return puppyAge; } public static void main(String []args) { /* Tạo một đối tượng */ Puppy myPuppy = new Puppy( "tommy" ); /* Gọi tới phương thức setAge */ myPuppy.setAge( 2 ); /* Gọi tới phương thức getAge */ myPuppy.getAge( ); /* Giờ chúng ta có thể truy cập tới biến puppyAge */ System.out.println("Giá trị puppyAge là :" + myPuppy.puppyAge ); } }
Nếu chúng ta biên dịch và chạy chương trình trên, thì nó sẽ tạo ra kết quả như sau –
Output
Tên được chọn là :tommy Tuổi chú chó là :2 Giá trị puppyAge là :2
Quy tắc khai báo tệp nguồn
Đây là phần cuối cùng của bài này, bây giờ chúng ta hãy xem xét các quy tắc khai báo tệp nguồn. Các quy tắc này rất cần thiết khi khai báo các lớp, nhập câu lệnh và gói câu lệnh trong tệp nguồn.
- Có thể chỉ có một lớp công khai cho mỗi tệp nguồn.
- Một tệp nguồn có thể có nhiều lớp không công khai.
- Tên lớp công khai phải là tên của tệp nguồn và thêm .java ở cuối. Ví dụ: tên lớp là lớp công khai Employe{} thì tệp nguồn phải là Employee.java.
- Nếu lớp được định nghĩa bên trong một package, thì câu lệnh package sẽ là câu lệnh đầu tiên trong tệp nguồn.
- Nếu import 1 thư viện, thì chúng phải được viết giữa câu lệnh package và khai báo lớp. Nếu không có câu lệnh package thì câu lệnh import phải là dòng đầu tiên trong tệp nguồn.
- Các câu lệnh import và package sẽ ngụ ý cho tất cả các lớp có trong tệp nguồn. Không thể khai báo các câu lệnh import và/hoặc gói khác nhau cho các lớp khác nhau trong tệp nguồn.
Mỗi lớp có một số cấp truy cập và cũng có các loại lớp khác nhau; các lớp trừu tượng (abstract classes), các lớp final (abstract classes), v.v. Chúng ta sẽ giải thích về tất cả những điều này trong bài viết sau này.
Ngoài các loại lớp được đề cập ở trên, Java còn có một số lớp đặc biệt gọi là Inner classes and Anonymous classes.
Java Package
Nói một cách đơn giản, package là một cách phân loại các lớp và giao diện. Khi phát triển các ứng dụng trong Java, hàng trăm lớp và giao diện sẽ được viết, do đó việc phân loại các lớp này là điều bắt buộc cũng như làm cho code dễ dàng quản lý hơn nhiều.
Import thư viện
Trong Java nếu bao gồm gói và tên lớp được đưa ra, thì trình biên dịch có thể dễ dàng định vị mã nguồn hoặc các lớp. Import câu lệnh là một cách đưa ra vị trí thích hợp cho trình biên dịch để tìm lớp cụ thể đó.
Ví dụ, dòng sau sẽ yêu cầu trình biên dịch tải tất cả các lớp có sẵn trong thư mục java_installation/java/io :
import java.io.*;
Ví dụ đơn giản
Chúng ta sẽ tạo ra hai lớp là Employee và EmployeeTest
Đầu tiên mở notepad và thêm mã sau đây. Hãy nhớ rằng đây là lớp Employee và lớp là lớp công khai. Bây giờ, lưu tệp nguồn này với tên Employee.java.
Lớp Employee có bốn biến đối tượng – name, age, designation và salary. Lớp này có một hàm khởi tạo được xác định rõ ràng và có truyền tham số như su
import java.io.*; public class Employee { String name; int age; String designation; double salary; // Hàm khởi tạo của class Employee public Employee(String name) { this.name = name; } // Gán empAge của Employee vào biến age public void empAge(int empAge) { age = empAge; } /* Gán empDesig vào biến designation.*/ public void empDesignation(String empDesig) { designation = empDesig; } /* Gán empsalary vào biến salary.*/ public void empSalary(double empSalary) { salary = empSalary; } /* In thông tin chi tiết của Employee đó */ public void printEmployee() { System.out.println("Name:"+ name ); System.out.println("Age:" + age ); System.out.println("Designation:" + designation ); System.out.println("Salary:" + salary); } }
Tiếp đến chúng ta sẽ tạo một lớp EmployeeTest
Lưu mã sau đây trong tệp EmployeeTest.java.
import java.io.*; public class EmployeeTest { public static void main(String args[]) { /* Create two objects using constructor */ Employee empOne = new Employee("James Smith"); Employee empTwo = new Employee("Mary Anne"); // Invoking methods for each object created empOne.empAge(26); empOne.empDesignation("Senior Software Engineer"); empOne.empSalary(1000); empOne.printEmployee(); empTwo.empAge(21); empTwo.empDesignation("Software Engineer"); empTwo.empSalary(500); empTwo.printEmployee(); } }
Bây giờ, biên dịch cả hai lớp và sau đó chạy EmployeeTest để xem kết quả như sau :
Output
C:\> javac Employee.java C:\> javac EmployeeTest.java C:\> java EmployeeTest Name:James Smith Age:26 Designation:Senior Software Engineer Salary:1000.0 Name:Mary Anne Age:21 Designation:Software Engineer Salary:500.0
Bài tiếp theo là gì?
Kết thúc bài Đối tượng và Lớp trong Java tại đây, hy vọng bạn đã hiểu được rõ hơn về chúng.
Trong bài tiếp theo, chúng ta sẽ thảo luận về các kiểu dữ liệu cơ bản trong Java và cách chúng có thể được sử dụng khi phát triển các ứng dụng Java.