JavaRush /Blog Java /Random-VI /Khái niệm lập trình hướng đối tượng JAVA
shabnahm
Mức độ

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

Xuất bản trong nhóm
JAVA dựa trên các khái niệm về lập trình hướng đối tượng, cho phép bạn chuyển sang mức độ trừu tượng cao hơn để giải quyết mọi vấn đề một cách thực tế. Cách tiếp cận hướng đối tượng khái niệm hóa giải pháp cho một vấn đề dưới dạng các đối tượng trong thế giới thực dễ dàng tái sử dụng hơn trong ứng dụng. Ví dụ: Chair(ghế), Fan(quạt), Dog(Chó), Computer(máy tính), v.v. Trong JAVA, lớp là một bố cục, mẫu hoặc nguyên mẫu xác định hành vi chung của một đối tượng thuộc một loại nhất định. Một thể hiện là một triển khai riêng biệt của một lớp và tất cả các thể hiện của một lớp đều có cùng các thuộc tính được mô tả trong định nghĩa lớp. Ví dụ: bạn có thể định nghĩa một lớp có tên Nhà với số phòng làm thuộc tính và tạo các thể hiện của lớp đó chẳng hạn như nhà hai phòng, nhà ba phòng, v.v. Khái niệm lập trình hướng đối tượng JAVA - 1Ưu điểm: Dưới đây là một số ưu điểm của việc phát triển phần mềm hướng đối tượng.
  • Giảm chi phí hỗ trợ phần mềm, chủ yếu là do nó được thực hiện theo mô-đun.
  • Cải thiện việc tái sử dụng mã thông qua các tính năng như kế thừa, giúp phát triển phần mềm nhanh hơn.
  • Tăng độ tin cậy và tính linh hoạt của mã.
  • Dễ hiểu do mô phỏng thế giới thực.
  • Trừu tượng tốt hơn ở cấp độ đối tượng.
  • Giảm sự phức tạp của quá trình chuyển đổi từ giai đoạn phát triển này sang giai đoạn phát triển khác.
Có bốn đặc điểm chính của OOP:
  • Đóng gói
  • Di sản
  • Đa hình
  • Trừu tượng

Đóng gói

Đóng gói hoạt động như một hợp đồng cho một đối tượng những gì nó nên ẩn và những gì nó sẽ mở để các đối tượng khác truy cập. Trong JAVA, chúng tôi sử dụng công cụ sửa đổi truy cập privateđể ẩn một phương thức và hạn chế quyền truy cập vào một biến từ thế giới bên ngoài. JAVA cũng có nhiều công cụ sửa đổi truy cập khác nhau: public, mặc định, protected, privateđược sử dụng để hạn chế khả năng hiển thị ở các cấp độ khác nhau. Nhưng mục tiêu cuối cùng là gói gọn những thứ không nên thay đổi. Cách tiếp cận hiệu quả nhất là một lớp chỉ nên có một lý do để thay đổi và việc đóng gói làm cho thiết kế của “một lý do” đó trở thành hiện thực. Cách tiếp cận đúng đắn để đóng gói là ẩn đi những thứ thay đổi thường xuyên để tránh làm hỏng các lớp khác. Lợi ích: Dưới đây là một số lợi ích của việc đóng gói:
  • Chúng ta có thể bảo vệ trạng thái bên trong của một đối tượng bằng cách ẩn các thuộc tính của nó.
  • Điều này cải thiện tính mô đun mã vì nó ngăn các đối tượng tương tác theo những cách không mong muốn.
  • Cải thiện khả năng sử dụng mã.
  • Điều này hỗ trợ mối quan hệ hợp đồng của một thực thể cụ thể.
  • Đóng gói làm cho phần mềm dễ bảo trì hơn.
  • Các thay đổi đối với mã có thể được thực hiện độc lập với nhau.

Đa hình

