Bạn đang suy nghĩ sai rồi nha bạn.
Code của bạn cũng hoàn toàn không liên quan gì đến so sánh tham trị tham chiếu gì cả nha bạn.
int data = 50;
void change(int j) {
data = j + 100;
}
data ở đây được hiểu là thuộc tính data của object,
và data = j + 100, vậy nên bạn truyền j = 500 thì thuộc tính data trong object trở thành 600 là chuẩn rồi! OK nha 
int data = 50;
void change(int data) {
data = data + 100;
}
bạn truyền tham số data vào, nhưng mà tham số data này lại trùng tên với thuộc tính data của object, nên khi bạn gán data = …, trình biên dịch không biết bạn muốn nói đến data nào??? Và nó sẽ ưu tiên nghĩ rằng data bạn nhắc đến là tham số. Tức là bạn truyền biến = 500 vào, xong cho biến = 500 + 100, lúc đó biến = 600, thuộc tính data trong object không có gì thay đổi nên nó vẫn như cũ là 50. Vậy nên bạn in ra 50 là đúng rồi hen
(đoạn code thứ 2 này không có ý nghĩa gì, có thể do người viết tut cho bạn viết nhầm)
Bạn phải chỉ rõ cho trình biên dịch biến nào là thuộc tính của object (bằng cách dùng this), biến nào là tham số bạn truyền vô như code dưới đây:
int data = 50;
void change(int data) {
this.data = data + 100;
}