Vòng lặp enhanced for loop có được sử dụng với object?

mọi người cho mình hỏi, vòng lặp kiểu enhanced for loop có dùng được khi mỗi thành phần là 1 đối tượng do mình tạo ra không ạ, ví dụ mình có tạo ra class Nguoi và code theo mẫu dưới nhưng dùng vòng lặp này để in ra thì ko được

import java.util.*;

public class Test {
    public static void main(String[] args) {
        List<Nguoi> people=new ArrayList<>();
        Nguoi p=new Nguoi();
        for(int i=0;i<2;i++){
            p.nhap(); people.add(p);
        }
        for(Nguoi x: people) System.out.println(x.hoten);
    }
}

enhanced for có thể dùng được kể cả object user-defined.
Bạn không in ra được có lẽ là hàm nhập của bạn có vấn đề

Không được đâu!?
Là được, nhưng chỉ in có 1 (MỘT) người duy nhất. Tức là hoten giống nhau và giống phần tử nhập cuối cùng.

Lỗi do bạn viết sai, khai báo sai thôi.

3 Likes

đây là hàm nhập của mình ạ, không biết nó sai chỗ nào nhỉ

public class Nguoi {
    protected String hoten;
    protected String CMND;

    public void nhap() {
        Scanner key = new Scanner(System.in);
        System.out.println("nhap ho ten: ");
        hoten = key.nextLine();
        System.out.println("nhap CMND: ");
        CMND = key.nextLine();
    }

    public void xuat() {
        System.out.println(" ho ten: " + hoten);
        System.out.println(" CMND: " + CMND);
    }
}

Bạn không sai ở hàm nhập, mà sai ở khối nhập

Nguoi p=new Nguoi();
for(int i=0;i<2;i++){
    p.nhap(); people.add(p);
}

Nguyên nhân là vì, nếu bạn không tạo mới, p trong list luôn là p ban đầu (biến p trỏ đến một đối tượng duy nhất), dẫn đến mọi thao tác p.nhap() đều là tác động đến đối tượng đó, và trong List có 2 phần tử thì thực ra là p chiếm 2 slot của List mà thôi.

Sửa thành

for(int i=0;i<2;i++){
    Nguoi p=new Nguoi();
    p.nhap(); people.add(p);
}
5 Likes

Mình hiểu rồi. cảm ơn c nhiều nha

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?