Tính đa hình trong lập trình là khả năng cung cấp cùng một giao diện cho các dạng cơ bản (kiểu dữ liệu) khác nhau. Điều này có nghĩa là các lớp có chức năng khác nhau sẽ chia sẻ cùng một giao diện và có thể được gọi động bằng cách truyền tham số theo tham chiếu. Một ví dụ cổ điển là lớp Shape(hình) và tất cả các lớp kế thừa từ nó: square(hình vuông), circle(hình tròn), dodecahedron(khối mười hai mặt), irregular polygon(đa giác không đều), splat(blob), v.v. Trong ví dụ này, mỗi lớp sẽ có phương thức riêng Draw()và mã máy khách có thể thực hiện một cách đơn giản:
Shape shape = new Shape();
Shape.area()để có được hành vi chính xác của bất kỳ hình dạng nào Vẻ đẹp của đa hình là mã, làm việc với các lớp khác nhau, không cần biết nó đang sử dụng lớp nào, vì tất cả chúng đều hoạt động theo cùng một nguyên tắc. Quá trình được các ngôn ngữ lập trình hướng đối tượng sử dụng để triển khai tính đa hình động được gọi là liên kết động. Lưu ý: Đa hình là khả năng chọn các phương thức cụ thể hơn để thực hiện tùy thuộc vào đối tượng. Đa hình xảy ra khi các lớp trừu tượng không được tham gia. Thuận lợi:
  • Tạo mã có thể tái sử dụng Nghĩa là, khi một lớp được tạo, triển khai và thử nghiệm, nó có thể được sử dụng tự do mà không cần lo lắng về chính xác những gì được viết trong đó.
  • Điều này cho phép mã chung hơn và được ghép nối lỏng lẻo hơn.
  • Thời gian biên dịch được giảm bớt, giúp tăng tốc độ phát triển.
  • Liên kết động.
  • Giao diện tương tự có thể được sử dụng để tạo các phương thức với các cách triển khai khác nhau.
  • Toàn bộ việc thực hiện có thể được thay thế bằng cách sử dụng các chữ ký phương thức tương tự.
Ghi đè phương thức như một phần của đa hình. Một ghi đè tương tác với hai phương thức: một phương thức trong lớp cha và một phương thức trong lớp dẫn xuất. Các phương thức này có cùng tên và chữ ký. Ghi đè cho phép bạn thực hiện cùng một thao tác theo những cách khác nhau cho các loại đối tượng khác nhau. Ví dụ:
while(it.hasNext()) {
Shape s = (Shape) it.next();
totalArea += s.area(dim); //будет применен полиморфизм и вызван нужный метод для каждого an object.
}
Khái niệm lập trình hướng đối tượng JAVA - 2Quá tải phương thức hoặc đa hình ad-hoc hoặc đa hình tĩnh Quá tải tương tác với nhiều phương thức của cùng một lớp có tên giống hệt nhau nhưng có chữ ký phương thức khác nhau. Việc tải lại cho phép bạn mô tả cùng một thao tác theo những cách khác nhau cho các dữ liệu khác nhau. Đôi khi nó được gọi là đa hình tĩnh, nhưng thực tế nó không phải là đa hình. Điều này không gì khác hơn là chỉ đơn giản là có hai phương thức có cùng tên nhưng có danh sách đối số khác nhau. Việc khởi động lại không liên quan gì đến tính kế thừa và tính đa hình. Và một phương thức quá tải hoàn toàn không giống với một phương thức bị ghi đè. Đa hình tham số thông qua tạo trong JAVA Khi khai báo một lớp, trường tên có thể được liên kết với các loại khác nhau và tên phương thức có thể được liên kết với các tham số và kiểu trả về khác nhau. JAVA hỗ trợ đa hình tham số bằng cách sử dụng generics.
List<String> list = new ArrayList<String>();
Tại sao chúng ta không thể ghi đè phương thức tĩnh trong JAVA? Việc ghi đè phụ thuộc vào sự tồn tại của một thể hiện của lớp. Ý tưởng của tính đa hình là bạn có thể tạo một lớp con và các đối tượng được các lớp con đó triển khai sẽ hoạt động khác nhau với cùng các phương thức của lớp cha (được ghi đè trong các lớp con). Một phương thức tĩnh không được liên kết với bất kỳ phiên bản nào của lớp, do đó, khái niệm ghi đè chính nó không thể được áp dụng. Những người tạo ra JAVA được hướng dẫn bởi hai cân nhắc đã ảnh hưởng đến cách tiếp cận này. Đầu tiên, có các vấn đề về thực thi mã: có rất nhiều lời chỉ trích về việc Smalltalk hoạt động chậm (việc thu gom rác và tính đa hình là một phần của vấn đề này) và JAVA được thiết kế để tránh điều này. Việc cân nhắc thứ hai là quyết định đối tượng mục tiêu của JAVA sẽ là các nhà phát triển C++. Việc các phương thức tĩnh hoạt động theo cách này rất quen thuộc với các lập trình viên C++ và cũng tăng tốc mọi thứ vì không cần phải đi lên phân cấp lớp để tìm ra phương thức nào sẽ gọi. Bạn đi thẳng vào lớp và gọi một phương thức cụ thể.

