Nhân bản trong Java là gì và các loại của nó?



Bài viết này về Nhân bản trong Java sẽ cung cấp cho bạn những hiểu biết chi tiết về quá trình Nhân bản và các loại nhân bản khác nhau được Java hỗ trợ.

Trong khi lập trình, chúng ta thường gặp các tình huống cần sử dụng lại một đoạn mã hoàn chỉnh. Viết lại mã làm cho chương trình trở nên cồng kềnh, đồng thời làm giảm hiệu quả của chương trình. Do đó, Java cung cấp cho chúng ta một tính năng tuyệt vời giúp giải cứu khỏi nhiệm vụ nặng nề này. Điều này được gọi là Nhân bản trong Java và thông qua phương tiện của bài viết này, tôi sẽ cung cấp cho bạn những hiểu biết đầy đủ về nó.

Dưới đây là các chủ đề tôi sẽ thảo luận trong bài viết này:





Nhân bản trong Java

Nhân bản đối tượng trong Java là quá trình tạo một bản sao chính xác của đối tượng gốc. Nói cách khác, nó là một cách tạo một đối tượng mới bằng cách sao chép tất cả dữ liệu và thuộc tính từ đối tượng ban đầu. Điều này chỉ có thể thực hiện được bằng cách triển khai phương thức clone () của java.lang.Object lớp học. Phương thức nhân bản tạo ra một bản sao chính xác của một đối tượng mà nó đã từng làđược gọi theo thứ tự gán từng trường và sẽ trả về tham chiếu đối tượng mới . Một điều mà bạn phải nhớ, trong Java, các đối tượng triển khai giao diện bản sao là giao diện đánh dấu được phép sử dụng clone ().

Bây giờ bạn đã biết về những gì đang sao chép trong Java, hãy cùng xem những lợi ích khác nhau của việc sử dụng tính năng này.



Ưu điểm của nhân bản trong Java

Dưới đây tôi đã liệt kê một số tính năng hấp dẫn nhất của việc sử dụng nhân bản trong Java.

mảng đối tượng ví dụ java
  • Giúp giảm bớt các dòng mã.
  • Cách sao chép hiệu quả và hiệu quả nhấtcác đối tượng.
  • Ngoài ra, clone () được coi là phương pháp nhanh nhất để sao chép một mảng.

Lưu ý: Mặc dù việc sử dụng nhân bản có thể dẫn đến một số vấn đề về thiết kế nhưng nếu bạn sử dụng nó một cách có chiến lược phù hợp thì nó có thể mang lại lợi ích cho bạn.

Các loại sao chép trong Java

Nhân bản trong Java có thể được nhóm lạithành hai loại:



  1. Nhân bản nông
  2. Nhân bản sâu

Chúng ta hãy hiểu từng người một.

Nhân bản nông

Trong Java, khi quá trình nhân bản được thực hiện bằng cách gọi phương thức clone (), nó được gọi là Shallow Cloning. Đây là quá trình sao chép mặc định trong Java, nơi một bản sao nông của đối tượng gốc sẽ được tạo với trường chính xác. Trong trường hợp đối tượng gốc có tham chiếu đến một số đối tượng khác dưới dạng trường, thì chỉ các tham chiếu của đối tượng đó sẽ được nhân bản thay vì tạo đối tượng mới. Nói cách khác, nếu bạn thay đổi giá trị của các đối tượng được nhân bản thì nó cũng sẽ được phản ánh trong bản gốc. Như vậy, nhân bản nông là phụ thuộc vào đối tượng ban đầu.

bản sao cạn - Nhân bản trong Java - EdurekaDưới đây tôi đã đưa ra ví dụ tương tự:

package edureka class EduCourse {String course1 String course2 String course3 public EduCourse (String crs1, String crs2, String crs3) {this.course1 = crs1 this.course2 = crs2 this.course3 = crs3}} class EduLearner triển khai Cloneable {int eduId String learningnerName EduCourse eduCourse public EduLearner (int eduId, String learningnerName, EduCourse eduCourse) {this.eduId = eduId this.learnerName = learningName this.eduCourse = eduCourse} // Phiên bản mặc định của phương thức clone () được bảo vệ Object clone () ném CloneNotSupportedException {return super .clone ()}} public class ShallowCloneSample {public static void main (String [] args) {EduCourse j2ee = new EduCourse ('Java', 'Spring', 'Microservices') EduLearner Learner1 = new EduLearner (2811, 'Max' , j2ee) EduLearner learningner2 = null try {// Tạo bản sao của người học1 và gán nó cho người học2 người học2 = (EduLearner) người học1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // In chi tiết về người học1 System.out.p rintln ('Chi tiết về Người học 2:') System.out.println ('Id:' + Learner1.eduId) System.out.println ('Tên:' + Learner1.learnerName) System.out.println ('Id Khóa học: '+ Learner1.eduCourse) // In tất cả các khóa học của' Learner1 'System.out.println (' Các Khóa học của Người học 1: ') System.out.println (Learner1.eduCourse.course1) System.out.println (Người học1. eduCourse.course2) System.out.println (Learner1.eduCourse.course3) // In chi tiết của Learner2 System.out.println ('Chi tiết về Người học 2:') System.out.println ('Id:' + Learner2.eduId ) System.out.println ('Tên:' + Learner2.learnerName) System.out.println ('Mã khóa học:' + learningner2.eduCourse) // In tất cả các khóa học của 'người học2' System.out.println ('Các khóa học của Người học 2: ') System.out.println (Learner2.eduCourse.course1) System.out.println (Learner2.eduCourse.course2) System.out.println (Learner2.eduCourse.course3) // Thay đổi khóa học3 của' Learner2 'learningner2.eduCourse.course3 =' JSP '// Thay đổi này sẽ được phản ánh trong bản gốc' Learner1 'System.out.println (' Các khóa học cập nhật dành cho người học 2: ') System.out.println (Learner1.eduCourse.course1) System.out.println (Learner1.eduCourse.course2) System.out.println (Learner1.eduCourse.course3)}}

Đầu ra:

Thông tin chi tiết về người học 2: Id: 2811 Tên: Mã khóa học tối đa: EduCourse @ 15db9742 Các khóa học của người học 1: Java Spring Microservices Chi tiết về người học 2: Id: 2811 Tên: Mã khóa học tối đa: EduCourse @ 15db9742 Các khóa học của người học 2: Java Spring Microservices Các khóa học cập nhật cho người học 2: Java Spring JSP

Nhân bản sâu trong Java

Trong Java, khi quá trình nhân bản được thực hiện bằng cách triển khai giao diện Cloneable, nó được gọi là Deep Cloning. Trong kiểu sao chép này, một bản sao chính xác của tất cả các trường của đối tượng gốc sẽ được tạo. Nhưng trong trường hợp, đối tượng gốc có tham chiếu đến các đối tượng khác dưới dạng trường thì một bản sao của các đối tượng đó cũng sẽ được tạo bằng cách gọi phương thức clone (). Điều này làm cho đối tượng nhân bản độc lập với đối tượng gốc và mọi thay đổi được thực hiện trong bất kỳ đối tượng nào sẽ không được phản ánh trên đối tượng kia.

python __init__ method

Dưới đây tôi đã đưa ra ví dụ tương tự:

package edureka class EduCourse triển khai Cloneable {String course1 String course2 String course3 public EduCourse (String crs1, String crs2, String crs3) {this.course1 = crs1 this.course2 = crs2 this.course3 = crs3} protected Object clone () ném CloneNotSupportedException { return super.clone ()}} lớp EduLearner thực hiện Cloneable {int eduId String learningnerName EduCourse eduCourse public EduLearner (int eduId, String learningName, EduCourse eduCourse) {this.eduId = eduId this.learnerName = LearnerName this.eduCourse} // eduCourse} Ghi đè phương thức clone () để tạo bản sao sâu của một đối tượng được bảo vệ Object clone () ném CloneNotSupportedException {EduLearner learning = (EduLearner) super.clone () learningner.eduCourse = (EduCourse) eduCourse.clone () return learning}} lớp công khai DeepCloneSample {public static void main (String [] args) {EduCourse j2ee = new EduCourse ('Java', 'Spring', 'Microservices') EduLearner Learner1 = new EduLearner (2811, 'Max', j2ee) EduLearner học er2 = null try {// Tạo bản sao của người học1 và gán cho người học2 người học2 = (EduLearner) người học1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // In chi tiết của người học1 System.out. println ('Chi tiết về Người học 2:') System.out.println ('Id:' + Learner1.eduId) System.out.println ('Tên:' + Learner1.learnerName) System.out.println ('Id Khóa học: '+ Learner1.eduCourse) // In tất cả các khóa học của' Learner1 'System.out.println (' Các Khóa học của Người học 1: ') System.out.println (Learner1.eduCourse.course1) System.out.println (Người học1. eduCourse.course2) System.out.println (Learner1.eduCourse.course3) // In chi tiết của Learner2 System.out.println ('Chi tiết về Người học 2:') System.out.println ('Id:' + Learner2.eduId ) System.out.println ('Tên:' + Learner2.learnerName) System.out.println ('Mã khóa học:' + learningner2.eduCourse) // In tất cả các khóa học của 'người học2' System.out.println ('Các khóa học của Người học 2: ') System.out.println (Learner2.eduCourse.course1) System.out.printl n (Learner2.eduCourse.course2) System.out.println (Learner2.eduCourse.course3) // Thay đổi khóa học3 của 'learningner2' learningner2.eduCourse.course3 = 'JSP' // Thay đổi này sẽ không được phản ánh trong bản gốc ' learningner1 'System.out.println (' Các khóa học của Người học 1: ') System.out.println (Learner1.eduCourse.course1) System.out.println (Learner1.eduCourse.course2) System.out.println (Learner1.eduCourse. course3) // Các khóa học được cập nhật của người học2 System.out.println ('Các khóa học của người học 2:') System.out.println (Learner2.eduCourse.course1) System.out.println (Learner2.eduCourse.course2) System.out. println (Learner2.eduCourse.course3)}}

Đầu ra:

Thông tin chi tiết về người học 2: Id: 2811 Tên: Mã khóa học tối đa: edureka.EduCourse@15db9742 Các khóa học của người học 1: Java Spring Microservices Chi tiết về người học 2: Id: 2811 Tên: Mã khóa học tối đa: edureka.EduCourse@6d06d69c Các khóa học của người học 2 : Các khóa học Java Spring Microservices dành cho người học 1: Các khóa học Java Spring Microservices cho người học 2: Java Spring JSP

Đến đây chúng ta sẽ kết thúc bài viết này về Nhân bản trong Java. Nếu bạn muốn biết thêm về Java, bạn có thể tham khảo .

Bây giờ bạn đã hiểu Nhân bản trong Java là gì, hãy xem của Edureka, một công ty học trực tuyến đáng tin cậy với mạng lưới hơn 250.000 người học hài lòng trải dài trên toàn cầu. Khóa đào tạo và cấp chứng chỉ về Java J2EE và SOA của Edureka được thiết kế cho sinh viên và các chuyên gia muốn trở thành Nhà phát triển Java. Khóa học được thiết kế để cung cấp cho bạn khởi đầu về lập trình Java và đào tạo bạn về cả khái niệm Java cốt lõi và nâng cao cùng với các khung Java khác nhau như Hibernate & Spring.

Có một câu hỏi cho chúng tôi? Vui lòng đề cập đến nó trong phần nhận xét của bài viết “Nhân bản trong Java” này và chúng tôi sẽ liên hệ lại với bạn trong thời gian sớm nhất.