Tại sao khi ko dùng từ khóa this để phân biệt biến toàn cục vs tham số thì máy nó chạy ra đối vs số là 0 còn vs kiểu String là null

mn cho e hỏi là tại sao khi ko dùng từ khóa this để phân biệt biến toàn cục vs tham số thì máy nó chạy ra đối vs số là 0 còn vs kiểu String là null vậy ạ,e b ko dùng this là sai nhưng sao nó chyaj ra vậy thì e ko hiểu,giúp e vs ạ

có ví dụ không bạn .

public class Student10 {
int id;
String name;

Student10(int id, String name) {
    id = id;
    name = name;
}

void display() {
    System.out.println(id + " " + name);
}

public static void main(String args[]) {
    Student10 s1 = new Student10(111, "Viet");
    Student10 s2 = new Student10(222, "Nam");
    s1.display();
    s2.display();
}

}

Output:

0 null
0 null

public class Student11 {
    int id;
    String name;
 
    Student11(int id, String name) {
        this.id = id;
        this.name = name;
    }
 
    void display() {
        System.out.println(id + " " + name);
    }
 
    public static void main(String args[]) {
        Student11 s1 = new Student11(111, "Viet");
        Student11 s2 = new Student11(222, "Name");
        s1.display();
        s2.display();
    }
}

Output:

111 Viet
222 Name

đây bác trần ngọc khoa

Trong class Student11 cũng có chứa biến thành viên int id và String name.
Như vậy khi bạn truyền vào hai tham số cũng có tên và kiểu giống như vậy thì môi trường Java (Java runtime enviroment) sẽ không phân biệt được cái nào là tham số và cái nào là biến thành viên. Con trỏ this dùng để phân biệt điều này.

Bạn nên tham khảo thử:
http://vietjack.com/java/tu_khoa_this_trong_java.jsp

e hiểu r,cảm ơn 2 bác nhiều nhé

thực ra là e đã đọc ở vietjack r,do ko hiểu nên ms hỏi ,

Mình không hiểu mấy bố học ở đâu ra cái kiểu

    Student11(int id, String name) {
        this.id = id;
        this.name = name;
    }

Xây dựng hàm dùng tên tham số khác đi thì chết ai mà cứ sống chết dùng tham số giống thuộc tính để rồi thiếu this cái là “lỗi”. Trong C# mình luôn viết hàm tạo thế này :

Student11(int new_id, String new_name)
{
    id = new_id;
    name = new_name;
}

Có this hay không cũng chẳng ảnh hưởng, mà nếu hàm tạo phức tạp đọc cũng đỡ rối mắt.

1 Like

Bạn thử xem bài viết này:

Bạn cho mình hỏi: bạn học ở đây ra kiểu code như vậy. Chẳng ai code như bạn đâu nhé, mình nghĩ bạn nên học lại lập trình hướng đối tượng.

1 Like

bác thích đào mộ nhỉ.
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/constructors
noz1995 học bên .Net nên theo style đó là bình thường

2 Likes

Style .NET và Java khác nhau, ngưng đào mộ + gây war :laughing:
Ngoài ra còn một vài coding style mà .net và java khác nhau, tiêu biểu là bên .net họ đặt tên Interface với tiền tố I, VD IComparable

1 Like

Dùng chung tên có vài ưu điểm

  1. Các IDE đều hỗ trợ generate constructor,setter từ field, đặt cùng tên là đỡ lằng nhằng và nhanh nhất.
  2. Đỡ phải suy nghĩ tên biến, dễ thống nhất, mName,newName,myName, thisName… code chung team mỗi người 1 kiểu có mà loạn
  3. Dễ xác định arg đang access field nào.
  4. Tránh gây nhiễu, quay lại cái ví dụ này:

Student(int new_id, String new_name)
{
id = new_id;
name = new_name;
}

Khi nhìn vào arg bạn sẽ thấy là new_id, new_name, vậy new là new cái gì, chữ new này đứng ở góc độ class do bạn viết thì có vẻ hợp lý (mà cũng chẳng hợp lý lắm vì đã có old đâu mà có new nhỉ :confused:), nhưng người khác dùng class của bạn thì sẽ rất dễ gây nhầm lẫn + tăng cognitive load (vì chữ new này chả dính dáng gì đến cuộc đời của họ cả)
Trường hợp tệ hơn là:

public Employee(int i, String n,float s)
{
id = i;
name = n;
salary = s;
}

Người ta sẽ chả hiểu i,n,s là cái gì cả trừ phi đọc doc hoặc implement, cách đặt tên biến kiểu này là cực tệ, vi phạm nguyên tắc program to interfaces, not implementation.
// Mà hình như kiểu đặt trùng tên này trong chính stdlib của .NET Core họ vẫn áp dụng suốt mà, có riêng gì Java đâu nhỉ

1 Like

Xin lỗi các bạn nếu mình nói sai. Nhưng bạn Nguyễn Văn Sang hỏi là về this trong java. Bạn Trần Hoàng trả lời như vậy, chẳng khác nào không hiểu this dùng để làm gì. DotNet mình không code nhiều nhưng cách đặt tên biến new_field như vậy có cần thiết không?

Ở chỗ này C# cũng ăn hành như Java.
Vấn đề là cách thức đặt tên không theo quy tắc gì nên bị loạn.

Với mình:
Tham số và biến trong hàm: viết thường.
Private : Có dấu _ và viết hoa chữ cái đầu các từ.

Public : Viết hoa chữ cái đầu các từ.

2 Likes

Constuctor thì đã có old đâu mà new :slight_smile:
Lập account mới thì làm gì có ô new password.

Có thể bạn ấy không hiểu rõ vê this(java/.net). nhưng viết như bạn ấy cũng không có vấn đề gì cả(.net).
Người ta được học như thê thì viết thế là bình thường.

Mấy bác lam trong microsoft hay viết kiểu này này. -.- Nhiều lân đọc code thây hơi khó chịu

là sao ta.

1 Like

Có nghĩa là ở trong cóntructor nghĩa là hàm đầu tiên khởi tạo giá trị cho íntance của object thì làm gì đã có giá trị old mà đặt tên biến có chữ new… LoL

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