01/10/2018, 08:42

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 ạ

Trần Ngọc Khoa viết 10:48 ngày 01/10/2018

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

Nguyễn Văn Sang viết 10:57 ngày 01/10/2018

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

Nguyễn Văn Sang viết 10:55 ngày 01/10/2018
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

Nguyễn Văn Sang viết 10:53 ngày 01/10/2018

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

Trần Ngọc Khoa viết 10:50 ngày 01/10/2018

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.

Wake Of GOD viết 10:58 ngày 01/10/2018

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

Nguyễn Văn Sang viết 10:46 ngày 01/10/2018

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

Nguyễn Văn Sang viết 10:57 ngày 01/10/2018

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

Trần Hoàn viết 10:51 ngày 01/10/2018

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.

Giang Phan viết 10:43 ngày 01/10/2018

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

GP Coder – 1 Nov 17

Từ khóa this và super trong Java - GP Coder (Lập trình Java)

Hướng dẫn lập trình Java, Design Pattern, Spring, JSF, Primefaces, Collection, Multi-thread, Webservice, SQL, Report, Apache POI.

Giang Phan viết 10:56 ngày 01/10/2018

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.

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

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

Phan Bá Hải viết 10:51 ngày 01/10/2018

Style .NET và Java khác nhau, ngưng đào mộ + gây war
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

cdxf viết 10:48 ngày 01/10/2018

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ỉ ), 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ỉ

Giang Phan viết 10:45 ngày 01/10/2018

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?

Văn Dương viết 10:55 ngày 01/10/2018

Ở 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ừ.

Văn Dương viết 10:43 ngày 01/10/2018

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

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

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.

Có dấu _ và viết hoa chữ cái đầu các từ

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

Constuctor thì đã có old đâu mà new

là sao ta.

Tâm Ninja viết 10:43 ngày 01/10/2018

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

Văn Dương viết 10:52 ngày 01/10/2018

Ví dụ

public struct Size{
    private int _Width; // dấu _ và viết hoa biến private.
    private int _Height; // dấu _ và viết hoa biến private.
    
    public Width{  // public viết hoa chữ cái đầu
        get { return _Width;}
    }
    
    public void ReSize(int width, int height){  // public viết hoa các chữ cái đầu, viết thường với param
        _Width = width;
        _Height = height;
    }
     
    public Size(int width, int height){  // param viết thường toàn bộ
        _Width = width;
        _Height=height;
    }
}
Bài liên quan
0