Skip to content
Home » Lập Trình Hướng Đối Tượng Java | Bốn Nguyên Tắc Của Lập Trình Hướng Đối Tượng Java

Lập Trình Hướng Đối Tượng Java | Bốn Nguyên Tắc Của Lập Trình Hướng Đối Tượng Java

Lập Trình Hướng Đối Tượng (OOP Java) trong 8 PHÚT | Code Thu

Khái niệm về lập trình hướng đối tượng Java

Tự học lập trình hướng đối tượng Java

Lập trình hướng đối tượng còn được gọi là OOP-Object-Oriented Programming. Đây là một phương pháp và mô hình giúp tăng lãi suất. Làm đơn giản hóa việc bảo trì và dễ dàng mở rộng trong việc thiết kế phần mềm bởi việc cung cấp một số khái niệm như sau:

Object: Đối tượng

Class: Lớp

Inheritance: Kế thừa

Polymorphism: Đa hình

Abstraction: Trừu tượng

Encapsulation: Đóng gói

Ngoài ra, khi tự học lập trình hướng đối tượng trong Java bạn còn phải nắm được đặc điểm của 4 tính chất cơ bản sau:

Đối tượng

Đây là tất cả những thực thể có trạng thái và hành vi được biết đến như là một đối tượng. Ví dụ điển hình bạn có thể biết tới đó là bàn, ghế, bút chì,…

Lớp

Lớp là một tập hợp của các đối tượng.

Kế thừa

Một đối tượng truyền lại tất cả các thuộc tính và phương thức của đối tượng cha. Đó được gọi là tính kế thừa. Tính kế thừa nó giúp việc tái sử dụng mã nguồn tốt hơn. Và tính kế thừa nó sử dụng đa hình Runtime.

Khi bạn học lập trình hướng đối tượng Java. Bạn sẽ phải nắm được những kiến thức về kế thừa trong Java như thế nào. Bở sự liên quan giữa hai lớp với nhau. Đó là lớp cha và các lớp con. Nó có tính chất rất quan trọng trong lập trình. Tuy nhiên, nó chỉ cho phép những thành viên truy cập vào public và protected các lớp cha. Chứ nó không cho phép truy cập tới các thành viên của lớp cha.

Tính đa hình

Trong quá trình lập trình hướng đối tượng Java thì bạn cần hiểu được khái niệm của tính đa hình. Tính đa hình sẽ xuất hiện khi bạn thực hiện một hành động nào đó bằng nhiều cách khác nhau. Tính đa hình còn có tên gọi là Polymorphism. Từ này được cấu tạo từ 2 từ Hy Lạp là Poly và Morphs.Trong đó Poly có nghĩa là nhiều và Morphs có nghĩa là hình thể. Tổng hợp nghĩa của 2 từ này có nghĩa là nhiều hình thể.

Có hai kiểu đa hình trong Java. Đó là đa hình lúc phiên dịch và đa hình lúc thực thi. Cho nên bạn có thể thực hiện đa hình trong Java bằng cách nạp chồng các phương thức và ghi đè chúng lên nhau. Nếu như bạn nạp chồng những phương thức Static trong Java. Đó là một ví dụ về đa hình phiên dịch.

Khi có một nhiệm vụ nào đó được thực hiện bởi nhiều cách khác nhau. Bạn có thể xem ví dụ sau đây: Có rất nhiều cách để thuyết phục khách hàng. Để vẽ lên được một cái gì đó hình vuông hay hình chữ nhật chẳng hạn,… Trong quá trình lập trình hướng đối tượng Java bạn có thể sử dụng phương thức Overloading hoặc là Overriding.

Trừu tượng

Tính trừu tượng là sự ẩn đi của những chi tiết bên trong. Và nó hiển thị ra những chức năng, tính chất này ra thì nó được gọi là tính trừu tượng. Ví dụ như là: Khi bạn có một cuộc điện thoại không biết xử lí nội bộ như nào, khi bạn đi xe máy cũng vậy. Mà chúng ta chỉ biết những chức năng thông qua việc giao tiếp bên ngoài. Trong quá trình lập trình hướng đối tượng Java thì bạn chỉ cần áp dụng những tính chất trừu tượng bằng cách sử dụng Abstract Class và Interface.

Phương thức trừu tượng trong Java được khai báo là Abstract và nó không có trình triển khai. Thì đó được gọi là phương thức trừu tượng. Nếu như bạn không muốn có một phương thức cụ thể nào đó. Nhưng bạn lại muốn triển khai phương thức đó thì bạn có thể sử dụng các lớp con để quyết định. Hoặc là bạn có thể triển khai các phương thức đó trong lớp cha dưới dạng Abstract. Từ khóa Abstract được sử dụng dùng để khai báo một phương thức dưới dạng Abstract. Đây là một phương thức không có thân phương thức.

Tính đóng gói

Tính đóng gói là một kỹ thuật ẩn giấu thông tin liên quan và hiển thị ra thông tin liên quan. Nó có mục đích chính là đóng gói trong Java. Làm giảm thiểu mức độ phức tạp của phần mềm. Tính đóng gói cũng được sử dụng để bảo vệ trạng thái bên trong của đối tượng. Bởi nó ẩn giấu các diễn biến trạng thái của một đối tượng. Về việc chỉnh sửa đối tượng thực hiện, thì việc xác nhận được thông qua các phương thức. Hơn nữa thì việc ẩn giấu các biến thì các lớp hiển thị sẽ không thể chia sẻ thông tin cho nhau được. Điều này sẽ làm giảm đi các khối lượng khớp nối có thể có trong một ứng dụng.

Ngôn ngữ lập trình Java là một ngôn ngữ lập trình hướng đối tượng. Cho nên nó cũng có hỗ trợ các đặc tính của lập trình hướng đối tượng. Nếu như bạn có thể xem xét về thực tế thì bạn có thể thấy được rất nhiều đối tượng xung quanh mình như ô tô, chó hay là con người chẳng hạn.

Tất cả những đối tượng đó đều có thuộc tính và các hành vi riêng của bản thân. Nếu như bạn có thể xem xét một con mèo,thì thuộc tính của nó là tên, giống, màu sắc hay những hành vi như kêu, chạy, cào,… Nếu như bạn có thể so sánh những đối tượng trong phần mềm với những đối tượng trong thế giới thực, thì chúng có những đặc điểm rất giống nhau. Những thuộc tính đối tượng trong phần mềm được lưu trữ trong các trường. Và hành vi được cất giấu trong các phương thức.

Nói tới các lớp. Bạn có thể xem các lớp này như là một khuôn mẫu của các đối tượng sẵn có. Trong đó nó bao gồm các dữ liệu của các đối tượng và những phương thức tác động lên thành phần dữ liệu đó. Nó được gọi là các phương thức của lớp. Mỗi lớp thường có một hàm gọi là Constructor. Nếu như bạn không khai báo hàm này rõ ràng thì trình phiên dịch Java của bạn sẽ tạo ra một hàm Constructor mặc định cho lớp vỏ đó.

Trên đây là những kiến thức mà trong quá trình học lập trình hướng đối tượng Java mà bạn cẩn phải nắm vũng được.

Xem thêm: Khóa học lập trình Java

Java là một ngôn ngữ lập trình hướng đối tượng vì vậy nó cũng hỗ trợ các đặc tính của lập trình hướng đối tượng:

  • Đa hình (Polymorphism)
  • Thừa kế (Inheritance)
  • Đóng gói (Encapsulation)
  • Trừu tượng (Abstraction)

Đối tượng trong lập trình Java:

Nếu chúng ta xem xét thực tế chúng ta có thể tìm thấy nhiều đồ vật xung quanh chúng ta: ô tô, chó, con người, v.v… Tất cả các đối tượng này đều có thuộc tính và hành vi.

Nếu chúng ta xem xét một con chó, thuộc tính của nó sẽ là – tên, giống, màu sắc, và các hành vi là: sủa, vẫy, chạy, cắn…Nếu bạn so sánh các đối tượng trong phần mềm với một đối tượng trong thế giới thực, chúng sẽ có đặc điểm rất giống nhau: thuộc tính đối tượng trong phần mềm được lưu trữ trong trường (field) và hành vi được lưu trữ trong phương thức (method).

Class: Chúng ta có thể xem lớp như một khuôn mẫu (template) của đối tượng (Object). Trong đó bao gồm dữ liệu của đối tượng (fields hay properties) và các phương thức(methods) tác động lên thành phần dữ liệu đó gọi là các phương thức của lớp.

Ví dụ:

Cách khai báo:

class

{


;


;constructormethod_1method_2}




  • class: là từ khóa để khai báo lớp trong Java
  • ClassName: là tên chúng ta đặt cho lớp (quy tắc đặt tên: viết hoa mỗi chữ cái đầu)
  • field_1, field_2: các thuộc tính, các biến, hay các thành phần dữ liệu của lớp (quy tắc đặt tên: chữ cái đầu tiên viết thường, các chữ cái đầu tiên tiếp theo viết hoa).
  • constructor: hàm dùng để khởi tạo đối tượng lớp.
  • method_1, method_2: là các phương thức thể hiện các thao tác xử lý, tác động lên các thành phần dữ liệu của lớp.

Constructor

Mỗi lớp thường có một hàm constructor. Nếu chúng ta không khai báo hàm này rõ ràng trình biên dịch Java sẽ tạo một constructor mặc định cho lớp đó.

Mỗi lần một đối tượng mới được khởi tạo, ít nhất một constructor sẽ được gọi. Nguyên tắc chính của constructor là chúng cần 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.

Ví dụ:

Trong ví dụ trên từ khóa this nhằm chỉ đến chính lớp đang được tham chiếu đến. this.name sẽ tham chiếu đến thuộc tính name của class Student.

Khởi tạo đối tượng (Instance): trong Java để khởi tạo đối tượng chúng ta sử dụng từ khóa new

Cách thức truy cập biến và phương thức:

/* Khởi tạo đối tượng */

Object ObjectReference = new Constructor();

/* Gọi biến */

ObjectReference.variableName;

/* Gọi phương thức */

ObjectReference.MethodName();

Case Study

Kết quả in ra:

Name:James SmithAge:26Designation:Senior Software EngineerSalary:1000.0Name:Mary AnneAge:21Designation:Software EngineerSalary:500.0

Tính chất đóng gói (encapsulation)¶

Đóng gói ở đây là đóng gói các biến, method thành các class; đóng gói các class thành 1 package…\ Việc đóng gói giúp che giấu thông tin, đảm bảo sự toàn vẹn dữ liệu. Vậy nó che giấu thông tin, đảm bảo toàn vẹn dữ liệu như nào?

Ví dụ tính đóng gói mà ta hay dùng nhất đó là qua phạm vi truy cập (access modifier): public, private, protected, default

Ta có 1 class Person với các thuộc tính: name, age

public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { if (age < 0) { age = 0; } this.age = age; } }

Các thuộc tính name, age đều để private tức là không thể truy cập, chỉnh sửa dữ liệu name và age từ class bên ngoài, khi muốn thiết lập, lấy thông tin name, age ta phải thông qua các hàm get, set. các class bên ngoài sẽ không biết được name và age trong class Person lưu trữ, lấy ra như nào từ đó đảm bảo toàn vẹn dữ liêu

-Giả sử người dùng thiết lập age = -1 rõ ràng là sai vì age không thể là số âm, khi qua method set nó sẽ kiểm tra lại và gán về 0.

Ngoài sử dụng access modifier còn 1 số thể hiện của đóng gói khác như: các class immutable, đóng gói các method, các thư viện, package…

Lập Trình Hướng Đối Tượng (OOP Java) trong 8 PHÚT | Code Thu
Lập Trình Hướng Đối Tượng (OOP Java) trong 8 PHÚT | Code Thu

Cách tạo 1 chương trình OOP Java

Cùng xem qua một vấn đề thực tế và tìm cách thiết kế một lập trình phần mềm OOP Java.

