Java Bài 16: Đối Tượng (Object) & Lớp (Class)

Posted by

Được chỉnh sửa ngày 20/5/2017.

Chào mừng các bạn đã đến với bài học Java thứ 16 trong chương trình học Java của Yellow Code Books.

Với bài học hôm trước, chúng ta đã làm quen với khái niệm cơ bản về lập trình Hướng đối tượng. Khi đó chúng ta đã tiếp cận với việc thay đổi cách tư duy từ Hướng thủ tục cũ, sang Hướng đối tượng mới mẻ này. Và chắc chắn bạn đã nắm được điều cốt lõi trong tư duy Hướng đối tượng này, đó là luôn luôn lấy Đối tượng làm trọng tâm.

Vậy bài học hôm nay chúng ta sẽ cùng nhau đi sâu vào tìm hiểu cái trọng tâm đó, Đối tượng. Và đã nói đến Đối tượng thì cũng phải nói đến Lớp.

Khái Niệm Đối Tượng (Object)

Như bạn cũng đã biết ở bài học khởi đầu hôm trước, Đối tượng là các thực thể hay sự vật mà chúng ta có thể cầm nắm, hoặc có thể gọi tên được. Nghe thì có vẻ lan man, nhưng thực chất là… lan man thật. Mình nói đùa thôi, thực chất là vì Hướng đối tượng cũng là một cách tư duy mở. Tức là tùy quan niệm của bạn muốn quản lý đến Đối tượng nào mà thôi.

Ví dụ như với phần mềm quản lý việc kinh doanh xe hơi. Thì bạn chọn Xe hơi là một đối tượng để quản lý. Nhưng mình nói rằng Khách hàng cũng là một đối tượng. Và Hóa đơn cũng là một đối tượng nữa. Đấy, tất cả những gì xuất hiện trong một ứng dụng, mà bạn muốn chúng là một thực thể để quản lý, thì bạn cứ xem nó là một đối tượng thôi.

Ngoài ra thì nếu bạn đã chọn thực thể nào đó là đối tượng, thì đối tượng đó ắt hẳn phải có các Trạng tháiHành vi.

Trạng Thái Của Đối Tượng

Trạng thái của đối tượng nói lên các đặc thù, hay đặc trưng của đối tượng đó.

Ví dụ, khi bạn “nắm” lấy một đối tượng Xe hơi trong ứng dụng quản lý xe hơi trên đây để xem, thì sẽ thấy các trạng thái của đối tượng này như: xe này màu xanh, thuộc hãng Ford, 7 chỗ ngồi. Nhưng nếu bạn “cầm” lấy một chiếc xe khác, sẽ thấy các trạng thái khác, như: xe này màu trắng, thuộc hãng Toyota, 4 chỗ ngồi.

Bạn thấy đấy, tư duy trong lập trình theo Hướng đối tượng trông rất thực tế đúng không nào. Bạn nhớ các trạng thái này của đối tượng nhé, chúng ta sẽ cần đến nó ở các ví dụ trong các kiến thức tiếp theo bên dưới.

Hành Vi Của Đối Tượng

Khác với trạng thái là các đặc điểm của đối tượng. Thì Hành vi chính là các hành động của Đối tượng đó, hay có thể hiểu đó là các hoạt động mà đối tượng đó có trách nhiệm phải thực hiện.

Như bạn đã làm quen với ví dụ mở màn ở bài trước, khi chúng ta dần chuyển các code tính toán ở hàm main() vào cho đối tượng Hình tròn. Thì các hàm tính toán đó trở thành các hành vi của đối tượng Hình tròn này. Điều này có nghĩa là Hình tròn phải có trách nhiệm thực hiện các hành vi tính Chu vi và Diện tích hình tròn đó. Và dĩ nhiên Hình tròn không có trách nhiệm phải thực hiện các hành động tính Chu vi và Diện tích hình vuông nhé, nó sẽ thuộc về sự quản lý của đối tượng Hình vuông!!! Bạn đã hiểu rõ hơn về hành vi của từng đối tượng rồi đúng không nào.

Khái Niệm Lớp (Class)

Nếu bạn đã nắm về khái niệm Đối tượng rồi. Thì với khái niệm Lớp sẽ đơn giản hơn một tí. Lớp được xem là một khuôn mẫu để tạo ra các Đối tượng. Ngắn gọn vậy thôi đó bạn, nhưng ngắn vậy thì chẳng hiểu gì cả. Thực chất không khó lắm đâu, bạn nhất định phải phân biệt giữa Lớp và Đối tượng. Chúng ta cùng đi từ từ qua các ví dụ sau.

