nguyên tắc hoạt động của hàm toString() trong java

public class SinhVien_Program {

	public static void main(String[] args) throws Exception {
		
		SinhVien sv1 = new SinhVien(1, "Nguyen van Teo", 5, 6);
		SinhVien sv2 = new SinhVien(2,"Tran van Ti", 6,7);
		SinhVien sv3 = new SinhVien();
		sv3.nhap(); //Hàm nhap() ở trong class SinhVien
		System.out.println(SinhVien.tienDe());
		//System.out.println(sv1 + sv2 + sv3); //báo lỗi ở chỗ sv1 và sv2  (1)
		System.out.println(sv1.toString() + sv2.toString() + sv3); //ok    (2)
	}

}

(1) Tại sao nó lại báo lỗi ở chỗ sv1 và sv2 còn sv3 thì không?
(2)Đã sửa lỗi được nhưng em không hiểu tại sao sv1 và sv2 phải .toString() còn sv3 thì không cần

Mọi class trong java được tạo ra mặc định kế thừa class Object.

sv3 sử dụng super.toString(), còn sv1 và sv2 sử dụng SinhVien.toString().
Nên class SinhVien cần viết lại method toString().

Nó báo lỗi gì vậy bạn?

nè anh @CuongNguyen :grinning:

Theo mình thì vấn đề ở đây không phải là hàm toString() nhé.

  • Biểu thức + không dùng được cho 2 Object là kiểu SinhVien, chỉ dùng cho cộng 2 chuỗi String, nếu 1 trong biến là String thì cái còn lại sẽ tự động Cast sang kiểu String:
  • Cơ chết Auto Casting dùng cho String + Object, lúc này Object sẽ gọi hàm toString().
    Ví dụ: Biểu thức “ABC” + sv1 sẽ thành “ABC” + sv1.toString()
    -> đó là sại tao không báo lỗi ở s3

Trong trường hợp của bạn:
System.out.println(sv1 + sv2 + sv3); -> lỗi vì sv1 + sv2 là Object + Object
System.out.println("" + sv1 + sv2 + sv3); -> không lỗi
vì thứ tự sẽ như sau: (("" + sv1) + sv2) + sv3: mỗi lân + đều là String + Object

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