Học lập trình hướng đối tượng Java (OOP Java)
24/09/2024
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ó.
1. 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…
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
Tìm hiểu các chương trình Bootcamp chuẩn quốc tế?
2. 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.
3. 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.
4. 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().
Bạn đã sẵn sàng đổi thay sự nghiệp chưa?
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!”
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.
5. 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.
Các chia sẻ của cựu học viên Onschool Bootcamp?
Danh mục bài viết
- Kiến thức lập trình
- Cộng đồng học viên
- Chia sẻ học viên