Ví Dụ 1: Làm Bánh

Nào chúng ta hãy quên đi kiến thức lập trình một chút, hãy bắt tay vào làm các bánh quy bơ như sau. Giả sử bạn đã biết hết các công thức làm bánh. Và mình nhờ bạn giúp mình làm ra chúng với hình trái tim như này để mình mang đi tặng “người ấy”.

123rf_70720569_mega

Nhưng bạn lại nói rằng biết công thức thì chưa đủ. Nếu muốn bạn làm chính xác các bánh có hình thù như vậy, thì hãy đưa bạn cái khuôn. Vâng, thì đây là cái khuôn, mình chuẩn bị sẵn cả rồi, nếu bạn muốn.

123rf_17560196_mega

Ví Dụ 2: Thiết Kế Các Mẫu Xe Hơi

Mình muốn các bạn đi lan man một chút qua ví dụ kế tiếp. Giả sử bạn là một họa sĩ 3D, chuyên về vẽ texture hoàn thiện hình ảnh cho xe hơi. Với yêu cầu rằng bạn hãy cho ra thành phẩm là những chiếc xe hơi với các màu như sau.

123rf_28589274_mega

Ồ tất nhiên bạn sẽ làm được thôi. Nhưng trước hết bạn yêu cầu một bản vẽ concept về mẫu xe hơi này, thì bạn mới có thể khoác lên chúng các màu sắc được chứ. Vâng mình cũng đã chuẩn bị cho bạn, concept đây.

123rf_11911548_mega

Những ví dụ trên đây mang lại một thông điệp gì. Mình muốn các bạn hình dung từ thực tế rằng, các Đối tượng mà chúng ta cần quan tâm đến từ các ví dụ này chính là những thứ hữu hình có thể nhìn thấy hay tương tác được từ phía người dùng. Như mỗi thành phẩm bánh quy bơ ở ví dụ 1 là một Đối tượng riêng biệt. Hay mỗi thành phẩm xe hơi với từng màu sắc khác nhau ở ví dụ 2 cũng là một Đối tượng riêng biệt.

Vậy thì những khuôn mẫu để tạo nên các thành phẩm đó, như cái khuôn hình trái tim, hay concept xe hơi, chính là Lớp mà chúng ta cần phải tìm hiểu.

Ví Dụ 3: Làm Phần Mềm Quản Lý Sinh Viên

Giờ thì không ví dụ lan man nữa. Chúng ta quay về lĩnh vực lập trình với ví dụ về quản lý Sinh viên. Giả sử trong ngôi trường mà chúng ta cần quản lý có các Sinh viên sau.

students

Áp dụng từ các ví dụ 1 và 2 đi nào. Sinh viên chắc chắn là đối tượng cần quản lý rồi. Vậy đâu sẽ là khuôn mẫu cho các đối tượng Sinh viên này. Trong trường hợp này, cái Khuôn mẫu ấy hơi trừu tượng xíu, nó sẽ là một hình tượng chung chung với các nhãn như: Giới tính, Tên, Lớp, Tuổi, Quê quán, Chiều cao, Cân nặng. Như hình bên dưới.

human

Từ khái khuôn mẫu đó, hay ta đã biết nó là Lớp, nó sẽ giúp tạo ra nhiều Đối tượng Sinh viên khác nhau. Như John-Giới tính Nam-22 tuổi-Lớp Java-…. Hay Elly-Giới tính Nữ-21 tuổi-Lớp Android-….

Vậy bạn đã hiểu khái niệm Lớp là một khuôn mẫu để tạo ra các Đối tượng rồi đúng không nào. Và nếu như Đối tượng có các Trạng thái và Hành vi, thì Lớp cũng có các Thuộc tính và Phương thức tương ứng.

Khai Báo Lớp

Từ bài hôm trước tới giờ chúng ta chỉ lan man nói và nói. Giờ thì đến lúc code rồi. Nhưng trước khi đi vào cách thức code một Lớp, thì hãy cùng nhau đi qua phần này trước.

Hình Dung Về Lớp

Khi bạn muốn đưa một thực thể nào đó về một đối tượng để quản lý, thì bạn phải tạo khuôn mẫu cho đối tượng đó. Đó chính là Lớp. Và trước khi bắt tay vào tạo một Lớp, bạn phải hình dung Lớp đó với ba thành phần chính như biểu diễn sau.