Di sản

Kế thừa là hành động kết hợp hành vi (tức là các phương thức) và trạng thái (tức là các biến) của một lớp cơ sở vào một lớp dẫn xuất để chúng có sẵn trong lớp dẫn xuất đó. Ưu điểm chính của kế thừa là nó cung cấp cơ chế chính thức để tái sử dụng mã và tránh trùng lặp. Lớp kế thừa mở rộng chức năng của ứng dụng bằng cách sao chép hành vi của lớp cha và thêm chức năng mới. Điều này làm cho mã có tính kết hợp cao. Nếu muốn thay đổi siêu lớp, bạn sẽ phải biết tất cả các chi tiết của các lớp con để không làm hỏng mã. Kế thừa là một hình thức tái sử dụng phần mềm trong đó một lớp mới (lớp con) được tạo từ một lớp (siêu lớp) hiện có để mở rộng chức năng của nó và sử dụng một số thuộc tính của lớp cha. Vì vậy nếu bạn có lớp cha và sau đó lớp con xuất hiện thì lớp con đó sẽ kế thừa tất cả những gì mà lớp cha có. Thuận lợi:
  • Cải thiện việc tái sử dụng mã.
  • Mối quan hệ logic “is a” (là ai đó, cái gì đó) được thiết lập. Ví dụ: Chó là một con vật . (Con chó là một con vật).
  • Mô-đun hóa mã.
  • Sự lặp lại được loại trừ.
Lỗ hổng:
  • Liên kết chặt chẽ: Một lớp con phụ thuộc vào việc triển khai lớp cha, làm cho mã được liên kết chặt chẽ.

Trừu tượng

Trừu tượng hóa có nghĩa là thiết kế các lớp dựa trên giao diện và chức năng của chúng mà không tính đến các chi tiết triển khai. Một lớp trừu tượng đại diện cho các giao diện mà không bao gồm việc triển khai thực tế. Nó phân biệt việc thực hiện một đối tượng với hành vi của nó. Tính trừu tượng giúp đơn giản hóa mã bằng cách ẩn các chi tiết không quan trọng. Thuận lợi:
  • Bằng cách sử dụng tính trừu tượng, chúng ta có thể tách ra những gì có thể được nhóm thành một số loại.
  • Các thuộc tính và phương thức được sửa đổi thường xuyên có thể được nhóm thành một loại riêng biệt, do đó loại chính sẽ không bị thay đổi. Điều này củng cố nguyên tắc OOP: “Mã phải được mở cho Tiện ích mở rộng nhưng phải đóng cho Thay đổi ” .
  • Tính trừu tượng đơn giản hóa việc biểu diễn các mô hình miền.