Giả sử bạn đang kinh doanh một trang trại chó với hàng trăm thú cưng và bạn cần theo dõi tên, tuổi và ngày nhận nuôi thú cưng. Bạn sẽ phải thiết kế một phần mềm đơn giản và có thể tái sử dụng để mô hình hóa những chú chó này.

Nếu bạn viết từng mã riêng cho từng chú chó thì sẽ không đạt hiệu quả cao. Dưới đây, chính là một lập trình dành cho đối tượng rufus và fluffy.

//Đối tượng của con chó thứ nhất

var rufus = {

name: “Rufus”,

birthday: “2/1/2017”,

age: function() {

return Date.now() – this.birthday;

},

attendance: 0

//Đối tượng của con chó thứ hai

var fluffy = {

name: “Fluffy”,

birthday: “1/12/2019”,

age: function() {

return Date.now() – this.birthday;

},

attendance: 0

Từ lập trình này, bạn dễ dàng nhận thấy có rất nhiều mã trùng lặp nhau giữa các đối tượng. Hàm age() xuất hiện trong mỗi đối tượng.

Tôi có thể sử dụng các đối tượng và lớp thay thế bởi tôi muốn thông tin của mỗi chú chó là giống nhau. Nhóm các thông tin lại với nhau để hình thành cấu trúc lớp nhằm giúp mã code ngắn hơn và dễ bảo trì hơn.

Dưới đây là những ý tưởng về việc tổ chức lập trình hướng đối tượng OOP trong Java dành cho ví dụ nêu trên.

  • Tạo một lớp cha (parent class) dành cho tất cả chó dưới dạng một bản thiết kế thông tin và hành vi (phương thức) mà bất cứ loại chó nào đều có.
  • Tạo các lớp con (child classes) đại diện cho những danh mục con khác nhau của chó dưới dạng bản thiết kế của lớp cha.
  • Thêm các thuộc tính và hành vi duy nhất vào các lớp con để thể hiện sự khác biệt
  • Tạo các đối tượng từ lớp con đại diện cho các chú cho trong nhóm con đó

Sơ đồ dưới đây thể hiện cách thiết kế một lập trình hướng đối tượng OOP trong Java. Nhóm các dữ liệu và hành vi liên quan lại với nhau để tạo thành một mẫu đơn giản. Sau đó, tạo các nhóm con cho dữ liệu và hành vi chuyên biệt này.

Lớp Dog là một mẫu chung, chỉ chứa cấu trúc về dữ liệu và hành vi chung của tất cả các chú chó.

Sau đó, tôi tạo ra 2 lớp Dog, HerdingDog và TrackingDog. Chúng có những hành vi kế thừa của Dog (bark()) cũng như những hành vi riêng của những chú chó thuộc nhóm con đó.

Cuối cùng, tôi tạo ra các đối tượng của loại HerdingDog đại diện cho từng chú chó Fluffy và Maisel.

Bạn cũng có thể tạo ra các đối tượng như Rufus phù hợp với lớp tổng quát Dog nhưng lại không phù hợp với HerdingDog hoặc TrackingDog.

Bản thiết kế tạo hai lớp con từ lớp cha của lập trình hướng đối tượng Java

Bốn nguyên tắc của lập trình hướng đối tượng Java

Bốn nguyên tắc chính của lập trình hướng đối tượng trong Java là:

  • Kế thừa: Các lớp con kế thừa dữ liệu và hành vi từ lớp cha.
  • Đóng gói: Chứa thông tin trong một đối tượng, chỉ hiển thị thông tin được chọn.
  • Trừu tượng: Chỉ tập trung vào cái cốt lõi, quan trọng và loại bỏ những khía cạnh phức tạp, không cần thiết của đối tượng.
  • Tính đa hình: Nhiều phương thức có thể làm cùng một nhiệm vụ.

Để hiểu rõ hơn về khái niệm và lợi ích của 4 nguyên tắc trên, mời bạn theo dõi nội dung cụ thể dưới đây:

4.1 Kế thừa

Kế thừa cho phép các lớp kế thừa đặc điểm của những lớp khác. Hay nói cách khác, các lớp cha sẽ truyền các thuộc tính và hành vi cho các lớp con. Kế thừa hỗ trợ khả năng tái sử dụng.

Nếu các thuộc tính và hành vi cơ bản được định nghĩa trong lớp cha thì các lớp con sẽ được tạo ra để mở rộng chức năng của lớp cha và thêm các thuộc tính và hành vi bổ sung.

Ví dụ:

Chó cổ có khả năng chăn gia súc. Tuy nhiên, tất cả chó cổ đều là chó, nhưng không phải chó nào cũng đều là chó cổ. Để diễn tả sự khác biệt này, tôi tạo ra lớp con là HerdingDog từ lớp cha Dog và thêm hành vi riêng có herd() vào.

Lợi ích của nguyên tắc kế thừa chính là các lập trình có thể tạo ra một lớp cha chung, sau đó tạo ra nhiều lớp con cụ thể nếu cần.

Điều này giúp làm đơn giản hóa lập trình tổng thể. Bởi thay vì phải tạo nhiều cấu trúc của lớp Dog thì các lớp con sẽ tự động kế thừa các chức năng có trong lớp cha của chúng.

Trong đoạn mã trích dẫn dưới đây, lớp con HerdingDog kế thừa phương thức bark từ lớp cha. Và lớp con thêm một phương thức bổ sung herd().

//Lớp cha (Parent class)Dog

class Dog{

//Khai báo các trường được bảo vệ (private)

_attendance = 0;

constructor(namee, birthday) {

this.name = name;

this.birthday = birthday;

getAge() {

//Getter

return this.calcAge();

calcAge() {

//Tính tuổi bằng ngày và sinh nhật hôm nay

return this.calcAge();

bark() {

return console.log(“Woof!”);

updateAttendance() {

//Thêm một ngày vào số ngày tham gia của chú chó tại Trại thú cưng

this._attendance++;

//Lớp con (Child class) HerdingDog, kế thừa từ lớp cha Dog

class HerdingDog extends Dog {

constructor(name, birthday) {

super(name);

super(birthday);

herd() {

//Phương thức bổ sung cho lớp con (child class) HerdingDog

return console.log(“Stay together!”)

Tuy nhiên, lớp HerdingDog không phải là bản sao của phương thức bark(), nó chỉ kế thừa phương thức bark() được định nghĩa trong lớp cha Dog.

Khi mã gọi phương thức fluffy.bark(), phương thức bark() sẽ đi qua một chuỗi các lớp con đến các lớp cha để tìm đến nơi mà phương thức bark được định nghĩa.

//Lớp cha (Parent class)Dog

class Dog{

//Khai báo các trường được bảo vệ (private)

_attendance = 0;

constructor(namee, birthday) {

this.name = name;

this.birthday = birthday;

getAge() {

//Getter

return this.calcAge();

calcAge() {

//Tính tuổi bằng ngày và sinh nhật hôm nay

return this.calcAge();

bark() {

return console.log(“Woof!”);

updateAttendance() {

//Thêm một ngày vào số ngày tham gia của chú chó tại Trại thú cưng

this._attendance++;

//Lớp con (Child class) HerdingDog, kế thừa từ lớp cha Dog

class HerdingDog extends Dog {

constructor(name, birthday) {

super(name);

super(birthday);

herd() {

//Phương thức bổ sung cho lớp con (child class) HerdingDog

return console.log(“Stay together!”)

//Tạo một đối tượng HerdingDog mới

const fluffy = new HerdingDog(“Fluffy”, “1/12/2019”);

fluffy.bark();

Lớp cha còn được gọi là lớp siêu cấp trong khi lớp con được gọi là lớp dẫn xuất hoặc lớp mở rộng.

Trong JavaScript, kế thừa còn được gọi là tạo mẫu. Đối tượng nguyên mẫu hoạt động như là một khuôn mẫu mà các đối tượng khác kế thừa các thuộc tính và hành vi từ nó.

Đây là khái niệm tương tự như kế thừa cha/con. Kế thừa chính là sự truyền từ cha qua con. Trong ví dụ về chó, cả ba chú chó đều có thể sủa (bark) nhưng chỉ có Maisel và Fluffy có thể chăn cừu (herd).

Phương thức herd() được xác định trong lớp con HerdingDog, do đó, hai đối tượng Maisel và Fluffy, được khởi tạo từ lớp HerdingDog có quyền truy cập vào phương thức herd()

Rufus là một đối tượng được khởi tạo từ lớp cha Dog, vì vậy Rufus chỉ có quyền truy cập vào phương thức bark().

4.2 Đóng gói

Đóng gói nghĩa là chứa tất cả các thông tin quan trọng trong một đối tượng và chỉ xuất những thông tin đã được chọn ra bên ngoài. Các thuộc tính và hành vi được xác định bằng đoạn code bên trong template lớp.

Sau đó, khi một đối tượng được khởi tạo từ lớp này, dữ liệu và phương thức được đóng gói trong đối tượng đó. Đóng gói giúp giấu đi việc triển khai code phần mềm nội bộ bên trong lớp cũng như dữ liệu nội bộ của các đối tượng bên trong.

Việc đóng gói yêu cầu xác định trường nào là riêng tư và trường nào có thể công khai.

  • Giao diện riêng tư/nội bộ: Các phương thức và thuộc tính có thể truy cập từ các phương thức trong cùng một lớp.
  • Giao diện công khai/ ngoài: Các phương thức và thuộc tính có thể truy cập từ bên ngoài lớp.

Tính đóng gói giúp làm tăng mức độ bảo mật. Các thuộc tính và phương thức có thể được cài đặt ở chế độ riêng tư. Do đó, chúng không thể được truy cập từ bên ngoài lớp.

Để lấy thông tin về dữ liệu trong một đối tượng, bạn sử dụng phương thức và thuộc tính công khai để truy cập hoặc cập nhật dữ liệu.

Trong các lớp, hầu hết các ngôn ngữ lập trình đều có những phần công khai, được bảo vệ và riêng tư. Công khai nghĩa là các phương thức sẵn có có thể tiết lộ ra bên ngoài hoặc các lớp bên trong lập trình.

Bảo vệ nghĩa là chỉ được phép truy cập vào các lớp con. Còn riêng tư nghĩa là chỉ có thể được truy cập từ bên trong lớp đó.

Lưu ý: JavaScript có các thuộc tính và phương thức riêng tư và được bảo vệ. Các Trường được Bảo vệ có tiền tố là dấu _; các trường riêng tư được bắt đầu bằng dấu #. Các trường được bảo vệ thì được kế thừa còn các trường riêng tư thì không.

//Lớp cha (Parent class)Dog

class Dog{

//Khai báo các trường được bảo vệ (private)

_attendance = 0;

constructor(namee, birthday) {

this.name = name;

this.birthday = birthday;

getAge() {

//Getter

return this.calcAge();

calcAge() {

//Tính tuổi bằng ngày và sinh nhật hôm nay

return this.calcAge();

bark() {

return console.log(“Woof!”);

updateAttendance() {

//Thêm một ngày vào số ngày tham gia của chú chó tại Trại thú cưng

this._attendance++;

//Khởi tạo một phiên bản mới của lớp Dog, một chú chó tên là Rufus

const rufus = new Dog(“Rufus”, “2/1/2017”);

//Sử dụng phương thức getter để tính tuổi Rufus

rufus.getAge();

Xem xét ví dụ về phương thức getAge(), các chi tiết tính toán đều được giấu đi bên trong lớp Dog. Đối tượng rufus sử dụng phương thức getAge() để tính tuổi của Rufus

Các lợi ích của nguyên tắc đóng gói trong lập trình hướng đối tượng trong Java:

  • Tăng tính bảo mật: chỉ những phương thức và thuộc tính công khai mới được tiếp cận từ bên ngoài
  • Tránh các lỗi thường gặp: Chỉ có thể tiếp cận những trường và phương thức công khai, do đó, các developer tránh được tình trạng vô tình thay đổi những thứ quan trọng
  • Bảo vệ IP: Mã được ẩn bên trong lớp, chỉ có các phương thức công khai được tiếp cận với những developer khác
  • Mang tính hỗ trợ: Hầu hết các mã đều đã trải qua quá trình thử nghiệm và cập nhật
  • Ẩn đi những thứ phức tạp: không ai có thể nhìn thấy những thứ được ẩn phía sau các đối tượng

4.3 Trừu tượng

Trừu tượng nghĩa là người dùng chỉ tương tác với các thuộc tính và phương thức được lựa chọn của một đối tượng. Trừu tượng sử dụng các công cụ đơn giản hóa cao cấp để truy cập vào đối tượng phức tạp.

  • Sử dụng những thứ đơn giản để đại diện cho những thứ phức tạp.
  • Giấu đi những chi tiết phức tạp

Trừu tượng chính là sử dụng các lớp đơn giản để biểu diễn cho những thứ phức tạp. Trừu tượng cũng chính là sự mở rộng của tính đóng gói. Tính trừu tượng cũng đóng vai trò quan trọng trong việc bảo mật thông tin.

Bằng cách chỉ hiển thị những phần được chọn của dữ liệu và chỉ dữ liệu được cho phép mới được truy cập thông qua các lớp và được sửa đổi thông qua các phương thức. Bạn có thể bảo vệ dữ liệu không bị rò rỉ ra bên ngoài.

Những lợi ích của nguyên tắc trừu tượng:

  • Giao diện người dùng đơn giản, cao cấp
  • Các mã phức tạp được ẩn đi
  • Tăng tính bảo mật
  • Việc bảo trì phần mềm dễ dàng hơn
  • Cập nhật mã ít khi làm thay đổi tính trừu tượng.

4.4 Tính đa hình

Tính đa hình chính là việc thiết kế các đối tượng để chia sẻ các hành vi. Khi sử dụng kế thừa, các đối tượng có thể ghi đè các hành vi được cha chia sẻ lên các hành vi cụ thể của con.

Tính đa hình cho phép cùng một phương thức nhưng thực thi các hành vi khác nhau theo hai cách: phương thức ghi đè và phương thức quá tải.

Phương thức ghi đè

Tính đa hình thời gian sử dụng phương thức ghi đè. Trong phương thức ghi đè, một lớp con có thể cung cấp một cách triển khai khác với lớp cha của nó.

Xét về ví dụ chó phía trên, tôi muốn cung cấp TrackingDog cho một loại sủa cụ thể, khác với loại sủa của lớp chó chung.

Phương thức ghi đè có thể tạo ra phương thức bark() trong lớp con ghi đè phương thức bark() trong lớp cha Dog.

//Lớp cha (Parent class)Dog

class Dog{

//Khai báo các trường được bảo vệ (private)

_attendance = 0;

constructor(namee, birthday) {

this.name = name;

this.birthday = birthday;

getAge() {

//Getter

return this.calcAge();

calcAge() {

//Tính tuổi bằng ngày và sinh nhật hôm nay

return this.calcAge();

bark() {

return console.log(“Woof!”);

updateAttendance() {

//Thêm một ngày vào số ngày tham gia của chú chó tại Trại thú cưng

this._attendance++;

//Lớp con (Child class) TrackingDog, kế thừa từ lớp cha

class TrackingDog extends Dog {

constructor(name, birthday)

super(name);

super(birthday);

track() {

//Phương thức bổ sung cho lớp con TrackingDog

return console.log(“Searching…”)

bark() {

return console.log(“Found it!”);

//Khởi tạo một đối tượng mới TrackingDog

const duke = new TrackingDog(“Duke”, “1/12/2019”);

duke.bark(); //returns “Found it!”

TrackingDog’s đang đè lên phương thức the bark()

Phương thức quá tải

Đa hình thời gian biên dịch sử dụng phương thức quá tải. Các phương thức hoặc các hàm có thể có cùng tên nhưng số lượng tham số được truyền vào lệnh gọi phương thức lại khác nhau.

Có thể xảy ra các kết quả khác nhau, tùy thuộc vào số lượng tham số được truyền vào.

//Lớp cha (Parent class)Dog

class Dog{

//Khai báo các trường được bảo vệ (private)

_attendance = 0;

constructor(namee, birthday) {

this.name = name;

this.birthday = birthday;

getAge() {

//Getter

return this.calcAge();

calcAge() {

//Tính tuổi bằng ngày và sinh nhật hôm nay

return this.calcAge();

bark() {

return console.log(“Woof!”);

updateAttendance() {

//Thêm một ngày vào số ngày tham gia của chú chó tại Trại thú cưng

this._attendance++;

updateAttendance(x) {

//Thêm bội số vào số ngày tham gia của chú chó tại Trại thú cưng

this._attendance = this._attendance + x;

//Khởi tạo một phiên bản mới của lớp Dog class, một chú chó có tên Rufus

const rufus = new Dog(“Rufus”, “2/1/2017”);

rufus.updateAttendance(); //attendance = 1

rufus.updateAttendance(4); // attendance = 5

Trong ví dụ này, nếu không có tham số nào được truyền vào phương thức updateAttendance() thì số lượng tăng thêm 1 ngày.

Nếu tham số được truyền vào updateAttendance(4), và sau đó, 4 được truyền vào tham số x trong updateAttendance(x), và số lượng tăng thêm 4 ngày.

Java 28 . Lập trình hướng đối tượng là gì | Phần 2 - Lập trình Hướng Đối Tượng
Java 28 . Lập trình hướng đối tượng là gì | Phần 2 – Lập trình Hướng Đối Tượng

Lời kết

Hy vọng qua bài viết này, bạn đã có thể hiểu rõ định nghĩa lập trình hướng đối tượng Java OOP là gì?

Nhìn chung, lập trình hướng đối tượng đòi hỏi phải lên ý tưởng cấu trúc của lập trình và lên kế hoạch ngay từ khi bắt đầu viết code. Triển khai OOP Java giúp cấu trúc dữ liệu hiệu quả hơn, tăng khả năng tái sử dụng, tiết kiệm thời gian.

Lập trình hướng đối tượng Java luôn là cách được nhiều bạn tìm kiếm. Java là ngôn ngữ lập trình hướng đối tượng. Cho nên nó có rất nhiều đặc điểm của lập trình hướng đối tượng.

Nội dung

Các khối cấu thành của lập trình hướng đối tượng Java

Tiếp theo, tôi sẽ giới thiệu chi tiết về các khối cấu thành của lập trình hướng đối tượng với Java OOP được sử dụng ở trên.

3.1 Các lớp

Theo nguyên tắc, các lớp chính là các kiểu dữ liệu do người dùng định nghĩa. Các lớp là nơi mà bạn có thể tạo ra một bản thiết kế cho cấu trúc của các phương thức và thuộc tính. Các đối tượng riêng lẻ được tạo ra từ bản thiết kế này.

Các lớp chứa các trường cho các thuộc tính và các phương thức cho các hành vi. Trong ví dụ về lớp Dog ở trên, các thuộc tính bao gồm name và birthday, trong khi các phương thức là bark() và updateAttendance().

Dưới đây là đoạn code trích dẫn trình bày cách lập trình lớp Dog bằng ngôn ngữ JavaScript.

class Dog {

constructor(name, birthday) {

this.name = name;

this.birthday = birthday;

//Khai báo các biến private

_attendance = 0;

getAge() {

//Getter

return this.calcAge();

calcAge() {

//Tính tuổi bằng ngày và sinh nhật hôm nay

return Date.now() – this.birthday;

bark() {

return console.log(“Woof!”);

updateAttendance() {

//Thêm một ngày vào số ngày tham gia của chú chó tại Trại thú cưng

this._attendance++;

Lớp chính là một khuôn mẫu để tạo ra mô hình một chú chó, và đối tượng được tạo ra từ lớp này đại diện cho một thứ có thực trong thực tế.

3.2 Đối tượng

Đối tượng là các thực thể của các lớp được tạo ra với dữ liệu cụ thể. Ví dụ như trong đoạn code trích dẫn dưới đây thì Rufus là một thực thể của lớp Dog

class Dog {

constructor(name, birthday) {

this.name = name;

this.birthday = birthday;

//Khai báo các biến private

_attendance = 0;

getAge() {

//Getter

return this.calcAge();

calcAge() {

//Tính tuổi bằng ngày và sinh nhật hôm nay

return Date.now() – this.birthday;

bark() {

return console.log(“Woof!”);

updateAttendance() {

//Thêm một ngày vào số ngày tham gia của chú chó tại Trại thú cưng

this._attendance++;

//Tạo một đối tượng mới của lớp Dog và con chó riêng tên là Rufus

const rufus = new Dog(“Rufus”, “2/1/2017”);

Khi một chú lớp Dog đựoc gọi:

  • Một đối tượng mới được tạo ra, có tên là rufus
  • Phương thức khởi tạo sẽ chạy các đối số name và birthday và gán giá trị
Từ vựng lập trình:

Trong lập trình hướng đối tượng với JavaScript, các đối tượng là một loại biến. Điều này có thể dẫn đến một vài nhầm lẫn bởi vì các đối tượng có thể được khai báo mà không cần có mẫu lớp trong JavaScript.

Đối tượng có trạng thái và hành vi. Trạng thái được xác định bởi dữ liệu, chẳng hạn như names, birthday,… Hành vi chính là các phương thức mà đối tượng có thể thực hiện.

3.3 Thuộc tính

Các thuộc tính chính là thông tin được lưu trữ. Các thuộc tính được xác định trong các mẫu Class. Khi các đối tượng được khởi tạo, các đối tượng riêng lẻ chứa dữ liệu được lưu trữ trong các trường Thuộc tính.

Trạng thái của một đối tượng được xác định trong các trường thuộc tính của đối tượng. Ví dụ, một chú chó con và một chú chó trưởng thành sẽ được đối xử khác nhau dù chúng ở chung một trại thú cưng.

Birthday có thể xác định trạng thái của một đối tượng và cho phép phần mềm xử lý theo nhiều cách khác nhau đối với từng chú chó ở các độ tuổi khác nhau

3.4 Phương thức

Các phương thức đại diện cho các hành vi. Các phương thức thực hiện các hành động.

Các phương thức có thể trả về thông tin liên quan đến đối tượng hoặc cập nhật dữ liệu của đối tượng. Mã của phương thức được xác định trong định nghĩa lớp.

Khi các đối tượng riêng lẻ được khởi tạo, những đối tượng này có thể gọi các phương thức được định nghĩa trong lớp.Trong đoạn mã trích dẫn dưới đây, phương thức bark được định nghĩa trong lớp Dog, phương thức bark() được gọi trên đối tượng Rufus.

class Dog {

//Khai báo các trường được bảo vệ (private)

_attendance = 0;

constructor(name, birthday) {

this.namee = name;

this.birthday = birthday;

getAge() {

//Getter

return this.calcAge();

calcAge() {

//Tính tuổi bằng ngày và sinh nhật hôm nay

return this.calcAge();

bark() {

return console.log(“Woof!”);

updateAttendance() {

//Thêm một ngày vào số ngày tham gia của chú chó tại Trại thú cưng

this._attendance++;

Các phương thức thường sửa đổi, cập nhật hoặc xóa dữ liệu. Ví dụ, phương thức bark() không cập nhật bất cứ dữ liệu nào bởi vì barking không sửa đổi bất cứ thuộc tính nào của lớp Dog: name hoặc birthday.

Phương thức updateAttendance() thêm ngày mà Dog được chuyển tới trại nuôi thú cưng. Thuộc tính attendance đóng vai trò quan trọng trong việc theo dõi để giúp chủ sở hữu trang trại tính toán chi phí.

Dấu gạch dưới trong _attendance thể hiện rằng biến này được bảo vệ và không được sửa đổi trực tiếp. Phương thức updateAttendance() được sử dụng để thay đổi _attendance.

Học xong lập trình hướng đối tượng chỉ trong 1 giờ cùng Maria Ozawa | Vũ Nguyễn Coder
Học xong lập trình hướng đối tượng chỉ trong 1 giờ cùng Maria Ozawa | Vũ Nguyễn Coder

Package

Định nghĩa

Một package (gói) trong java là một nhóm các kiểu tương tự của các lớp, giao diện và các package con .

Package trong java có thể được phân loại theo hai hình thức, package được dựng sẵn và package do người dùng định nghĩa.

Có rất nhiều package được dựng sẵn như java, lang, net, io, util, sql, …

Package do người dùng tự định nghĩa

Cú pháp:


package




package


cha>[.


package


con>];




Ví dụ về java package:

package gpcoder; // Package cha package com.gpcoder; // Package gpcode là con của package com

Lợi thế của việc sử dụng package trong java:

  • Package được sử dụng để phân loại lớp và interface giúp dễ dàng bảo trì.
  • Package cung cấp bảo vể truy cập
  • Package khắc phục được việc đặt trùng tên.

Truy cập package từ package khác

Có 3 cách để truy cập package từ package bên ngoài:

  • Khai báo import package.*; tránh sử dụng cách này, không xác định sẽ sử dụng class nào, có thể gặp vấn đề trùng tên lớp nếu cả 2 package import package.* giống nhau. Ví dụ: sử dụng class Date có thể gặp lỗi biên dịch do không thể xác định chính xác sử dụng class Date của package nào nếu import cả 2 package java.util và java.sql.

package com.gpcoder.oop; import java.util.Calendar; import java.util.*; import java.sql.*; import com.gpcoder.service.*; public class PackageDemo { public static void main(String[] args) { java.util.Date d = Calendar.getInstance().getTime(); } }

  • Khai báo import package.ClassName; nên sử dụng cách này để giữ code đơn giản, rõ ràng, tái sử dụng lại nhiều chỗ, hạn chế xung đột về tên.
  • Sử dụng tên đầy đủ: tránh sử dụng cách này, do code trở nên dài dòng nếu package gồm nhiều cấp cha, con.

Ví dụ: một project có package như sau

Class CommonService cung cấp 2 phương thức method1 và method2.

Chúng ta có thể sử dụng method1 từ một class khác ngoài package com.gpcoder.service như sau:

  • Khai báo import com.gpcoder.service.*;


package


com.gpcoder.oop;


import


com.gpcoder.service.*;


public


class


PackageDemo {


public


static


void


main(String[] args) {


CommonService service =


new


CommonService();


service.method1();


} }

  • Khai báo import com.gpcoder.service.CommonService;


package


com.gpcoder.oop;


import


com.gpcoder.service.CommonService;


public


class


PackageDemo {


public


static


void


main(String[] args) {


CommonService service =


new


CommonService();


service.method1();

}

  • Sử dụng tên đầy đủ: import com.gpcoder.service.CommonService;

package com.gpcoder.oop; public class PackageDemo { public static void main(String[] args) { com.gpcoder.service.CommonService service = new com.gpcoder.service.CommonService(); service.method1(); } }

Lưu ý

  • Nếu bạn import một package thì package con của package đó không được import.
  • Thứ tự của chương trình phải là khai báo package -> import -> class.
  • Khi sử dụng một class của package này ở package khác nên sử dụng ở dạng import package.ClassName
  • Mỗi package tương ứng với một thư mục được. Như ví dụ trên thì cấu trúc thư mục ứng với package com.gpcoder.service được tạo ra như sau:

Tính chất trừu tượng (abstract)¶

Tính trừu tượng trong lập trình hướng đối tượng là từ các mô tả, scenario, của chương trình tìm ra các đặc trưng, hành động để trừu tượng hóa thành các đối tượng các class.

Ví dụ viết 1 chương trình nhập thông tin sinh viên gồm họ tên, tuổi, ngày sinh, lớp.\ Từ yêu cầu bài toán ta rút ra được các danh từ: “sinh viên”, “họ tên”, “tuổi”, “ngày sinh”, “lớp” → “sinh viên” là 1 đối tượng, “họ tên”, “tuổi”, “ngày sinh”, “lớp” là các thuộc tính, đặc trưng của “sinh viên” do đó ta trừu tượng hóa thành class: SinhVien

Nếu học Lập Trình lại từ đâu, mình sẽ học như thế nào?
Nếu học Lập Trình lại từ đâu, mình sẽ học như thế nào?

Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Lập trình hướng đối tượng trong Java dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên like và share để ủng hộ Kteam và tác giả nhé!

Đối tượng (object)

Đối tượng là một thực thể có trạng thái và hành vi. Nó có thể mang tính vật lý hoặc logic.

Nếu chúng ta xem xét thực tế chúng ta có thể tìm thấy nhiều đồ vật xung quanh chúng ta: cái bàn, con chó, con người, v.v… Tất cả các đối tượng này đều có thuộc tính và hành vi.

Nếu chúng ta xem xét một con chó, thuộc tính của nó sẽ là – tên, giống, màu sắc, và các hành vi là: sủa, chạy, ăn, … Nếu bạn so sánh các đối tượng trong phần mềm với một đối tượng trong thế giới thực, chúng sẽ có đặc điểm rất giống nhau: thuộc tính đối tượng trong phần mềm được lưu trữ trong trường (field) và hành vi được lưu trữ trong phương thức (method).

Thông điệp “lạnh người” từ cuộc nói chuyện giữa TT Putin & nhà báo Carlson,Tin an ninh thế giới 13/2
Thông điệp “lạnh người” từ cuộc nói chuyện giữa TT Putin & nhà báo Carlson,Tin an ninh thế giới 13/2

Nội dung

Để đọc hiểu bài này, tốt nhất các bạn nên có kiến thức cơ bản về các phần sau:

  • CÁC BIẾN TRONG JAVA.
  • CÁC KIỂU DỮ LIỆU TRONG JAVA.
  • CÁC HẠNG TOÁN TỬ TRONG JAVA
  • CẤU TRÚC RẼ NHÁNH TRONG JAVA
  • VÒNG LẶP WHILE TRONG JAVA
  • VÒNG LẶP FOR TRONG JAVA
  • MẢNG TRONG JAVA
  • VÒNG LẶP FOR-EACH TRONG JAVA
  • VAI TRÒ BREAK, CONTINUE TRONG VÒNG LẶP JAVA
  • SWITCH TRONG JAVA

Bài này chúng ta sẽ tìm hiểu những vấn đề sau:

  • Lập trình hướng đối tượng là gì?
  • Những khái niệm cơ bản của lập trình hướng đối tượng
  • Hướng đối tượng trong Java

Các thành phần của OOP

  • Lớp (class): Là sự trừu tượng hóa của đối tượng. Là khuôn mẫu của một tập hợp các đối tượng có cùng thuộc tính (attributes) và hành vi (methods). Cấu trúc của 1 lớp gồm:

    • Phạm vi truy cập (access modifier): phạm vi truy cập của lớp, của thuộc tính và phương thức. (chẳng hạn: private, protected, default, public)
    • Tên lớp (class name): Mỗi lớp đều có một tên riêng biệt, để phân biệt với các lớp khác trong cùng một phạm vi.



    class

    {}


    • Các thuộc tính (attributes): Mô tả các trường để lưu dữ liệu cho mỗi đối tượng mà lớp đang định nghĩa hay lưu các tham chiếu đến đối tượng của lớp khác.
      Ví dụ 2: ta có 2 lớp đối tượng A và B, giờ ta muốn tham chiếu 1 đối tượng x từ lớp B trong lớp đối tượng A chẳng hạn, và đây những gì được viết trong class A


    public class A{ // Các trường lưu dữ liệu cho mỗi đối tượng: private int y, z; // Tham chiếu đến đối tượng x từ lớp B private B x; }

    • Các phương thức (methods): mỗi phương thức của lớp thực chất là một hàm được viết riêng cho các đối tượng của lớp, và được gọi đến để tác động lên các đối tượng của lớp đó.
      ví dụ 3:


    // Lớp Err public class Err{ // Các thuộc tính private String title; private String mess; // Phương thức public void inputData(String tt, String m){ title = tt; mess = m; } public void output(){ System.out.println("Err " + title + ": " + mess); } } // Hàm main public static void main(String args[]){ // Khai báo, khởi tạo đối tượng Err x = new Err(); // Tác động vào đối tượng x.input("Error 2001", "- Lỗi này tạm thời chưa có nội dung"); x.output(); }

  • Đối tượng (Object): trong lập trình hướng đối tượng, một thực thể được coi là đối tượng khi nó có các thuộc tính và các hành vi.
    Ví dụ 4:

    // Định nghĩa lớp đối tượng Person public class Person{ // khai báo một vài thuộc tính (attributes) private String name; protected String age; double height; // Khai báo các hành vi (methods) public void moving(){ // di chuyển } public void eating(){ //ăn } public void drinking(){ // uống } public void sleeping(){ //ngủ } //... } // Hàm main public static void main(String args[]){ // Khởi tạo một đối tượng thuộc lớp Person Person x = new Person(); // ở đây x chính là 1 đối tượng, có đầy đủ các thuộc tính và hành vi trong lớp Person. }
Thiên long giáng thế,biểu tượng tân niên. Auto Chess S24
Thiên long giáng thế,biểu tượng tân niên. Auto Chess S24

Khái niệm về lập trình hướng đối tượng trong java

Lập trình hướng đối tượng (Object Oriented Programing – OOP) là một phương pháp để thiết kế một chương trình bởi sử dụng các lớp và các đối tượng.

Java là một ngôn ngữ lập trình hướng đối tượng vì vậy nó cũng hỗ trợ các đặc tính của lập trình hướng đối tượng:

  • Đa hình (Polymorphism)
  • Thừa kế (Inheritance)
  • Đóng gói (Encapsulation)
  • Trừu tượng (Abstraction)

Tuyển dụng lập trình viên Java

Hướng đối tượng trong Java

Bản chất Java là ngôn ngữ thuần hướng đối tượng, vì vậy đây là ngôn ngữ bậc cao nên việc học lập trình ngay từ đầu bạn sẽ thấy khó hiểu với những từ khóa class, new,… Đó là lý do Kteam không khuyến khích những bạn mới bắt đầu học lập trình lựa chọn Java.

Bây giờ, Kteam sẽ ví dụ qua cách chuyển đoạn code trên thành đoạn code hướng đối tượng. Các bài sau sẽ giải thích sâu hơn:

Đầu tiên ta sẽ khai báo một lớp là con người, trong con người có những thuộc tính là tên, chiều cao và tuổi: Ta sẽ tạo một file class .java lưu riêng, nếu bạn đang dùng Eclipse hãy dùng cách sau:

Hoặc bạn có thể tạo file class Person.java theo cách truyền thống. Sau đó, khai báo các thuộc tính lớp Person như sau:


public class Person { String name; int age; float height; }

Tiếp theo, ta sẽ tạo một đối tượng từ lớp con người và cung cấp thông tin cho nó: Ta sẽ dùng cú pháp Person a = new Person(); có nghĩa là tạo đối tượng a thuộc lớp con người.

Ta sẽ cung cấp thông tin cho các thuộc tính bằng cú pháp:

<đối tượng>. =


public class HelloWorld { public static void main(String[] args) { Person a = new Person(); a.name = "Chau"; a.age = 21; a.height = 1.7f; System.out.println(a.name); System.out.println(a.height); System.out.println(a.age); } }

Ta sẽ chạy chương trình bằng hỗ trợ Eclipse:

Hoặc với cách truyền thống:

Như vậy, với cách này ta dễ dàng quản lý chương trình hơn vì ta biết rõ thông tin nào thuộc đối tượng nào. Như bạn đối tượng a có tên gì, chiều cao và độ tuổi bao nhiêu; và giả sử có đối tượng b thì khó nhầm lẫn thông tin với đối tượng a được.

#41. [C++]. Lập Trình Hướng Đối Tượng Trong C++ Phần 1 | Nạp Chồng Toán Tử.
#41. [C++]. Lập Trình Hướng Đối Tượng Trong C++ Phần 1 | Nạp Chồng Toán Tử.

Lập trình hướng đối tượng Java OOP là gì?

Lập trình hướng đối tượng Java (OOP Java) là mô hình lập trình dựa trên khái niệm của lớp và đối tượng. Nó được sử dụng để cấu trúc một chương trình phần mềm thành các phần đơn giản, có thể tái sử dụng của các bản thiết kế code (thường được gọi là các lớp).

Những bản thiết kế code này được sử dụng để tạo ra các thực thể riêng lẻ của các đối tượng. Có nhiều ngôn ngữ lập trình hướng đối tượng, bao gồm JavaScript, C++, Java, và Python.

Lớp là một bản thiết kế trừu tượng được sử dụng để tạo ra các đối tượng rõ ràng và cụ thể. Các lớp thường đại diện cho các danh mục tổng quát, chẳng hạn như Car hoặc Dog. Những danh mục này có chung thuộc tính.

Các lớp này xác định các thuộc tính mà một thực thể của loài này có, chẳng hạn như Color. Thế nhưng, chúng không xác định giá trị của các thuộc tính cho một đối tượng cụ thể.

Các lớp cũng có thể chứa các hàm (còn được gọi là phương thức) sẵn có cho các đối tượng thuộc loại đó. Những hàm này được định nghĩa bên trong lớp và thực hiện một số hành động hữu ích cho loại đối tượng cụ thể.

1.1 Ví dụ:

Lớp Car có thể có phương thức repaint làm thay đổi thuộc tính color của ô tô. Hàm này chỉ hữu ích đối với những đối tượng kiểu Car. Do đó, tôi khai báo nó trong lớp Car để biến nó thành một phương thức.

Các mẫu lớp được sử dụng như là một bản thiết kế để tạo ra các đối tượng riêng lẻ. Chúng đại diện cho những ví dụ cụ thể của lớp trừu tượng, chẳng hạn như myCar hoặc goldenRetriever.

Mỗi đối tượng có thể có truyền giá trị duy nhất cho các thuộc tính được xác định trong lớp. Ví dụ, giả sử tôi tạo ra lớp Car để chứa tất cả các thuộc tính mà một chiếc ô tô cần có, bao gồm color, brand, và model.

Sau đó, tôi tiếp tục tạo một thực thể của đối tượng loại Car, myCar để đại diện cho một chiếc xe cụ thể của tôi.

Tiếp đến, tôi có thể đặt giá trị của các thuộc tính được xác định trong lớp này để mô tả chiếc ô tô của tôi mà không làm ảnh hưởng đến những đối tượng khác hoặc các mẫu lớp khác.

Cuối cùng, tôi có thể sử dụng lại lớp này để làm đại diện cho bất kỳ một chiếc ô tô nào khác…

Bản thiết kế lớp được sử dụng để tạo hai đối tượng kiểu Car là myCar và helensCar

1.2 Lợi ích của lập trình hướng đối tượng Java

Dưới đây là 5 lợi ích của lập trình hướng đối tượng trong Java:

  • OOP mô hình hóa những thứ phức tạp dưới dạng cấu trúc đơn giản, có thể tái tạo
  • Có thể tái sử dụng các đối tượng OOP trong Java trên nhiều lập trình
  • Cấp phép cho những hành vi cụ thể dành riêng cho lớp thông qua tính đa hình
  • Dễ dàng gỡ lỗi: các lớp thường chứa tất cả các thông tin được áp dụng cho chúng
  • Bảo mật và bảo vệ thông tin cao nhờ tính đóng gói

Những khái niệm cơ bản của lập trình hướng đối tượng

Đối tượng (Object)

Đối tượng ở đây ta thể hiểu như khái niệm bên ngoài: Con người, Xe máy, Nhà cửa…

Trong một đối tượng sẽ bao gồm 2 thông tin: thuộc tính và phương thức.

  • Thuộc tính: là những thông tin của đối tượng. Ví dụ: con người có họ tên, chiều cao, độ tuổi,…
  • Phương thức: là những thao tác, hành động mà đối tượng đó có thể thực hiện. Ví dụ: con người có những hành động ăn, ngủ, đi lại,…

Lớp (Class)

Lớp chính là định nghĩa của đối tượng, ta sẽ xây dựng lớp để tạo ra những đối tượng khác nhau. Ví dụ như: Bạn Nguyễn Văn A và Lê Văn B đều là con người, mà con người thì đều có tên, tuổi, chiều cao,.. tuy nhiên thông tin lại khác nhau như ngoài tên, bạn A 20 tuổi còn bạn B 22 tuổi. Như vậy con người chính là lớp, Nguyễn Văn A và Lê Văn B là đối tượng.

Chuẩn bị gì cho phỏng vấn thực tập sinh IT
Chuẩn bị gì cho phỏng vấn thực tập sinh IT

Ưu điểm, nhược điểm

5.Ưu điểm

  • Nâng cao hiệu năng phát triển phần mềm, liên quan tới 3 yếu tố trong OOP:

    • Tính Mô – đun: Tách biệt các nhiệm vụ trong quá trình phát triển phần mềm dựa trên các đối tượng cụ thể, hay mỗi đối tượng có một nhiệm vụ riêng.
    • Tính mở rộng: Các đối tượng có thể mở rộng thêm các thuộc tính mới, các hành vi mới trong tương lai.
    • Tính tái sử dụng: Các đối tượng có thể tái sử dụng một ứng dụng hoặc nhiều ứng dụng khác nhau. Nhờ vào các yếu tố trên mà OOP giúp tăng hiệu năng phát triển phần mềm so với lập trình hướng thủ tục truyền thống.
  • Nâng cao khả năng bảo trì phần mềm: Chính nhờ các yếu tố kể trên mà việc bảo trì cũng trở nên dễ dàng hơn, vì thiết kế theo mô-đun nên việc thay đổi một phần của chương trình có thể không làm ảnh hưởng đến những phần còn lại, rất phù hợp với những dự án lớn, đòi việc phải bảo trì và thay đổi nhiều.
  • Phát triển phần mềm nhanh hơn: Nhờ vào tính tái sử dụng mà các phần mềm được phát triển nhanh hơn, OOP thường có thư viện đối tượng phong phú, hay những đối tượng do chính bạn tự định nghĩa, các đoạn code được tối ưu hóa đều có thể được tái sử dụng trong tương lai. => giảm thiểu chi phí phát triển.

5.Nhược điểm

  • Khá phức tạp, có thể khó nhằn cho beginner, bởi nó đòi hỏi sự tư duy dựa trên sự tương tác giữa các đối tượng, do đó chúng ta cần nắm được bản chất: lớp, đối tượng, thuộc tính, phương thức; nắm được 4 tính chất của hướng đối tượng gồm: tính trừu tượng (abstract), tính kế thừa (inheritance), tính đóng gói (encapsulation), tính đa hình (polymorphism).
  • Chương trình có thể chậm và kích thước lớn hơn so với các chương trình lập trình hướng thủ tục. Do các phần mềm này thường yêu cầu nhiều câu lệnh hơn để thực thi, người lập trình cần viết ra nhiều dòng mã hơn để đảm bảo các thuộc tính, phương thức của đối tượng => kích thước chương trình lớn theo.
  • Lập trình hướng đối tượng không phải là chìa khóa vạn năng cho nhiều vấn đề. Theo mình, mỗi một phương pháp lập trình đều có sự phù hợp với mỗi bài toán thực tế nhất định. Chẳng hạn giải phương trình bậc 2, thay vì phải ngồi viết ra đối tượng phương trình bậc 2 (theo OOP), cài đặt các thuộc tính và các phương thức cho nó, trong lập trình hướng chức năng trong 1 file duy nhất, ta chỉ cần viết mỗi một hàm con có chức năng tìm nghiệm nhờ vào việc truyền vào 3 tham số giá trị và cho in nghiệm là xong.

Thế mạnh của OOPs so với ngôn ngữ lập trình hướng thủ tục

1) Lập trình hướng đối tượng giúp việc phát triển và bảo trì dễ dàng hơn. Trong khi phương pháp lập trình hướng thủ tục là không dẽ dàng quản lý khi code lớn.

2) Lập trình hướng đối tượng có tính năng ẩn dấu thông tin, trong khi hướng thủ tục có thể truy cập dữ liệu toàn cục ở bất kỳ nơi nào

3) Lập trình hướng đối tượng cung cấp khả năng mô phỏng sự kiện thực tế hiệu quả hơn.

Lập trình hướng đối tượng trong Java

Lộ trình tự học Java Web để thành back-end developer
Lộ trình tự học Java Web để thành back-end developer

Constructor

Định nghĩa

Constructor trong java là một dạng đặc biệt của phương thức được sử dụng để khởi tạo các đối tượng.

Java Constructor được gọi tại thời điểm tạo đối tượng. Nó khởi tạo các giá trị để cung cấp dữ liệu cho các đối tượng, đó là lý do tại sao nó được gọi là constructor.

Khai báo của Constructor giống với khải báo của method (phương thức). Nó phải có cùng tên với class (lớp) và không có giá trị trả về.

Có 2 kiểu của constructor:

  • Constructor mặc định (không có tham số truyền vào – default constructors).
  • Constructor tham số (parameterized constructors).

Constructor mặc định trong java

Một constructor mà không có tham số được gọi là constructor mặc định. Constructor mặc định được sử dụng để cung cấp các giá trị mặc định cho các thuộc tính như 0, null, false … , tùy thuộc vào kiểu dữ liệu được sử dụng.

Nếu một lớp không khai báo contructor thì trình biên dịch sẽ tự động tạo một constructor mặc định trong lớp đó.

Cú pháp:


(){ // Khởi tạo dữ liệu }

Ví dụ:


package


com.gpcoder.oop;


public


class


JavaDefaultConstructor {


public


JavaDefaultConstructor() {


System.out.println(


"This is default constructor."


);


public


static


void


main(String[] args) {


JavaDefaultConstructor obj =


new


JavaDefaultConstructor();

Kết quả khi chạy chương trình trên:


This is


default


constructor.

Constructor tham số trong java

Một constructor có tham số truyền vào được gọi là constructor tham số. Constructor tham số được sử dụng để cung cấp các giá trị khác nhau cho các đối tượng khác nhau.


(


[,


]){






// Khởi tạo dữ liệu

Ví dụ:


package


com.gpcoder.oop;


public


class


JavaParameterizedConstructor {


private


String website;


public


JavaParameterizedConstructor(String website) {


this


.website = website;


System.out.println(


"This is parameterized constructor"


);


System.out.println(


"from website = "


+ website);


public


static


void


main(String[] args) {


JavaParameterizedConstructor obj =


new


JavaParameterizedConstructor(


"gpcoder.com"


);

Kết quả:


This is parameterized constructor


from website = gpcoder.com

Overloading Constructor trong java

Constructor Overloading là một kỹ thuật trong Java. Bạn có thể tạo nhiều constructor trong cùng một lớp với danh sách tham số truyền vào khác nhau, điều này được gọi là phép đa năng hóa (Overloading). Trình biên dịch phân biệt các constructor này thông qua số lượng và kiểu của các tham số truyền vào.

Ví dụ:


package


com.gpcoder.oop;


public


class


JavaOverloadingConstructors {


private


String website;


private


String subject;


public


JavaOverloadingConstructors(){


System.out.println(


"This is default constructor."


);


public


JavaOverloadingConstructors(String website) {


this


.website = website;


System.out.println(


"This is parameterized constructor"


);


System.out.println(


"from website = "


+ website);


public


JavaOverloadingConstructors(String website, String subject) {


this


.website = website;


this


.subject = subject;


System.out.println(


"This is parameterized constructor"


);


System.out.println(


"from website = "


+ website);


System.out.println(


"with subject = "


+ subject);


public


static


void


main(String[] args){


JavaOverloadingConstructors obj =


new


JavaOverloadingConstructors();


System.out.println(


"---"


);


obj =


new


JavaOverloadingConstructors(


"gpcoder.com"


);


System.out.println(


"---"


);


obj =


new


JavaOverloadingConstructors(


"gpcoder.com"


"OOP"


);

Kết quả:

This is default constructor. — This is parameterized constructor from website = gpcoder.com — This is parameterized constructor from website = gpcoder.com with subject = OOP

Lưu ý

  • Từ khóa this trong java là một biến tham chiếu được sử dụng để tham chiếu tới đối tượng của lớp hiện tại.
  • Từ khóa super trong java là một biến tham chiếu được sử dụng để tham chiếu trực tiếp đến đối tượng của lớp cha gần nhất.

Sự khác nhau giữa constructor và phương thức trong java

Constructor Phương thức
Constructor được sử dụng để khởi tạo trạng thái của một đối tượng. Phương thức được sử dụng để thể hiện hành động của một đối tượng.
Constructor không có kiểu trả về. Phương thức có kiểu trả về.
Trình biên dịch Java tạo ra constructor mặc định nếu bạn không có constructor nào. Phương thức không được tạo ra bởi trình biên dịch Java.
Tên của constructor phải giống tên lớp. Tên phương thức có thể giống hoặc khác tên lớp.

Các tính chất trong OOP

  • OOP nói chung có 4 tính chất, gồm: tính trừu tượng (abstract), tính kế thừa (inheritance), tính đóng gói (encapsulation), tính đa hình (polymorphism).

  • Tính trừu tượng (abstract): abstract có nghĩa là chúng ta đi tổng quát hóa một cái gì đó mà không cần đi vào chi tiết quá vào nó, nhưng người nghe vẫn hiểu được nó là cái gì. Trong OOP thì tính trừu tượng tức là ta đi lựa chọn các thuộc tính và các phương thức cần thiết của đối tượng để giải quyết bài toán. Bởi trong thực tế, một đối tượng có thể có rất nhiều thuộc tính và phương thức, nhưng không liên quan và không cần sử dụng trong bài toán đề ra.

    Ví dụ 5: trong bài toán quản lý mèo, chẳng hạn đối tượng mèo chúng ta chỉ cần khái quát nó thành 1 lớp kiểu:

    public class cat{ // Các thuộc tính private int ID; private String species; // chủng loại private String origin; // Xuất xứ private double weight; // cân nặng // Các phương thức public void input(){ } public void output(){ } }

    Chúng ta không cần thiết phải nhảy vào chi tiết thuộc tính kiểu: số lông, số chân, số ngón chân trên mỗi bàn chân, số tai, số mắt, … hay các phương thức kiểu: ăn, di chuyển, … Nhưng người nghe vẫn hiểu được nó là con mèo là đủ và quan trọng hơn, các thuộc tính phương thức mà chúng ta tạo ra đều có thể được sử dụng đến để giải quyết bài toán quản lý mèo.

  • Tính kế thừa (inheritance): Chỉ đơn giản là chúng ta tái sử dụng lại các thuộc tính, phương thức ở class khác mà không cần phải xây dựng lại từ đầu.

    Ví dụ 6:

    // Định nghĩa lớp TaiKhoan public class TaiKhoan{ protected String ID; protected String name; protected String userName; protected String passWord; protected void input(){ // Triển khai nhập dữ liệu } protected void output(){ // Xuất dữ liệu } } // Định nghĩa lớp tài khoản giáo viên kế thừa lớp tài khoản public class TKGiaoVien extends TaiKhoan { private String specialized; // Chuyên ngành private String qualification; // trình độ chuyên môn // Tái sử dụng phương thức đã có sẵn trong class TaiKhoan @Override public void input(){ super.input(); // Triển khai tiếp nhập dữ liệu cho các thuộc tính trong class TKGiaoVien } @Override public void output(){ super.ouput(); // Triển khai tiếp xuất dữ liệu cho các thuộc tính trong class TKGiaoVien } } // Định nghĩa tiếp lớp tài quản trị viên kế thừa lớp tài khoản cho thấy sức mạnh kế thừa public class TKQTV extends TaiKhoan { private String permission; // Tái sử dụng phương thức đã có sẵn trong class TaiKhoan @Override public void input(){ super.input(); // Triển khai tiếp nhập dữ liệu cho các thuộc tính trong class TKQTV } @Override public void output(){ super.ouput(); // Triển khai tiếp xuất dữ liệu cho các thuộc tính trong class TKQTV } }

    Qua ví dụ trên chúng ta có thể thấy 2 lớp đối tượng TKGiaoVien và TKQTV không cần phải xây dựng lại từ đầu nhưng vẫn chứa đầy đủ các thuộc tính cũng như phương thức cần thiết nhờ vào tính kế thừa.

  • Tính đóng gói (encapsulation): đóng gói ở đây có nghĩa là đóng gói attributes, methods thành class, đóng gói các class thành package, … Nhằm che giấu thông tin và đảm bảo sự toàn vẹn của dữ liệu.

    Ví dụ 7:

    // Định nghĩa lớp Money public class Money{ /* Toàn bộ các thuộc tính để phạm vi truy cập là private, điều này có nghĩa là các thuộc tính này không thể truy cập được bởi các lớp bên ngoài*/ private String donVi; private String menhGia; private String seri; // Khi này để tương tác với các thuộc tính trên, chúng ta sử dụng các hàm setter, getter, public String getDonVi() { return donVi; } public void setDonVi(String donVi) { this.donVi = donVi; } public String getMenhGia() { return menhGia; } public void setMenhGia(String menhGia) { this.menhGia = menhGia; } public String getSeri() { return seri; } public void setSeri(String seri) { this.seri = seri; } }

    Một vài lợi ích nữa trong việc đóng gói là:

    • Chúng ta có thể kiểm soát chỉ đọc hoặc chỉ ghi, hoặc cả ghi cả đọc cho các thuộc tính, tức là chỉ có setters hoặc getters, hoặc có cả setters, getters.
    • Người sử dụng của class không biết được cách các class lưu trữ dữ liệu hay được gọi là sự kiểm soát dữ liệu.
    • Một class có thể thay đổi kiểu dữ liệu của một thuộc tính và người dùng class không cần sự thay đổi trong code.
  • Tính đa hình (polymorphism): chỉ sự đa hình thái, chẳng hạn cùng có một phương thức giống nhau nhưng tùy vào tham số truyền vào hay sự cài đặt của lớp con mà nó thực hiện các công việc khác nhau. Tính đa hình liên quan tới 2 khái niệm là: overriding (ghi đè) và overloading (nạp chồng).

    • overriding (ghi đè) là đi viết lại, định nghĩa lại phương thức mà nó kế thừa từ lớp cha.
      Ví dụ 8:


    // Định nghĩa lớp Animal public class Animal { public void output(){ System.out.println("- Đây là lớp động vật."); } } // Định nghĩa lớp Cat kế thừa lớp Animal public class Cat extends Animal { /* Class Cat kế thừa phương thức output() từ lớp Animal, nhưng phương thức output() trong lớp Cat lại khác so với phương thức output() trong Animal, ta gọi nó là overriding (ghi đè).*/ @Override public void output(){ System.out.println("- Đây là lớp mòe :D."); } }

    • overloading (nạp chồng) sử dụng các phương thức có cùng tên nhưng tham số đầu vào lại khác nhau.
      Ví dụ 9:


    // Định nghĩa lớp Animal public class Animal{ // tạo các phương thức cùng tên nhưng các tham số đầu vào khác nhau public void output(){ System.out.println("- Đây là lớp động vật ăn thịt."); } public void output(int i){ System.out.println("- Đây là lớp động vật ăn cỏ."); } public void output(int i, int j){ System.out.println("- Đây là lớp động vật ăn chay???"); } } // triển khai trong hàm main public static void main(String args[]){ Animal x = new Animal(); x.output(); // kết quả: - Đây là lớp động vật ăn thịt. x.output(1); // kết quả: - Đây là lớp động vật ăn cỏ. x.output(1, 2); // kết quả: - Đây là lớp động vật ăn chay???. }

  • overriding (ghi đè) là đi viết lại, định nghĩa lại phương thức mà nó kế thừa từ lớp cha.
Java 34 . Hiểu rõ phương thức so sánh equals và hascode  | Phần 2 - Lập trình Hướng Đối Tượng
Java 34 . Hiểu rõ phương thức so sánh equals và hascode | Phần 2 – Lập trình Hướng Đối Tượng

Phạm vi truy cập (Access modifier)

Có hai loại modifier trong java: access modifiers và non-access modifiers.

Các access modifiers trong java xác định độ truy cập (Phạm vi) vào dữ liệu của của các trường (field), phương thức (method), cấu tử (constructor) hoặc lớp (class).

Có 4 kiểu của java access modifiers:

  • private
  • (Mặc định)
  • protected
  • public

Và có một vài non-access modifiers chẳng hạn static, abstract, synchronized, native, volatile, transient, v.v.. Trong tài liệu này chúng ta sẽ học về access modifier.

Bảng mô tả tổng quan về cách sử dụng các access modifier:

Access Modifier Truy cập bên trong class? Truy cập bên trong package? Truy cập bên ngoài package bởi class con? Truy cập bên ngoài class và không thuộc class con?
private
Default
protected
public

Tài liệu tham khảo:

  • https://www.javatpoint.com/java-oops-concepts
  • https://www.tutorialspoint.com/java/java_packages.htm

Bài viết gốc được đăng tải tại gpcoder.com

Có thể bạn quan tâm:

  • OOP là gì? Giải thích dễ hiểu về lập trình hướng đối tượng
  • Javascript Prototype là gì?
  • Mẫu bảng mô tả công việc lập trình Java

Xem thêm các việc làm Java hấp dẫn tại TopDev

Diễn giải chi tiết về OOP (Java)

Lập trình hướng đối tượng (Oriented Object Programming – OOP) là gì?

  • Lập trình hướng đối tượng là một mô hình lập trình máy tính dựa trên khái niệm lớp và đối tượng.
  • Lấy đối tượng làm nền tảng để xây dựng giải thuật, xây dựng chương trình và thực hiện xử lý dữ liệu với đối tượng đã định nghĩa đó.
  • Nhằm tối ưu hóa việc quản lý mã nguồn (source code), tái sử dụng mã nguồn, tóm gọn các thủ tục đã biết trước tính chất thông qua việc sử dụng đối tượng.
  • Một đối tượng có thể được định nghĩa là một trường dữ liệu có các thuộc tính và các hành động của riêng nó:Ví dụ 1


// 1 ví dụ đơn giản về định nghĩa lớp đối tượng *phương trình bậc 2* ax^2 + bx + c = 0 trong java: public class PTB2 { // Khai báo các thuộc tính của một phương trình bậc 2 gồm các hệ số thực a, b, c private double a, b, c; // Khai báo các phương thức hay hành động có thể làm của lớp đối tượng này // Tính delta public double delta() { return b * b - 4 * a * c; } // Tìm nghiệm trong tập số thực R và in ra màn hình public void timNo(){ // Tính và lưu giá trị delta vào một biến double dt = delta(); // Xét điều kiện ( bao gồm delta và hệ số a ) và tiến hành tìm nghiệm if(a == 0){ /* Chúng ta chỉ xét nhập vào một phương trình bậc 2 và giải nghiệm chẳng hạn, nên khi người dùng nhập a = 0 chúng ta sẽ hiển thị thông báo như sau. ^^*/ System.out.println("- Phương trình bậc 2 phải có hệ số a khác 0."); } else{ if(dt < 0) System.out.println("- Phương trình vô nghiệm."); else if(dt == 0){ System.out.printf("- Phương trình có nghiệm kép x1 = x2 = %.3f\n", -b / 2 * a); } else{ System.out.println("- Phương trình có 2 nghiệm phân biệt:"); System.out.printf("\tx1 = %.3f\n", (-b + sqrt(dt)) / 2 * a); System.out.printf("\tx2 = %.3f\n", (-b - sqrt(dt)) / 2 * a); } } /* Cùng với đó là các hàm khởi tạo (constructor), hay các setter, getter hoặc chúng ta có thể tự định nghĩa thêm các hành động nhập xuất phù hợp với bài toán yêu cầu*/ public PTB2(double a, double b, double c) { this.a = a; this.b = b; this.c = c; } public double getA() { return a; } public void setA(double a) { this.a = a; } public double getB() { return b; } public void setB(double b) { this.b = b; } public double getC() { return c; } public void setC(double c) { this.c = c; } //... } }

Abstract Class Trong Java quá chi là TRỪU TƯỢNG | Code Thu
Abstract Class Trong Java quá chi là TRỪU TƯỢNG | Code Thu

Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Nội dung bài viết

Khóa học

Lập trình Java cơ bản đến hướng đối tượng

Với mục đích giới thiệu đến mọi người về Ngôn ngữ Java – một ngôn ngữ lập trình khá mới mẻ so với C, C++, Java, PHP ở Việt Nam.

Thông qua khóa học LẬP TRÌNH JAVA CƠ BẢN ĐẾN HƯỚNG ĐỐI TƯỢNG, Kteam sẽ hướng dẫn các bạn kiến thức cơ bản của Java. Để từ đó, có được nền tảng cho phép bạn tiếp tục tìm hiểu những kiến thức tuyệt vời khác của Java hoặc là một ngôn ngữ khác.

Cụ thể trong khóa học này, Kteam sẽ giới thiệu với các bạn Java ở phiên bản Java 8

Đánh giá

Bình luận

mỗi bài học nên làm thêm 1 link bài tập cơ bản về phần đó đi ad ơi

-Cách nhập 1 biến từ bàn phím như thế nào vậy ad?-Theo em biết thì bên C++ thì dùng cin >>, vậy bên java mình làm như thế nào v ạ?

Cách nhập 1 biến từ bàn phím như thế nào vậy ad?Theo em biết thì bên C++ thì dùng cin >>, vậy bên java mình làm như thế nào v ạ?

OOP Trong Java

Các tính chất hướng đối tượng của Java (OOP trong Java)

Lập trình hướng đối tượng có 4 tính chất: tính trừu tượng, tính đóng gói, tính kế thừa, tính đa hình. Java là một ngôn ngữ lập trình hướng đối tượng nên bản thân nó cũng mang 4 tính chất đó.

Tính chất đa hình (polymorphism)¶

Tính đa hình ở đây được hiểu là đa hình thái, ví dụ cùng 1 method nhưng tùy vào tham số truyền vào hoặc cài đặt ở lớp con mà nó thực hiện các phép toán khác nhau.

Để hiểu rõ hơn tính đa hình ta có 2 khái niệm Overriding và Overloading (ghi đè và nạp chồng)

  • Overriding (ghi đè) là viết lại, định nghĩa lại method mà nó thừa kế từ lớp cha

Ví dụ:

public class Person { public void show() { System.out.println(“person show”); } } public class Student extends Person { @Override public void show() { System.out.println(“student show”); } }

class Student thừa kế class Person tức là nó cũng đồng thời thừa kế method show nhưng method show() ở Student lại khác method show() ở Person — ta gọi đó là ghi đè (overriding)

  • Overloading (nạp chồng): là sử dụng các method có tên giống nhau nhưng tham số đầu vào khác nhau:

Ví dụ:

public class Calc { // truyền vào 3 số nguyên thì trả về kết quả là tổng 3 số nguyên public int sum(int number1, int number2, int number3) { return number1 + number2 + number3; } // truyền vào 2 số nguyên thì trả về kết quả là tổng 2 số nguyên public int sum(int number1, int number2) { return number1 + number2; } // truyền vào 2 số thực thì trả về kết quả là tổng 2 số thực public float sum(float number1, float number2) { return number1 + number2; } }

Các tính chất hướng đối tượng của Java (OOP trong Java)¶

References:

Nội dung

Lập trình hướng đối tượng Java (OOP Java) là mô hình lập trình cơ bản mà hầu hết các developer đều từng sử dụng nó ít nhất một lần trong đời. Trong bài viết này, tôi sẽ giới thiệu khái niệm Java OOP là gì và phân tích những điều cơ bản nhất để tạo nên nó.

Phỏng vấn java hiện nay khó vãi, Spring framework version nào ổn nhất, stop phụ thuộc IDE
Phỏng vấn java hiện nay khó vãi, Spring framework version nào ổn nhất, stop phụ thuộc IDE

Lập trình hướng đối tượng là gì?

Trong những bài viết trước đây, chúng ta lập trình bằng cách viết toàn bộ code vào chương trình main duy nhất và chạy, và ta tự định nghĩa các biến theo suy nghĩ cá nhân. Ví dụ như bài học trước đây, ta tự định nghĩa các biến lưu thông tin con người như sau:


public class HelloWorld { public static void main(String[] args) { String name; float height; int age; name = “Chau Kter”; height = 1.7f; age = 21; System.out.println(name); System.out.println(height); System.out.println(age); } }

Như trên, việc định nghĩa biến name, height và age là do cá nhân người viết lúc đó tự định nghĩa ra. Về cốt lõi chương trình, khó mà nhận biết được mối liên quan các biến trên, giả sử trong 1 chương trình có lưu thông tin đến 3-4 người, như vậy ta phải tăng số lượng biến lưu thông tin gấp 3-4 lần, khó mà đảm bảo được biến nào lưu thông tin cho đối tượng nào. Chưa kể, trong một dự án với nhiều người, việc tự định nghĩa lập trình theo cá nhân sẽ ảnh hưởng đến cách làm việc của tập thể.

Việc lập trình như vậy ta cần phải gom lại trực quan hơn, để mô tả trung thực hệ thống. Ta sẽ quy lại thành một đối tượng, như ví dụ trên: Việc các 3 biến name, heigth, age là lưu thông tin của một người, ta sẽ tạo ra một đối tượng là con người và trong đối tượng đó sẽ có thông tin 3 biến trên.

Tính chất kế thừa (inheritance)¶

Tính chất này thì đơn giản hơn, đó là sử dụng lại các thuộc tính, method sẵn có từ các class khác mà không phải xây dựng từ đầu.\ Ví dụ: Ta có class Person với các thuộc tính sau:

public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { if (age < 0) { age = 0; } this.age = age; } }

Bây giờ ta muốn xây dựng 1 class Student cũng có các thuộc tính giống của Person và thêm thuộc tính address thì ta chỉ việc thừa kế lại class Person và thêm thuộc tính address:

public class Student extends Person { private String address; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }

Bí Kíp Sử Dụng Constructor Trong Java Cho PRO | Code Thu
Bí Kíp Sử Dụng Constructor Trong Java Cho PRO | Code Thu

Sự khác nhau giữa lớp và đối tượng trong java

Đối tượng Lớp
Đối tượng là thể hiện của 1 lớp. Lớp là một khuân mẫu hay thiết kế để tạo ra các đối tượng.
Đối tượng là 1 thực thể trong thế giới thực như Con mèo (Cat), con chó (Dog), … Lớp là một nhóm các đối tượng tương tự nhau. Ví dụ: Lớp động vật (Animal).
Đối tượng là 1 thực thể vật lý Lớp là 1 thực thể logic
Đối tượng được tạo ra chủ yếu từ từ khóa new.

Ví dụ: Student s1=new Student();

Lớp được khai báo bằng việc sử dụng từ khóa class.

Ví dụ: class Student{}

Đối tượng có thể được tạo nhiều lần. Lớp được khai báo 1 lần duy nhất.
Đối tượng được cấp bộ nhớ khi nó được tạo ra. Lớp không được cấp bộ nhớ khi nó được tạo ra.
Có rất nhiều cách để tạo ra đối tượng trong java như từ khóa new, phương thức newInstance(), phương thức clone(), phương thức factory và deserialization. Chỉ có một cách để định nghĩa lớp trong java sử dụng từ khoá class.

Lớp (Class)

Chúng ta có thể xem lớp như một khuôn mẫu (template) của đối tượng (Object). Trong đó bao gồm dữ liệu của đối tượng (fields hay properties) và các phương thức(methods) tác động lên thành phần dữ liệu đó gọi là các phương thức của lớp.

Khai báo lớp

Cú pháp:


class


// Khai báo thuộc tính (field) hay biến


// Hàm khởi tạo không có tham số


(){


// Khởi tạo dữ liệu


// Hàm khởi tạo có tham số


(


[,


]){






// Khởi tạo dữ liệu


// Phương thức xử lý (method)



method_1() {



// Logic xử lý


method_2(


) {




// Logic xử lý

Trong đó:

  • class: là từ khóa để khai báo lớp trong Java.
  • Tên lớp: là tên chúng ta đặt cho lớp (quy tắc đặt tên: viết hoa mỗi chữ cái đầu).
  • field_1, field_2: các thuộc tính, các biến, hay các thành phần dữ liệu của lớp (quy tắc đặt tên: chữ cái đầu tiên viết thường, các chữ cái đầu tiên tiếp theo viết hoa).
  • Hàm khởi tạo (constructor): hàm dùng để khởi tạo đối tượng lớp.
  • method_1, method_2: là các phương thức thể hiện các thao tác xử lý, tác động lên các thành phần dữ liệu của lớp.

Ví dụ:

  • Tạo lớp Student.
  • Có 2 thuộc tính id và name.
  • Tạo hàm khởi tạo có tham số là id.
  • Cung cấp 3 phương thức: lấy id, lấy name và gán giá trị name

public class Student { // Khai báo thuộc tính private int id; private String name; // Hàm khởi tạo có 1 tham số là id public Student(int id) { // Sử dụng từ khóa this để truy cập thuộc tính trong lớp // nếu không sử dụng từ khóa this thì đang truy cập vào tham số của hàm khởi tạo this.id = id; } // Cung cấp phương thức lấy giá trị id public int getId() { return id; } // Cung cấp phương thức lấy giá trị name public String getName() { return name; } // Cung cấp phương thức gán giá trị name public void setName(String name) { this.name = name; } }

Lưu ý:

  • Trong ví dụ trên từ khóa this nhằm chỉ đến chính lớp đang được tham chiếu đến. this.name sẽ tham chiếu đến thuộc tính name của class Student.
  • Các phương thức (method) dùng để gán giá trị của một thuộc tính (field) nên bắt đầu là set.
  • Các phương thức (method) dùng để lấy giá trị của một thuộc tính (field) nên bắt đầu là get.

Sử dụng lớp

Cú pháp:


new



(

);





.




.

(

);



Sử dụng từ khóa new để khởi tạo một đối tượng của một lớp.

Ví dụ:

Student student = new Student(1); student.setName(“gpcoder”); System.out.println(“Id=” + student.getId()); System.out.println(“Name=” + student.getName());

Ôn tập lập trình hướng đối tượng Java
Ôn tập lập trình hướng đối tượng Java

Khái niệm về lập trình hướng đối tượng trong java

Lập trình hướng đối tượng (OOP-Object-Oriented Programming) là một phương pháp hay mô hình giúp tăng năng suất, đơn giản hóa việc bảo trì, dễ dàng mở rộng trong thiết kế phần mềm bởi việc cung cấp một vài khái niệm như:

  • Đối tượng (Object)
  • Lớp (Class)
  • Kế thừa (Inheritance)
  • Đa hình (Polymorphism)
  • Trừu tượng (Abstraction)
  • Đóng gói (Encapsulation)

Lập trình hướng đối tượng có 4 tính chất:

Đối tượng (Object)

Tất cả những thực thể có trạng thái và hành vi được biết đến như là một đối tượng. Ví dụ: bàn, ghế, bút chì, xe dạp, ô tô…

Lớp (Class)

Tập hợp các đối tượng được gọi là lớp.

Kế thừa (Inheritance)

Khi một đối tượng được truyền lại tất cả các thuộc tính và phương thức của đối tượng cha được gọi là kế thừa. Kế thừa giúp tái sử dụng lại mã nguồn. Nó được sử dụng cho đa hình lúc runtime.

Tìm hiểu thêm về Tính kế thừa (Inheritance) trong java

Đa hình (Polymorphism)

Khi một nhiệm vụ được thực hiện bởi nhiều cách khác nhau, tính chất này được gọi là đa hình. Ví dụ có nhiều các để thuyết phục các khách hàng khác nhau, để vẽ một cái gì đó như hình tròn, hình chữ nhật, …

Trong java, để áp dụng tính đa hình chúng ta sử dụng phương thức orverloading hoặc overriding.

Tìm hiểu thêm về Tính đa hình (Polymorphism) trong java

Trừu tượng (Abstraction)

Trừu tượng là sự ẩn đi những chi tiết bên trong và hiển thị ra các chức năng, tính chất này gọi là trừu tượng. Ví dụ: khi gọi điện thoại chúng ta không biết xử lý nội bộ thế nào, khi đi xe máy cũng vậy, mà chúng ta chỉ biết đến các chức năng thông qua giao tiếp bên ngoài.

Trong java, chúng ta áp dụng tính chất trừu tượng bằng cách sử dụng abstract class và interface.

Tìm hiểu thêm về lớp abstract trong java và interface trong java.

Đóng gói (Encapsulation)

Việc ràng buộc giữa code và data với nhau tạo thành một khối duy nhất được biết đến là đóng gói. Ví dụ: viên thuốc con nhộng được đóng gói với nhiều loại thuốc bên trong.

Một class trong java là một ví dụ về đóng gói. Java bean là một lớp được đóng gói hoàn toàn vì tất cả các dữ liệu thành viên là private.

Tìm hiểu thêm về Tính đóng gói (Encapsulation) trong java.

Các phạm vi truy cập trong OOP Java

  • OOP Java gồm 4 phạm vi truy cập cho lớp, thuộc tính, phương thức, gồm: private, protected, default, public.

  • Phạm vi private: chỉ cho phép truy cập nội bộ trong class. Tại ví dụ 4, ta thấy rằng, thuộc tính name của class Person để phạm vi truy cập là private, điều này có nghĩa là thuộc tính đó của class Person chỉ truy cập được đến trong class Person mà thôi.

  • Phạm vi protected: là một loại phạm vi cho phép truy cập được từ trong hay cả ngoài package (gói), nếu là ngoài package thì phải thông qua tính kế thừa (inheritance). Cả phạm vi private và protected đều chỉ áp dụng bên trong class như thuộc tính, phương thức, … Không thể áp dụng cho phạm vi truy cập của lớp hoặc interface. Ví dụ nho nhỏ cho protected.


    // Định nghĩa lớp X trong gói a package a; public class X{ protected int x1, x2; protected int plus(){ return x1 + x2; } } // Định nghĩa lớp Y trong gói a package a; public class Y{ public static main(String args[]){ X c = new X(); c.x1 = 1; c.x2 = 2; System.out.print(c.plus()); // Ta có thể thấy rằng chúng ta hoàn toàn truy xuất được đến các thuộc tính hay phương thức có trong X } } // Định nghĩa lớp Z trong gói b package b; public class Z extends a.X { public static main(String args[]){ Z c = new X(); c.x1 = 1; c.x2 = 2; System.out.print(c.plus()); // Khi này để truy xuất được đến các thuộc tính, phương thức trong X ta cần để Z kế thừa X. } }

  • Phạm vi default: là phạm vi mặc định, khi khai báo không cần ghi gì cả ( thuộc tính height trong ví dụ 4), đối với phạm vi default này, thì phạm vi truy cập cho phép chỉ trong cùng package (gói).

  • Phạm vi public: là phạm vi rộng nhất, bất cứ chỗ nào trong project đều có thể truy cập đến được. ( trong ví dụ 4, class Person để phạm vi truy cập là public, vì thế bất kỳ nơi nào trong project đều có thể gọi đến class Person).

30.1 Thuộc tính trong java - lập trình hướng đối tượng java - oop java chi tiết part 1
30.1 Thuộc tính trong java – lập trình hướng đối tượng java – oop java chi tiết part 1

Keywords searched by users: lập trình hướng đối tượng java

Mua Lập Trình Hướng Đối Tượng Java Core Dành Cho Người Mới Bắt Đầu Học Lập  Trình Tại Sách Java | Tiki
Mua Lập Trình Hướng Đối Tượng Java Core Dành Cho Người Mới Bắt Đầu Học Lập Trình Tại Sách Java | Tiki
Lập Trình Hướng Đối Tượng Trong Java | How Kteam
Lập Trình Hướng Đối Tượng Trong Java | How Kteam
Download Miễn Phí Tài Liệu Lập Trình Hướng Đối Tượng Java - Codegym
Download Miễn Phí Tài Liệu Lập Trình Hướng Đối Tượng Java – Codegym
Lập Trình Hướng Đối Tượng (Oops) Trong Java | Topdev
Lập Trình Hướng Đối Tượng (Oops) Trong Java | Topdev
4 Tính Chất Của Lập Trình Hướng Đối Tượng Trong Java - Gp Coder (Lập Trình  Java)
4 Tính Chất Của Lập Trình Hướng Đối Tượng Trong Java – Gp Coder (Lập Trình Java)
Lập Trình Hướng Đối Tượng(Oops) Trong Java - Học Java Miễn Phí Hay Nhất -  Viettuts
Lập Trình Hướng Đối Tượng(Oops) Trong Java – Học Java Miễn Phí Hay Nhất – Viettuts
Lập Trình Hướng Đối Tượng Với Java (Bài 2) - Gia Sư Tin Học
Lập Trình Hướng Đối Tượng Với Java (Bài 2) – Gia Sư Tin Học
Ebook Lập Trình Hướng Đối Tượng Với Java (Pdf) - Technology Diver
Ebook Lập Trình Hướng Đối Tượng Với Java (Pdf) – Technology Diver
Lập Trình Hướng Đối Tượng (Oops) Trong Java | Topdev
Lập Trình Hướng Đối Tượng (Oops) Trong Java | Topdev
Phương Pháp Lập Trình Hướng Đối Tượng Trong Java - Học Với Chuyên Gia
Phương Pháp Lập Trình Hướng Đối Tượng Trong Java – Học Với Chuyên Gia
4 Tính Chất Của Lập Trình Hướng Đối Tượng Trong Java
4 Tính Chất Của Lập Trình Hướng Đối Tượng Trong Java
Lập Trình Hướng Đối Tượng Java – Branium Academy
Lập Trình Hướng Đối Tượng Java – Branium Academy
Lập Trình Hướng Đối Tượng Java Là Gì?
Lập Trình Hướng Đối Tượng Java Là Gì?
Khái Niệm Lập Trình Hướng Đối Tượng Trong Java
Khái Niệm Lập Trình Hướng Đối Tượng Trong Java
4 Tính Chất Của Lập Trình Hướng Đối Tượng Trong Java
4 Tính Chất Của Lập Trình Hướng Đối Tượng Trong Java
Giáo Trình Lập Trình Hướng Đối Tượng Với Java
Giáo Trình Lập Trình Hướng Đối Tượng Với Java
Oop (Lập Trình Hướng Đối Tượng) Là Gì? Các Nguyên Lý Cơ Bản Của Lập Trình  Hướng Đối Tượng
Oop (Lập Trình Hướng Đối Tượng) Là Gì? Các Nguyên Lý Cơ Bản Của Lập Trình Hướng Đối Tượng
Selenium Java] Bài 2: Java Oop Hướng Đối Tượng | Anh Tester
Selenium Java] Bài 2: Java Oop Hướng Đối Tượng | Anh Tester
Lập Trình Hướng Đối Tượng – Wikipedia Tiếng Việt
Lập Trình Hướng Đối Tượng – Wikipedia Tiếng Việt
Lập Trình Hướng Đối Tượng Là Gì? Tìm Hiểu Chi Tiết
Lập Trình Hướng Đối Tượng Là Gì? Tìm Hiểu Chi Tiết
Lập Trình Hướng Đối Tượng Trong Java | How Kteam
Lập Trình Hướng Đối Tượng Trong Java | How Kteam
Tính Trừu Tượng Trong Lập Trình Hướng Đối Tượng (Oop)
Tính Trừu Tượng Trong Lập Trình Hướng Đối Tượng (Oop)
5 Khóa Học Lập Trình Hướng Đối Tượng Miễn Phí
5 Khóa Học Lập Trình Hướng Đối Tượng Miễn Phí
Interface Trong Lập Trình Hướng Đối Tượng Java
Interface Trong Lập Trình Hướng Đối Tượng Java
Mua Java - Hướng Dẫn Cho Người Mới Học Tập 1: Lập Trình Hướng Đối Tượng |  Tiki
Mua Java – Hướng Dẫn Cho Người Mới Học Tập 1: Lập Trình Hướng Đối Tượng | Tiki
Cuốn Sách Lập Trình Hướng Đối Tượng Javacore Và Những Trăn Trở! – Java |Android
Cuốn Sách Lập Trình Hướng Đối Tượng Javacore Và Những Trăn Trở! – Java |Android
Lập Trình Hướng Đối Tượng Là Gì? Tìm Hiểu 4 Tính Chất Oop
Lập Trình Hướng Đối Tượng Là Gì? Tìm Hiểu 4 Tính Chất Oop
Selenium Java] Bài 2: Java Oop Hướng Đối Tượng | Anh Tester
Selenium Java] Bài 2: Java Oop Hướng Đối Tượng | Anh Tester
4 Tính Chất Của Lập Trình Hướng Đối Tượng Trong Java
4 Tính Chất Của Lập Trình Hướng Đối Tượng Trong Java
Seri Tự Học Lập Trình Java Cơ Bản - B4 - 4 Tính Chất Lập Trình Hướng Đối  Tượng Trong Java - Trung Tâm Codefresher - Đào Tạo Lập Trình Thực Chiến
Seri Tự Học Lập Trình Java Cơ Bản – B4 – 4 Tính Chất Lập Trình Hướng Đối Tượng Trong Java – Trung Tâm Codefresher – Đào Tạo Lập Trình Thực Chiến
Lập Trình Hướng Đối Tượng Là Gì? Ưu, Nhược Điểm - Stackjava
Lập Trình Hướng Đối Tượng Là Gì? Ưu, Nhược Điểm – Stackjava
Ngân Hàng Đề Thi Java - Lập Trình Hướng Đối Tượng - Ptitvl
Ngân Hàng Đề Thi Java – Lập Trình Hướng Đối Tượng – Ptitvl
Download] 10 Đầu Sách Lập Trình Hướng Đối Tượng Java Core
Download] 10 Đầu Sách Lập Trình Hướng Đối Tượng Java Core
Lập Trình Hướng Đối Tượng Java - Bạn Đã Thực Sự Hiểu Rõ? - Vntalking
Lập Trình Hướng Đối Tượng Java – Bạn Đã Thực Sự Hiểu Rõ? – Vntalking
Đề Thi Cuối Kỳ Lập Trình Hướng Đối Tượng Ptit (Ae Học Thầy Sơn) - Youtube
Đề Thi Cuối Kỳ Lập Trình Hướng Đối Tượng Ptit (Ae Học Thầy Sơn) – Youtube

See more here: kientrucannam.vn

Leave a Reply

Your email address will not be published. Required fields are marked *