01/10/2018, 08:59

Cho em hỏi về hàm clone() trong java với ạ

Cho em hỏi là khi sử dụng hàm clone thì nó tạo ra 1 đối tượng độc lập hoàn toàn với đối tượng ban đầu không ạ. Em có đọc trên mạng thì người ta bảo không , nhưng lúc em test lại thì chưa thấy sự không độc lập giữa chúng.
Code của em ạ:



ai giải đáp thắc mắc này cho em với ạ.
Em cám ơn

Nguyen Ca viết 11:02 ngày 01/10/2018

thể thử trường hơp dưới xem

class Person {
        private int a;

        public void setA(int a) {
            this.a = a;
        }
        public int getA() {
            return a;
        }
        @Override
        public String toString() {
            return String.valueOf(a);
        } 
   } 
public class Test1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Person p1 = new Person();
        Person p2 = new Person();

        ArrayList<Person> list1 = new ArrayList<Person>();
        list1.add(p1);
 
        
        ArrayList<Person> list2 = (ArrayList<Person>) list1.clone();
        //Person vv = list1.get(0);
        //vv.setA(12);
        list2.get(0).setA(13);


        System.out.println("list1: " + list1);
        System.out.println("list2: " +list2);

	}
	
Reoteu Ray viết 11:04 ngày 01/10/2018

mục đích của clone là tạo ra 1 đối tượng độc lập với đối tượng ban đầu , ví dụ như bên c có con trỏ thì con trỏ 1 trỏ đến vùng nhớ 1 , giờ tạo con trỏ 2 trỏ đến vùng nhớ 2 nhưng vùng nhớ này sao chép hoàn toàn dữ liệu từ vùng nhớ 1 sang , để giải quyết cái này người ta có 2 cách deep copy và shadow copy , trong java nó cung cấp 1 interface Cloneable để ta thực hiện việc copy

Reoteu Ray viết 11:12 ngày 01/10/2018

cái này mình thấy 2 cái list đó nó cùng tham chiếu đến 1 vùng nhớ chứ đâu phải clone đâu nhỉ…

Tynk Huynk viết 11:15 ngày 01/10/2018

ArrayList<Person> list2 = (ArrayList<Person>) list1.clone();

Vậy câu lệnh trên không phải clone mà là tham chiếu đến 1 vùng nhớ ạ ??

Nguyen Ca viết 11:01 ngày 01/10/2018

Nó clone cai list nhưng giữ tham chiếu đên element, nhưng nếu em thay Person bằng kiểu Interger, String thì nó sẽ ra ket qua khac

        ArrayList<Integer> l1 = new ArrayList<Integer>();
        l1.add(1);
        ArrayList<Integer> l2 = (ArrayList<Integer>) l1.clone();
        l2.set(0, 2);
        System.out.println("list1: " + l1);
        System.out.println("list2: " +l2);

Do Integer va String điều là immuable.

cái này mình thấy 2 cái list đó nó cùng tham chiếu đến 1 vùng nhớ chứ đâu phải clone đâu nhỉ…

mình đan giải thích cái ý này

làm clone thì nó tạo ra 1 đối tượng độc lập hoàn toàn với đối tượng ban đầu không ạ

ArrayList<Person> list2 = (ArrayList<Person>) list1.clone();
list2.get(0).setA(13);
list1.clear();

va

ArrayList<Person> list2 = (ArrayList<Person>) list1
list2.get(0).setA(13);
list1.clear();

sẽ khác nhau đấy

Bài liên quan
0