Sự khác biệt giữa trừu tượng hóa và đóng gói Đóng gói là một chiến lược được sử dụng như một phần của trừu tượng hóa. Đóng gói đề cập đến cấu trúc của một đối tượng: các đối tượng đóng gói các thuộc tính của chúng và ẩn chúng khỏi sự truy cập từ bên ngoài. Người dùng của một lớp tương tác với nó bằng các phương thức của nó nhưng không có quyền truy cập trực tiếp vào cấu trúc lớp. Bằng cách này, lớp tóm tắt các chi tiết triển khai liên quan đến thiết kế của nó. Trừu tượng là một thuật ngữ tổng quát hơn. Nó cũng có thể đạt được bằng cách sử dụng các lớp con. Ví dụ: một lớp List(danh sách) trong thư viện chuẩn là một sự trừu tượng hóa cho một chuỗi các phần tử, được lập chỉ mục theo vị trí của chúng trong danh sách. Ví dụ cụ thể của danh sách ListArrayListhoặc LinkedList. Mã tương tác với một danh sách Listsẽ tóm tắt chi tiết về danh sách mà nó sử dụng. Thông thường, việc trừu tượng hóa là không thể nếu không ẩn trạng thái cơ bản bằng cách sử dụng tính năng đóng gói. Nếu một lớp bộc lộ cấu trúc bên trong của nó, nó không thể thay đổi các hoạt động bên trong của nó và do đó không thể trừu tượng hóa được. Lớp trừu tượng và phương thức trừu tượng là gì? Điều này xảy ra là trong quá trình phát triển, bạn muốn một lớp cơ sở chỉ cung cấp giao diện cho các lớp dẫn xuất của nó. Tức là bạn không muốn bất kỳ ai tạo các thể hiện của lớp cơ sở. Bạn cần sử dụng giao diện theo cách mà bạn chỉ truyền các đối tượng tới nó (đây là một kiểu truyền ẩn cho phép hành vi đa hình). Điều này đạt được bằng cách làm cho lớp này trở nên trừu tượng bằng cách sử dụng từ khóa abstract. Điều này đặt ra một số hạn chế, chẳng hạn như không thể tạo các thể hiện của một lớp trừu tượng; khi sử dụng một lớp trừu tượng, cần phải triển khai các phương thức trừu tượng. Điều này đảm bảo tính đa hình. Một lớp trừu tượng có thể chứa cả phương thức trừu tượng và cụ thể. Nếu ít nhất một phương thức trong một lớp được khai báo là trừu tượng thì toàn bộ lớp đó cũng phải được khai báo là trừu tượng. Tuy nhiên, quy tắc theo hướng ngược lại không nhất thiết phải được tuân theo. Nếu một lớp được khai báo là trừu tượng thì nó có thể không chứa các phương thức trừu tượng. Một phương thức chỉ xác định chữ ký của nó và không cung cấp cách triển khai được gọi là trừu tượng. Việc triển khai thực tế của nó được giao cho các lớp con của nó, lớp này mở rộng lớp trừu tượng. Một phương thức trừu tượng không thể được sử dụng bởi một đối tượng, chỉ một lớp khác mới có thể mở rộng nó. Khi nào bạn nên sử dụng lớp trừu tượng? Các lớp trừu tượng cho phép bạn xác định một số hành vi mặc định và có các lớp con cung cấp bất kỳ hành vi cụ thể nào. Ví dụ: List(danh sách) là một giao diện, lần lượt AbstractListxác định hành vi cơ bản của Danh sách, có thể được sử dụng nguyên trạng hoặc được tinh chỉnh trong một lớp con, ví dụ: trong ArrayList(mảng danh sách). Giao diện là gì? Khái niệm về giao diện là một lớp trừu tượng, nhưng giao diện (được xác định bởi từ khóa interface) còn tiến thêm một bước nữa. Nó ngăn chặn bất kỳ việc thực hiện một phương thức hoặc chức năng nào cả. Bạn chỉ có thể khai báo một phương thức hoặc hàm chứ không thể cung cấp cách triển khai nó. Lớp triển khai giao diện phải đảm nhiệm việc triển khai thực tế. Các giao diện rất hữu ích và được sử dụng rộng rãi trong OOP. Vì chúng chia sẻ giao diện và cách triển khai nên chúng mang lại nhiều lợi ích khi sử dụng:
  1. Đa kế thừa .
  2. Khớp nối lỏng lẻo . Có một sự trừu tượng hóa của hoạt động, chẳng hạn như phân lớp và việc triển khai cụ thể có thể là bất cứ điều gì: JDBC, JPA, JTA, v.v.
  3. Chương trình giao diện không được thực hiện .
  4. Đa hình liên kết động : Giao diện lập trình của một đối tượng được hiển thị mà không tiết lộ cách triển khai thực tế của nó.
  5. Mức độ trừu tượng , tách biệt chức năng.
Sự khác biệt giữa giao diện và lớp trừu tượng
  • Giao diện là mối quan hệ hợp đồng với các lớp triển khai giao diện này, nêu rõ rằng việc triển khai diễn ra theo cách được chỉ định bởi giao diện. Đây là một shell trống với các phương thức được khai báo.
  • Một lớp trừu tượng định nghĩa một số hành vi chung và yêu cầu các lớp con của nó xác định hành vi không điển hình hoặc cụ thể cho lớp của chúng.
  • Các phương thức và thành viên của một lớp trừu tượng có thể được chỉ định bằng bất kỳ công cụ sửa đổi truy cập nào; lần lượt, tất cả các phương thức giao diện phải ở chế độ công khai.
  • Khi kế thừa một lớp trừu tượng, lớp con cháu phải định nghĩa các phương thức trừu tượng, trong khi một giao diện có thể kế thừa một giao diện khác mà không nhất thiết phải xác định các phương thức của nó.
  • Một lớp con chỉ có thể mở rộng một lớp trừu tượng, nhưng một giao diện có thể mở rộng hoặc một lớp có thể triển khai nhiều giao diện khác.
  • Lớp con có thể định nghĩa các phương thức trừu tượng với cùng một công cụ sửa đổi truy cập hạn chế hoặc ít hạn chế hơn, nhưng lớp triển khai giao diện phải xác định các phương thức có cùng mức độ hiển thị.
  • Một giao diện không chứa các hàm tạo, trong khi một lớp trừu tượng thì có.
  • Các biến được khai báo trong giao diện Java theo mặc định là biến cuối cùng. Một lớp trừu tượng có thể chứa các biến không phải là cuối cùng.
  • Tất cả các thành viên của giao diện Java đều là public. Các thành viên của một lớp trừu tượng có thể đủ khả năng public, protectedv.v.