Blank Diagram - Page 2

Cú Pháp Khai Báo Lớp

Một khi bạn đã hình dung ra một Lớp với ba thành phần như trên, thì việc biểu diễn ra thành code Java sẽ theo cú pháp sau.

class tên_lớp {
     các_thuộc_tính;
     các_phương_thức;
}

Trong đó:

class chỉ là một keyword cho biết bạn đang khai báo một Lớp.
tên_lớp là tên định danh cho Lớp đó, quy luật đặt tên cho Lớp cũng giống như quy luật đặt tên cho BiếnNhưng bạn lưu ý một tí là tên_lớp này nên viết in hoa hết từng chữ đầu của mỗi từ nhé, ví dụ như HinhTron, SinhVien, HoaDon,… để mà phân biệt với tên khi bạn khai báo một đối tượng sẽ được nói ở phần dưới đây.
các_thuộc_tínhcác_phương_thức sẽ được mình nói rõ hơn ở bài sau.

Bài Thực Hành Số 1

Bài thực hành này chúng ta sẽ tiến hành xây dựng lớp Hình tròn mà ở bài hôm trước mình có ví dụ cho các bạn xem.

Chú ý là bài thực hành này không đòi hỏi các bạn phải hiểu hết tất cả các dòng code, các bạn chỉ cần nhìn vào cấu trúc tổng quát của lớp Hình tròn như những gì mình nói đến ở bài hôm nay. Tất cả những chi tiết đắt giá của Lớp sẽ được mình nói tiếp ở các bài học sau.

Chúng ta tạm thời code vào chung với nơi đang chứa đựng hàm main(), và bên dưới hàm main() này như sau.

public static void main(String[] args) {
	// ... code gì trong này bạn đừng quan tâm
}

// Khai báo một Lớp Hình tròn
class HinhTron {
		
	// Dưới đây là các Thuộc tính
	final float PI = 3.14f;
	float r;
	float cv;
	float dt;

	// Dưới đây là các Phương thức
	void nhapBanKinh() {
		System.out.println("Hãy nhập vào Bán kính Hình tròn: ");
		Scanner scanner = new Scanner(System.in);
		r = scanner.nextFloat();
	}

	void tinhChuVi() {
		cv = 2 * PI * r;
	}

	void tinhDienTich() {
		dt = PI * r * r;
	}

	void inChuVi() {
		System.out.println("Chu vi Hình tròn: " + cv);
	}

	void inDienTich() {
		System.out.println("Diện tích Hình tròn: " + dt);
	}
}

Mình nói thêm một chút. Với khai báo một Lớp như trên thì:

tên_lớp lúc này chính là HinhTron.
các_thuộc_tính chính là các biến và hằng, bao gồm PI, r, cv, dt.
các_phương_thức chính là các hàm nhapBanKinh(), tinhChuVi(), tinhDienTich(), inChuVi(), inDienTich().

Khai Báo Và Khởi Tạo Đối Tượng

Việc khai báo một đối tượng hoàn toàn không có một cú pháp chung, nó tùy vào đặc thù từng Lớp của Đối tượng đó mà chúng ta sẽ nói cụ thể ở bài sau. Nhưng bạn nên nhớ có một điểm chung, đó là cần phải có từ khóa new trong khai báo và khởi tạo các đối tượng này.

Chúng ta hãy cùng thực hành khai báo đối tượng Hình tròn, đây chính là code của bài hôm trước.

Bài Thực Hành Số 2

Bạn hãy thử khai báo đối tượng Hình tròn bên trong hàm main() như sau.

public static void main(String[] args) {
	// Khai báo Đối tượng Hình tròn và ra lệnh cho đối tượng này thực hiện
	// các yêu cầu
	HinhTron hinhTron = new MyFirstClass(). new HinhTron();
				
	// Hình tròn tự kêu người dùng nhập Bán kính
	hinhTron.nhapBanKinh();
								
	// Hình tròn tự nó biết cách tính Chu vi
	hinhTron.tinhChuVi();
								
	// Hình tròn tự nó biết cách tính Diện tích
	hinhTron.tinhDienTich();
								
	// Hình tròn tự in kết quả ra console
	hinhTron.inChuVi();
	hinhTron.inDienTich();
}

Một lần nữa đừng chú trọng quá vào cách thức sử dụng các hàm trong một đối tượng, bạn sẽ sớm quen với Đối tượng sớm thôi.

Bạn chỉ cần chú ý một số chỗ.

– Dòng code HinhTron hinhTron = new … chính là nơi bạn khai báo một đối tượng là hinhTron. Đối tượng hinhTron này được tạo ra từ lớp HinhTron. Như bạn biết rằng bạn có thể tạo ra bao nhiêu đối tượng Hình tròn nào khác từ lớp HinhTron này (như ví dụ code ngay bên dưới đây). Thậm chí bạn có thể tạo ra Mảng các đối tượng Hình tròn mà chúng ta sẽ xem xét ở một bài khác.

HinhTron hinhTron1 = new HinhTron();
HinhTron hinhTron2 = new HinhTron();
HinhTron hinhTron3 = new HinhTron();
HinhTron hinhTron4 = new HinhTron();

– Từ khóa new như mình nói là bắt buộc khi khai báo và khởi tạo các kiểu dữ liệu đối tượng này, nó khác với khi bạn khai báo một biến ở kiểu dữ liệu nguyên thủy mà mình có nói ở bài học về biến. Theo sau từ khóa new là gì thì mình sẽ nói rõ ở bài sau nhé.
– Các dòng code còn lại là các dòng gọi đến các Thuộc tính hay các Phương thức của đối tượng đó.

Giờ đây nếu thực thi dòng code này thì bạn đã có thể tương tác với console được rồi đấy nhé.

Chúng ta có thể kết thúc bài học hôm nay ở đây. Như vậy là các bạn vừa làm quen với hai khái niệm cơ bản nhất trong lập trình Hướng đối tượng, đó là Lớp (Class)Đối tượng (Object). Và cùng nhau định nghĩa và khởi tạo đối tượng hinhTron từ lớp HinhTron để thực hành thử. Chúng ta sẽ nói sâu hơn về cấu trúc và cách sử dụng Đối tượng ở các bài học tiếp theo.

Cảm ơn bạn đã đọc các bài viết của Yellow Code Books. Bạn hãy đánh giá 5 sao nếu thấy thích bài viết, hãy comment bên dưới nếu có thắc mắc, hãy để lại địa chỉ email của bạn để nhận được thông báo mới nhất khi có bài viết mới, và nhớ chia sẻ các bài viết của Yellow Code Books đến nhiều người khác nữa nhé.

Bài Kế Tiếp

Chúng ta sẽ nói chi tiết về cách khai báo và sử dụng các Thuộc tính và Phương thức trong một Lớp.

Advertisements
Rating: 4.9/5. From 15 votes.
Please wait...

11 comments

  1. Sao lâu quá không thấy bài 17 ad ơi!
    Nhưng trước tiên cũng cảm ơn ad vì đã bỏ công sức, thời gian, và chia sẽ.

    1. Bạn ManhDN phán quá chuẩn. Mình vẫn mong muốn mang đến các bài viết gần gũi, dễ hiểu nhất có thể, giống như cách chúng ta trao đổi kiến thức hằng ngày với nhau í. Nhờ có comment của bạn mà mình biết mình vẫn đi đúng hướng. Hihi.

    1. Bạn Hiếu để ý khá tốt. Thực ra lớp HinhTron lúc bấy giờ đang là một lớp nằm trong lớp MyFirstClass. Chính vì vậy khi muốn khai báo một hình tròn, thay vì viết thoải mái hinhtron = new HinhTron(), thì hệ thống buộc phải thông qua lớp bao của nó, và thế là phải viết là hinhtron = new FirstClass().new HinhTron(). Khai báo này làm cho các bạn bị rối, nên mình có nói bạn không cần chú ý kỹ code ở phần này quá, đến khi nói về lớp lồng nhau, thì mình sẽ trình bày kỹ hơn trường hợp này.

  2. Bạn ơi chỗ khai báo một đối tượng hình tròn có bị thiếu không ấy, vì mình gõ vào giống bạn thì bị lỗi. Mò một lát, mình gõ lại như vầy thì được, bạn xem giúp mình với nhé:
    MyFirstClass my = new MyFirstClass();
    MyFirstClass.Circle circle =my.new Circle();

    1. Chào bạn ikuo. Mình có nêu code ở trong mục “Bài thực hành số 2” là như bạn nói mà:

      // Khai báo Đối tượng Hình tròn và ra lệnh cho đối tượng này thực hiện
      // các yêu cầu
      HinhTron hinhTron = new MyFirstClass(). new HinhTron();

      Bạn ikuo thử xem lại coi có đúng không nè.

Gửi phản hồi