Thành phần

Việc tái sử dụng mã có thể đạt được bằng cách sử dụng cả tính kế thừa và thành phần. Nhưng việc sử dụng thành phần sẽ cung cấp mức độ đóng gói cao hơn so với tính kế thừa, vì những thay đổi đối với lớp back-end sẽ không nhất thiết ảnh hưởng đến mã thuộc về lớp front-end. Thành phần là một kỹ thuật thiết kế sử dụng các mối quan hệ “has-a” (có, bao gồm) trong các lớp. Cả tính kế thừa java và thành phần đối tượng đều có thể được sử dụng để sử dụng lại mã. Bản chất của bố cục là thể hiện mối quan hệ “có” giữa các đối tượng. Hãy nghĩ về một chiếc ghế. Ghế có chỗ ngồi. Ghế có tựa lưng. Một chiếc ghế có một số chân nhất định. Cụm từ “has a” gợi ý mối quan hệ trong đó chiếc ghế có, hoặc ít nhất là sử dụng, một đồ vật khác. Đây chính xác là mối quan hệ “has-a”, là cơ sở của bố cục. Thuận lợi:
  • Kiểm soát tầm nhìn
  • Việc thực hiện có thể được thay thế vào thời gian chạy
  • Khớp nối lỏng lẻo, vì lớp giao diện không phụ thuộc vào việc triển khai.
Sự khác biệt giữa thành phần và kế thừa
KHÔNG. Thành phần (có một / có) Kế thừa (là một/là)
1 Hỗ trợ đa hình và tái sử dụng mã. Hỗ trợ đa hình và tái sử dụng mã.
2 Đối tượng thời gian chạy đã được tạo. Đối tượng được tạo động vào thời gian biên dịch.
3 Việc thực hiện có thể được thay thế trong thời gian chạy. Việc thực hiện có thể được thay đổi tại thời điểm biên dịch.
4 Một lớp con độc lập với lớp cha của nó, lớp này thiên về sự ghép nối lỏng lẻo (đặc biệt là dưới sự điều khiển giao diện). Lớp con phụ thuộc vào việc triển khai lớp cha, do đó tính ràng buộc được coi là mạnh.
5 Sử dụng: Nhà có phòng tắm. Thật sai lầm khi nói rằng Nhà là Phòng tắm. Kế thừa là một chiều: Ngôi nhà là một tòa nhà. Nhưng tòa nhà không phải là một ngôi nhà.
Lưu ý: Không sử dụng tính kế thừa chỉ để đảm bảo sử dụng lại mã. Nếu không có mối quan hệ “is a” (is), bố cục sẽ được sử dụng cho những mục đích này. Sự khác biệt giữa thành phần và tập hợp là ở mối quan hệ đối tượng. Tập hợp là một mối quan hệ trong đó một lớp phù hợp với một bộ sưu tập. Nó là một phần của toàn bộ mối quan hệ, trong đó bộ phận có thể tồn tại mà không cần toàn bộ. Những mối quan hệ như vậy yếu hơn nhiều. Không có sự phụ thuộc theo chu kỳ. Ví dụ: đơn hàng và sản phẩm. Thành phần là một mối quan hệ trong đó một lớp phù hợp với một bộ sưu tập. Đây là một phần của toàn bộ mối quan hệ, trong đó bộ phận không thể tồn tại nếu không có tổng thể. Nếu tổng thể bị phá hủy thì tất cả các thành phần của nó cũng sẽ bị phá hủy. Đó là một mối quan hệ mạnh mẽ hơn. Ví dụ: một đa giác và các đỉnh của nó, một thứ tự và thành phần của nó.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION